2017-07-19 5 views
-3

ライブラリ管理システムのプログラムを作成しようとしています。私はtkinterモジュールを使用しています。私は以下のコードを書いているが、私は複数のテキストボックスを作成しようとしているときにエラーが発生している。以下は Tkinterモジュールエラーcalssページのログインページを作成するエラー

File "Hope_work.py", line 22, in __init__ 
    frame = F(container, self) 
    File "Hope_work.py", line 62, in __init__ 
    pwd_lable.pack() 
UnboundLocalError: local variable 'pwd_lable' referenced before assignment 

は、私はPageOneクラスのエラーを取得しています完全なプログラムである

import tkinter as tk 
import os 
LARGE_FONT= ("Verdana", 12) 
class Myprogramapp(tk.Tk): 
    def __init__(self, *args, **kwargs): 

     tk.Tk.__init__(self, *args, **kwargs) 
     container = tk.Frame(self) 
     container.pack(side="top", fill="both", expand = True) 
     container.grid_rowconfigure(0, weight=1) 
     container.grid_columnconfigure(0, weight=1) 
     self.frames = {} 
     for F in (StartPage, PageOne): 
      frame = F(container, self) 
      self.frames[F] = frame 

      frame.grid(row=0, column=0, sticky="nsew") 
     self.show_frame(StartPage) 
def show_frame(self, cont): 
     frame = self.frames[cont] 
     frame.tkraise() 
class StartPage(tk.Frame): 
    def __init__(self, parent, controller): 
     tk.Frame.__init__(self,parent) 
     label = tk.Label(self, text="Library Managment System", font=LARGE_FONT) 
     label.pack(pady=10,padx=10) 
     button = tk.Button(self, text="Admin Login", 
             command=lambda: controller.show_frame(PageOne)) 
     button.pack() 
     button1 = tk.Button(self, text="Lib Login") 
     button1.pack() 
class PageOne(tk.Frame): 
    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     name_label = tk.Label(self, text="User ID : ") 
     pwd_label = tk.Label(self.name_lable, text="Password:") 
     name_label.pack(pady=10,padx=10) 
     pwd_lable.pack(pady=10,padx=10) 
     name_lable = tk.Entry(self) 
     pwd_lable = tk.Entry(self, show="*") 
     name_lable.pack() 
     pwd_lable.pack() 
     button1 = tk.Button(self, text="Login") 
     button1.pack() 
if __name__ == "__main__": 
    app = Myprogramapp() 
    app.mainloop() 

**

+0

ここにはいくつかの問題があります。ラベル名のスペルがスペルミスのために一致しない場合は、フレームまたはルートウィンドウの代わりに別のウィジェットに割り当てられた 'pwd_label'を作成しています。あなたのクラスは奇妙な方法で設定されており、私は彼らがこのように動作するとは思わない。 1つのクラスにすべてを配置してみてください。あなたが作業する/更新するウィジェットは、 'self.'プリフィックスを使ってクラス属性として設定する必要があります。 –

+0

あなたが投稿したコードは、あなたが言っているエラーは生じません。 –

+0

@SierraMountainTech:コードの設計はhttp://stackoverflow.com/questions/7546050から直接的または間接的に行われました。残念ながら、誰かがそれを理解せずにコピーし、それを使ってビデオチュートリアルを作成しましたが、それを適切に説明していないので、多くの初心者がこれを開始テンプレートとして使用しています。 _sigh_ –

答えて

0

あなたがいわばかむことができるよりも多くをオフに噛まないようにしようとしているように思われますこのコード例で説明します。このようなもっと複雑なものに移動する前に、理解しておく必要のあるtkinterの部分を使用するのは間違いです。

このように複数のクラスを使用する前に、tkinterの仕組みとそのウィジェットをすべて1つのクラスに適切に実装する方法を理解することに焦点を当てます。あなたがここでやるしようとしているよう

あなたは別のウィジェットにウィジェットを割り当てない:

pwd_label = tk.Label(self.name_lable, text="Password:") 

これは、問題は、あなたのトラックバック中に審判です。ラベルウイジェットをルートウィンドウ、フレーム、またはトップレベルのいずれかに割り当てる必要があります。

インデントがきれいではなく、def show_frame()メソッドがMyprogramappクラスの内部にないため、質問に貼り付けた方法が正確であれば、コードは機能しません。

ここでは何も理由なくosをインポートしていますが、現在使用していないライブラリをインポートすることはお勧めできません。

プログラムの重要な部分を入力フィールドのようなクラス属性にする必要があります。あなたがそのフィールドにパスワードを入れて、get()メソッド内の入力フィールドからの文字列を試してみると、それはクラス属性ではありません。ウィジェット名に接頭辞self.を追加することでこれを修正できます。

これらの変更を行った後、2つのボタンでtkinterウィンドウが表示されます。 Admin Loginボタンにログイン画面が表示されます。クラス、メソッド、および属性の仕組みや使い方を確実に理解するまでは、tkinterを学んだりクラスを離れたり、ひとつのクラスで作業したりする必要があります。

関連する問題