【问题标题】:Python Tkinter passing self as button command parameterPython Tkinter 将 self 作为按钮命令参数传递
【发布时间】:2015-02-28 14:01:49
【问题描述】:

我有一个菜鸟问题:

我正在尝试创建一个类“Field”,它继承了 Tkinter 的 Button 类的所有内容,但还包含附加属性“location”和获取该属性的方法。实现之后,我创建了新的“Field”类的实例,并尝试让 Field 的命令调用它的函数来获取它的 location 属性:

from Tkinter import *

class Field(Button):
    def __init__(self, location, **k):
        Button.__init__(self, **k)
        self.location = location

    def getLoc(self):
        return self.location

root=Tk()
c = Field(2, text="Text", command = lambda: self.getLoc)
c.pack()
root.mainloop()

出现带有按钮的根窗口,但按下后出现以下错误:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 1470, in __call__
    return self.func(*args)
  File "C:\Users\PC\Desktop\test2.py", line 12, in <lambda>
    c = Field(2, text="Text", command = lambda: self.getLoc)
NameError: global name 'self' is not defined

我应该怎么做才能让它看到我希望最近实例化的“字段”成为它应该返回其位置的“自我”?

提前谢谢你

【问题讨论】:

    标签: python button tkinter command self


    【解决方案1】:

    编辑:抱歉,我完全不了解关于 lambda self: self.getLoc 的原始回复,更正了答案(这次通过运行代码进行了检查!)

    您可能应该在创建按钮后配置命令,这样您就可以明确地引用按钮。

    root=Tk()
    c = Field(2, text="Text")
    c.config(command=c.getLoc)
    c.pack()
    root.mainloop()    
    

    您可以在effbot.org 上阅读有关 Tkinter 对象的配置方法(以及更多内容)的更多信息。

    【讨论】:

    • 谢谢!它有帮助。我想这是有道理的,因为当我在字段实例化期间尝试传递命令时,“自我”并不真正存在。还要感谢您提供的配置信息,肯定会派上用场。 (我很抱歉没有+1,由于声誉低下而无法做到:()
    • @sv1 即使你不能投票,你也可以通过点击复选标记accept this answer
    猜你喜欢
    • 2022-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 2023-02-24
    • 1970-01-01
    • 2021-03-12
    相关资源
    最近更新 更多