使用Python 2.7,我使用Tkinter构建了一个GUI。在我的GUI上,我有一个按钮来打开输入弹出框。对弹出框的调用是:
if analysistype == 'Line of sight':
d = MyDialog(root)
并将弹出框构造为:
class MyDialog(tkSimpleDialog.Dialog):
def body(self, master):
Label(master, text="Things").grid(row=0, columnspan=2)
Label(master, text="Thing 1").grid(row=1)
Label(master, text="Thing 2").grid(row=2)
self.t1 = Entry(master)
self.t2 = Entry(master)
thing1 = self.t1.grid(row=1, column=1)
thing2 = self.t2.grid(row=2, column=1)
return thing1, thing2
在弹出框中输入任何内容之前,我收到错误;完整堆栈跟踪如图所示(分成行,因此它不仅仅是文本的混搭):
Tkinter回调中的异常
追踪(最近一次呼叫最后一次):
文件“C:\ Users \ ajpung \ AppData \ Local \ Continuum \ Anaconda2 \ lib \ lib-tk \ Tkinter.py”,第1536行,调用 return self.func(* args)
fetch_data中的文件“directory / ThingFinder.py”,第547行 thing1 = MyDialog(root)
文件“C:\ Users \ ajpung \ AppData \ Local \ Continuum \ Anaconda2 \ lib \ lib-tk \ tkSimpleDialog.py”,第81行, init self.initial_focus.focus_set()
AttributeError:'tuple'对象没有attributeattribute'focus_set'
如果我注释掉“return thing1,thing2”行,我不会收到此错误。但是,我仍然需要从弹出框中返回变量。为什么会这样?
答案 0 :(得分:1)
body
方法应该返回应该给予焦点的窗口小部件。这就是你得到错误的原因:tkinter试图将焦点放在应该是一个小部件上,而是一个元组。在您的情况下,您可能想要返回self.t1
为了能够获得对话框的值,您需要定义方法apply
,该方法应将值保存到self.result
。然后,您可以在解除对话框时查询结果。
d = MyDialog(root)
root.wait_window(d.top)
print("the value is %s" % d.result)
这里有一个更完整的例子:http://effbot.org/tkinterbook/tkinter-dialog-windows.htm