【问题标题】:Eliminating AttributeError: 'tuple' object has no attribute 'focus_set' (Python 2.7)消除 AttributeError: 'tuple' 对象没有属性 'focus_set' (Python 2.7)
【发布时间】:2016-07-27 09:36:23
【问题描述】:

使用 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 回调异常

Traceback(最近一次调用最后一次):

调用中的文件“C:\Users\ajpung\AppData\Local\Continuum\Anaconda2\lib\lib-tk\Tkinter.py”,第 1536 行 返回 self.func(*args)

文件“directory/ThingFinder.py”,第 547 行,在 fetch_data 中 thing1 = MyDialog(root)

文件“C:\Users\ajpung\AppData\Local\Continuum\Anaconda2\lib\lib-tk\tkSimpleDialog.py”,第 81 行,在 init self.initial_focus.focus_set()

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

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

【问题讨论】:

  • 我们可以有完整的堆栈跟踪吗?
  • 已编辑以包含完整的堆栈跟踪
  • @Slayer 我对此有点陌生,所以我现在知道了。是否有一种有效的方法从弹出窗口的输入框中提取值,基于使用 Tkinter 的grid 构建的 GUI?
  • 注意——但这并没有改变,但是当弹出框第一次打开时我仍然得到上面的 AttributeError

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


【解决方案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

【讨论】:

  • 完美——正是我所需要的。我消除了return 命令,从而消除了错误。 3行代码给了我想要的输出,谢谢!
  • @DingoGetter:你不应该消除退货,修复它。它是有目的的。
  • 我很兴奋。 return 已添加,解决方案效果很好,即使在内核重新启动后!非常感谢。
猜你喜欢
  • 2021-03-18
  • 1970-01-01
  • 2023-01-26
  • 2018-05-10
  • 2015-06-22
  • 2020-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多