2016-06-27 7 views
0

私が取り組んでいる組み込みハードウェアシステムの設定ファイルを読み込んで解析するプログラムで作業しています。私はこのファイルを読み書きするための簡単なGUIを作るためにtkinterとpythonを使用しようとしています。ファイルI/Oがあり、解析がほとんど機能していますが、すべての部分をGUIに統合するのに問題があります。私は、デバイスの情報を読んで、入力フィールドに関連情報を入力したいと思います。私がいる問題は、私は、私はApplicationクラスの外に置く場合、私はそれが機能を見つけるために取得することができ、エラーTkinterボタンがコールバックコマンドを見つけることができません

"in initUI 
opnBut = Button(butFrm, text="Open", command=openCfg) 
NameError: name 'openCfg' is not defined" 

を得続けるが、その後、私は内部のフィールドを参照する方法を見つけ出すことはできませんです私はそれらを更新するために作ったウィンドウ。

ご協力いただければ幸いです。私のコードセグメントは以下に含まれています。

class Application(Frame): 
    def openCfg(): 
    name = getNameFromFile() 
    nameEntry.insert(0, name) 



    def __init__(self, parent): 
     Frame.__init__(self, parent) 

     self.parent = parent 
     self.initUI() 


    def initUI(self): 
     self.parent.title("Config Reader") 
     self.pack(fill=BOTH, expand=True) 

     nameFrm = Frame(self) 
     nameFrm.pack(fill=X) 

     nameLbl = Label(nameFrm, text="Device Name",width=20) 
     nameLbl.pack(side=LEFT,padx=5, pady=5) 
     nameEntry = Entry(nameFrm) 
     nameEntry.pack(fill=X, padx=5, pady=5) 

     butFrm = Frame(self) 
     butFrm.pack(fill=X) 
     opnBut = Button(butFrm, text="Open Cfg", command=openCfg) 
     opnBut.pack(fill=X, padx=5,pady=5) 

root = Tk() 
root.geometry("600x600") 

app = Application(root) 
app.mainloop() 
+1

インデントが正しく – Li357

+1

私はあなたが 'self.openCfg'が、意味を考える(アンドリューが言ったように)、これは本当にそれであれば、あなたのコードがIndentationErrorをスローしていました。 – zondo

答えて

2

クラスの名前空間で定義されている項目は、クラスにバインドされています。この場合、あなたはカップルのオプションを持っている...

1つのオプションは、あなたがそれstaticmethod作ることができるということです。そして、

class Application(Frame): 
    @staticmethod 
    def openCfg(): 
     name = getNameFromFile() 
     nameEntry.insert(0, name) 

としてボタンをバインドします。しかし

opnBut = Button(butFrm, text="Open Cfg", command=self.openCfg) 

、静的メソッドはほとんど必要ありません。この場合、私はクラスの外にopenCfgの定義を移動し、そのまま他のすべてを保つことがあります

def openCfg(): 
    name = getNameFromFile() 
    nameEntry.insert(0, name) 

class Application(Frame): 
    ... 

を二表情で、これはおそらくまだnameEntryためNameErrorが表示されます。おそらく、最初のクラスのメソッドをお勧めします:

class Application(Frame): 
    def openCfg(self): 
     name = getNameFromFile() 
     self.nameEntry.insert(0, name) 

そしてもちろん、あなたがnameEntryを作成するとき、あなたはそれApplicationクラスのメンバーにする必要があります。

... 
self.nameEntry = Entry(nameFrm) 
self.nameEntry.pack(fill=X, padx=5, pady=5) 
... 
関連する問題