Eliminating AttributeError: 'tuple' object has no attribute 'focus_set' (Python 2.7)

Eliminating AttributeError: 'tuple' object has no attribute 'focus_set' (Python 2.7)

使用 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

在弹出框中输入任何内容之前,出现错误;完整的堆栈跟踪如图所示(分成几行,所以它不仅仅是一堆文本):

Exception in Tkinter callback

Traceback (most recent call last):

File "C:\Users\ajpung\AppData\Local\Continuum\Anaconda2\lib\lib-tk\Tkinter.py", line 1536, in call return self.func(*args)

File "directory/ThingFinder.py", line 547, in fetch_data thing1 = MyDialog(root)

File "C:\Users\ajpung\AppData\Local\Continuum\Anaconda2\lib\lib-tk\tkSimpleDialog.py", line 81, in init self.initial_focus.focus_set()

AttributeError: 'tuple' object has no attributeattribute 'focus_set'

如果我注释掉 "return thing1, thing2" 行,我不会收到此错误。但是,我仍然需要 return 弹出框中的变量。为什么会这样?

body 方法应该 return 应该给予焦点的小部件。这就是为什么你得到你得到的错误:tkinter 试图将焦点放在应该是小部件的东西上,而不是元组。在你的情况下,你可能想要 return 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