2

这是我第一次使用 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)

    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(在 中MainFrame)。换句话说,我想从一个孩子修改另一个父母的孩子……我该怎么做?

附带问题:我的图形界面的一般结构是否正确?我的意思是, letmy_updatemy_label继承 from是否正确tk.Frame

4

2 回答 2

1

尝试以下操作:(请参阅评论以查看我修改的内容。)

class MainFrame(tk.Frame):
    def __init__(self,parent):
        tk.Frame.__init__(self,parent)
        self.x=my_label(self)
        self.up=my_update(self, self.x) # <-- pass another child to constructor
        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()

    # 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.
于 2013-09-11T15:31:08.570 回答
0

对于您的侧面问题:我不确定您的应用程序还需要做什么,所以也许有一个很好的理由,但在我看来,将标签和按钮包装在一个从Frameover 继承的额外类中会使事情变得有点复杂。我想我会这样做:

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。无需将它们包装在额外的框架中。

于 2013-09-11T15:39:51.490 回答