python - 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”。我需要写什么作为它工作正常的论点?
解决方案
请注意,这TimeFrame.add_timestamp(self)
实际上是一个实例方法。这意味着,您不能在不提供特定实例的情况下调用它,然后将其作为self
.
想象一下,您将创建两个 TimeFramea = TimeFrame(root)
和b = TimeFrame(root)
,然后您需要使用或调用add_timestamp
其中一个。a.add_timestamp()
b.add_timestamp()
因此,在您的情况下,您已经有一个TimeFrame
实例(称为time_frame
)。现在您需要的是 from ButtonFrame
to的引用TimeFrame
,以便每个ButtonFrame
都可以引用特定的TimeFrame
instance。
作为一个简单的解决方案,您可以传递time_frame
到button_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()
看看这个答案,以更好地解释类和实例方法之间的区别。
推荐阅读
- swift - UserDefaults/NSUserDefaults removeObject(forKey:) 在应用程序和应用程序之间神秘地失败
- java - 即使声明了变量,View.OnClickListener() 也会变灰?
- swift - SwiftUI Picker 未选择默认值且对象不起作用
- google-sheets - 使用换行符拆分一个单元格,但一次抓取 2 行 Google 表格
- javascript - Firebase 部署功能的问题
- kotlin - 找不到上下文时如何在 Kotlin 代码中获取 XML 的资源?
- r - 在这里看到函数(rx)有什么用?
- c# - 复杂对象的 Razor 页面验证错误,TryValidateModel() 不起作用
- linux - Linux - 将 sql 选择值存储在变量 bash 中
- rest - 这是一个符合使用标头而不是 JSON-body 来传递数据的 REST API 吗?