首页 > 解决方案 > tkinter 使用按钮运行另一个类的功能

问题描述

这是我的代码:

class TimeFrame(tk.Frame):
    def __init__(self, *args, **kwargs):
        tk.Frame.__init__(self, *args, **kwargs)

        self.text = tk.Text(self, height=10, width=110)
        self.vsb = tk.Scrollbar(self, orient="vertical", command=self.text.yview)
        self.text.configure(yscrollcommand=self.vsb.set)
        self.vsb.pack(side="right", fill="y")
        self.text.pack(side="left", fill="both", expand=True)

    def add_timestamp(self):
        self.text.insert("end", time.ctime() + "\n")
        self.text.see("end")
        self.after(1000, self.add_timestamp)


class ButtonFrame(tk.Frame):
    def __init__(self, *args, **kwargs):
        tk.Frame.__init__(self, *args, **kwargs)

        self.button = tk.Button(self, text="Start Time", command=self.start_time)
        self.button.pack()

    def start_time(self):
        TimeFrame.add_timestamp()
        


if __name__ == "__main__":
    root = tk.Tk()
    time_frame = TimeFrame(root)
    time_frame.pack(fill="both", expand=True, padx=10, pady=20)
    button_frame = ButtonFrame(root)
    button_frame.pack(fill="both", expand=True, pady=(0, 20))
    root.mainloop()

我希望该add_timestamp()功能在单击按钮时运行。

如果没有参数,TimeFrame.add_timestamp()我会收到一个错误,说缺少参数“self”。我需要写什么作为它工作正常的论点?

标签: pythontkinter

解决方案


请注意,这TimeFrame.add_timestamp(self)实际上是一个实例方法。这意味着,您不能在不提供特定实例的情况下调用它,然后将其作为self.

想象一下,您将创建两个 TimeFramea = TimeFrame(root)b = TimeFrame(root),然后您需要使用或调用add_timestamp其中一个。a.add_timestamp()b.add_timestamp()

因此,在您的情况下,您已经有一个TimeFrame实例(称为time_frame)。现在您需要的是 from ButtonFrameto的引用TimeFrame,以便每个ButtonFrame都可以引用特定的TimeFrame instance

作为一个简单的解决方案,您可以传递time_framebutton_frame创建并将其存储为属性。然后,您可以调用add_timestamp该特定实例(未测试):

class TimeFrame(tk.Frame):
    def __init__(self, *args, **kwargs):
        tk.Frame.__init__(self, *args, **kwargs)

        self.text = tk.Text(self, height=10, width=110)
        self.vsb = tk.Scrollbar(self, orient="vertical", command=self.text.yview)
        self.text.configure(yscrollcommand=self.vsb.set)
        self.vsb.pack(side="right", fill="y")
        self.text.pack(side="left", fill="both", expand=True)

    def add_timestamp(self):
        self.text.insert("end", time.ctime() + "\n")
        self.text.see("end")
        self.after(1000, self.add_timestamp)


class ButtonFrame(tk.Frame):
    def __init__(self, root, time_frame, *args, **kwargs):
        tk.Frame.__init__(self, root, *args, **kwargs)

        self.time_frame = time_frame
        self.button = tk.Button(self, text="Start Time", command=self.start_time)
        self.button.pack()

    def start_time(self):
        self.time_frame.add_timestamp()
        


if __name__ == "__main__":
    root = tk.Tk()
    time_frame = TimeFrame(root)
    time_frame.pack(fill="both", expand=True, padx=10, pady=20)
    button_frame = ButtonFrame(root, time_frame)
    button_frame.pack(fill="both", expand=True, pady=(0, 20))
    root.mainloop()

看看这个答案,以更好地解释类和实例方法之间的区别。


推荐阅读