0

これで壁に頭をぶつけていました。Tkinter のロープを取得しただけで、チュートリアルに従って基本を取得し、現在は自分のものを実装するために取り組んでいます。私が行っているいくつかの作業のクエリ インターフェイスを作成します。画面上に 3 つのリスト ボックスがあり、ボタン クリックで 3 つすべてから選択を取得する必要があるため、クエリを生成してデータを表示できます。

mapLBox私が受け取っているエラーは、スコープの問題を示して、それが見えないと言っているようです。コードを単純なものに変更してprint self.mapLBox.get(Tkinter.ACTIVE)も、同じ属性エラーがスローされます。すべてのボックスとスクロールバーが画面に正しく描画され、誤った行 (#90) がコメント化されているため、問題なく動作します。

以下のすべてのコードが属し、DB でクエリを実行して結果を返す2 つのクラスsimpleApp_tk( PasteBin ) があります。dbtools

エラー:

Exception in Tkinter callback
Traceback (most recent call last):
    File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1473, in __call__
         return self.func(*args)
    File "test.py", line 90, in OnButtonClick
         self.labelVar.set(self.mapLBox.get(self.mapLBox.curselection()[0]))
    File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1829, in __getattr__
         return getattr(self.tk, attr)
AttributeError: mapLBox

私のinitialiseメソッド(から実行__init__)内で、リストとボタンが作成されます:

button = Tkinter.Button(self,text=u"Click Me",command=self.OnButtonClick)
button.grid(column=1,row=0)

# Make a scrollbar for the maps list
scrollbar2 = Tkinter.Scrollbar(self,orient=Tkinter.VERTICAL)
scrollbar2.grid(column=2,row=2,sticky='EW')

# Create list of maps
mapLBox = Tkinter.Listbox(self,selectmode=Tkinter.SINGLE,exportselection=0, yscrollcommand=scrollbar2.set)
scrollbar2.config(command=mapLBox.yview)
mapLBox.grid(column=2,row=2,sticky='EW')

# Populate map list
nameList = self.db.getMapNameList()
IDList = self.db.getMapIDList()
for count, name in enumerate(nameList):
    nameFormat = str(IDList[count][0])+': '+name[0]
        mapLBox.insert(Tkinter.END,nameFormat)

self.grid_columnconfigure(0,weight=1) # Allow resizing of window
self.resizable(True,True) # Contrain to only horizontal
self.update()
self.geometry(self.geometry())

OnButtonClick私のボタンに添付された方法:

def OnButtonClick(self):
    self.labelVar.set(self.mapLBox.get(self.mapLBox.curselection()[0]))
    return
4

1 に答える 1

1

アクセスしself.mapLBoxていますが、定義していませんself.mapLBox。名前付き変数を作成したからといっmapLBoxて、それが自動的にオブジェクトの属性になるわけではありません。

これを変更する必要があります:

mapLBox = Tkinter.Listbox(...)

...これに:

self.mapLBox = Tkinter.Listbox(...)

...そしてもちろん、参照する他の場所を変更しますmapLBox

于 2013-05-30T10:50:35.373 に答える