【问题标题】:Trigger Tkinter events from a different class in Python从 Python 中的不同类触发 Tkinter 事件
【发布时间】:2019-05-05 02:55:43
【问题描述】:

所以我一直在尝试在我的 tkinter 项目中使用类,但我似乎无法准确理解类如何交互。特别是当涉及 tkinter 时。我可以访问变量和值并传递它们,但我似乎无法弄清楚如何进行触发器。

我目前的问题是尝试从不同的类触发事件。 问题的一个简单版本是这样的:

from tkinter import *

class Area:
    def __init__(self):
        self.can = Canvas(width=100, height=100, bg="green")
        self.can.pack(in_=window)
        self.can.bind("<Button-3>", self.test)
        self.square = self.can.create_rectangle(25, 25, 75, 75)

    def test(self, event):
        self.can.delete("all")

class Trigger:
    def __init__(self):
        self.button = Button(text="click me", command=?)
        self.button.pack(in_=window)

window = Tk()
Area()
Trigger()
window.mainloop()

它创建了一个中间有一个正方形的绿色画布。当您右键单击画布时,正方形被删除。然后我尝试从不同的类中触发相同的行为,这里用一个按钮演示。

问题是,我一生都无法弄清楚按钮上的命令是什么。

我试过command=Area.test,但我得到了“

TypeError: test() 缺少 2 个必需的位置参数:'self' 和 '事件'"

我尝试了command=Area.test(Area, "event")command=Area.test(self, "event"),但它们返回:

AttributeError: type object 'Area' has no attribute 'can'

AttributeError: type object 'Area' has no attribute 'can'

我还尝试了Area().test("event),它没有出错,但给了我 2 个画布实例,一个带有正方形,一个没有。然后按钮什么也没做。

研究了继承,所以我尝试通过将 Area 作为继承放在 Trigger 类上,然后执行 command=self.test("event") 但后来得到:

AttributeError: 'Trigger' 对象没有属性 'can'

所以我没有想法..我做错了__init__part 吗?

【问题讨论】:

    标签: python class tkinter triggers


    【解决方案1】:

    首先,如果您想将函数既用作事件的目标又用作command 属性的值,您应该将event 参数设为可选。你可以通过给它一个默认值None来做到这一点:

    def test(self, event=None):
        self.can.delete("all")
    

    其次,需要为Trigger 对象提供Area 对象的实例,以便它可以调用该对象上的方法。有几种方法可以做到这一点,但最直接的方法是在创建对象时将其传入。也就是说你需要修改Trigger.__init__接受参数,然后在创建对象的时候需要传入。

    这是修改__init__方法的方法:

    class Trigger:
        def __init__(self, area):
            self.button = Button(text="click me", command=area.test)
            self.button.pack(in_=window)
    

    这是将Area对象传递给Trigger对象的方法:

    area=Area()
    Trigger(area)
    

    【讨论】:

    • 效果很好,谢谢!我必须先声明 area=Area() 吗,Trigger(Area()) 不是一样的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    相关资源
    最近更新 更多