用这个把我的头靠在墙上。刚刚获得Tkinter的绳索,按照教程获得基础知识,现在正在努力实现我自己的东西。我正在为我正在做的一些工作创建一个查询界面。我在屏幕上有三个列表框,我需要在按钮点击时从所有三个中选择,这样我就可以生成一个查询并显示一些数据。
我收到的错误似乎表示它看不到mapLBox
,表示范围问题。如果我将代码更改为像print self.mapLBox.get(Tkinter.ACTIVE)
这样的简单代码,它仍会抛出相同的属性错误。所有框和滚动条都正确地绘制到屏幕上,并且错误的行(#90)被注释掉,它运行正常。
有两个类,simpleApp_tk
(PasteBin),以下所有代码都属于,dbtools
在DB上运行查询并返回结果。
错误:
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
答案 0 :(得分:1)
您正在访问self.mapLBox
,但未定义self.mapLBox
。仅仅因为您创建名为mapLBox
的变量并不意味着它自动成为对象的属性。
你需要改变这个:
mapLBox = Tkinter.Listbox(...)
......对此:
self.mapLBox = Tkinter.Listbox(...)
...当然,请更改您引用mapLBox
的其他地方。