Python tkinter:如何从另一个子对象调用子对象的方法
这是我第一次使用pyhton创建图形界面,我很难理解父母和孩子之间的联系 我首先在一个单独的线程中创建根窗口:Python tkinter:如何从另一个子对象调用子对象的方法,python,class,inheritance,tkinter,Python,Class,Inheritance,Tkinter,这是我第一次使用pyhton创建图形界面,我很难理解父母和孩子之间的联系 我首先在一个单独的线程中创建根窗口: import tkinter as tk import threading as th class GUI(th.Thread): def __init__(self): th.Thread.__init__(self) self.root = tk.Tk() self.gp = MainFrame(self.root)
import tkinter as tk
import threading as th
class GUI(th.Thread):
def __init__(self):
th.Thread.__init__(self)
self.root = tk.Tk()
self.gp = MainFrame(self.root)
def start(self):
self.root.mainloop()
def stop(self):
self.root.destroy()
此类的构造函数调用主框架的构造函数:
class MainFrame(tk.Frame):
def __init__(self,parent):
tk.Frame.__init__(self,parent)
self.x=my_label(self)
self.up=my_update(self)
self.grid()
在这个主框架中,我只有两个简单的元素,它们的类是:
class my_label(tk.Frame):
def __init__(self,parent):
tk.Frame.__init__(self,parent)
self.l = tk.Label(self,text="some text")
self.l.grid()
self.grid()
class my_update(tk.Frame):
def __init__(self,parent):
tk.Frame.__init__(self,parent)
self.b=tk.Button(self,text="update",command=self.ButtonPushed)
self.b.grid()
self.grid()
def ButtonPushed(self):
# here is my problem...
这样做是可行的,但是当我点击更新按钮时,我想修改x
(在大型机中)。换句话说,我想修改,从一个孩子,另一个家长的孩子。。。我该怎么做
附带问题:我的图形界面的总体结构似乎正确吗?我的意思是,让my_update
和my_label
从tk.Frame
继承是否正确
<代码>类my_UUpdate(tk.Frame):
定义初始(自我、父母、朋友):
# ^^^^^^
#将另一个子引用接受为'freind',另存为self.friend
tk.Frame.\uuuu init\uuuuu(自,父)
self.friend=friend#对于你的附带问题:我不确定你的应用程序还需要做什么,所以可能有一个很好的理由,但在我看来,将标签和按钮包装在一个额外的类中,这个类继承自Frame
,这会使事情变得有点复杂。我想我应该这样做:
class MainFrame(tk.Frame):
def __init__(self,parent):
tk.Frame.__init__(self,parent)
self.x=tk.Label(self, text="some text")
self.up=tk.Button(self, text="update", command=self.ButtonPushed)
self.x.grid()
self.up.grid()
self.grid()
def ButtonPushed(self):
# do something with self.x
或者,如果您真的需要额外的类,为什么不让子类从tk.Label和tk.Button继承呢。不需要将它们包装在一个额外的框架中。谢谢,您的方法很有效。但是当我读到你的答案时,我意识到我的程序的概念是错误的。。。所以我不需要你的解决方案。你帮助了我,让我知道我可以找到更好的编码方式!
class my_label(tk.Frame):
def __init__(self,parent):
tk.Frame.__init__(self,parent)
self.l = tk.Label(self,text="some text")
self.l.grid()
self.grid()
# my_update.ButtonPushed will call this method.
def ButtonPushed(self):
self.l['text'] = 'pushed'
class my_update(tk.Frame):
def __init__(self,parent, friend):
# ^^^^^^
# accept another child reference as `freind` as save it as self.friend
tk.Frame.__init__(self,parent)
self.friend = friend # <-- save reference to another child
self.b=tk.Button(self,text="update",command=self.ButtonPushed)
self.b.grid()
self.grid()
def ButtonPushed(self):
self.friend.ButtonPushed() # <-- call another child's method freely.
class MainFrame(tk.Frame):
def __init__(self,parent):
tk.Frame.__init__(self,parent)
self.x=tk.Label(self, text="some text")
self.up=tk.Button(self, text="update", command=self.ButtonPushed)
self.x.grid()
self.up.grid()
self.grid()
def ButtonPushed(self):
# do something with self.x