【问题标题】:How to use tk.StringVar() within OOP?如何在 OOP 中使用 tk.StringVar()?
【发布时间】:2015-06-26 18:10:22
【问题描述】:

不确定这是否是我对 tkinter 或 OOP(可能两者兼有)缺乏了解,但以下代码不起作用。我在我的 tkinter 项目中隔离了这个问题,我将其转换为 OOP 范式并缩小了范围,但我不知道如何调试它。我知道我可以通过创建一些自定义函数或解决方法来避免 StringVar(),但我想坚持使用它,因为 imo 它更优雅。

完整的、独立的代码:

import tkinter as tk


class App(tk.Tk):

    def __init__(self):
        tk.Tk.__init__(self)
        var = tk.StringVar()

        label = tk.Label(self, textvariable=var)
        label.pack()

        button = tk.Button(self, text='go', command=lambda: self.var_setter())
        button.pack()

    def var_setter(self):
        self.var.set('Hello')

appobject = App()
appobject.mainloop()

按下按钮时会报错

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python34\lib\tkinter\__init__.py", line 1533, in __call__
    return self.func(*args)
  File "C:/Users/me/PycharmProjects/Ed/sandbox.py", line 13, in <lambda>
    button = tk.Button(self, text='go', command=lambda: self.var_setter())
  File "C:/Users/me/PycharmProjects/Ed/sandbox.py", line 17, in var_setter
    self.var.set('Hello')
  File "C:\Python34\lib\tkinter\__init__.py", line 1932, in __getattr__
    return getattr(self.tk, attr)
AttributeError: 'tkapp' object has no attribute 'var'

我试过了

self.var = tk.StringVar() 

以及其他围绕“自我”移动的方式。

我不得不承认,我怀疑

tk.Tk.__init__(self)

我从sentdex tutorials on tkinter 中获取的。

【问题讨论】:

    标签: python oop python-3.x tkinter


    【解决方案1】:
    1. 您需要在任何地方使用self.var,包括赋值self.var = tk.StringVar()Label 变量self.textvariable=var。我进行了这些更改,程序运行了。
    2. 您可以将command=lambda: self.var_setter() 简化为command=self.var_setter。无需在 lambda 中包含基本调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-01
      • 2019-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      相关资源
      最近更新 更多