消除AttributeError:'tuple'对象没有属性'focus_set'(Python 2.7)

时间:2016-04-06 19:12:55

标签: python-2.7 user-interface tkinter tk popupwindow

使用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”行,我不会收到此错误。但是,我仍然需要从弹出框中返回变量。为什么会这样?

1 个答案:

答案 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