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()

このメイン フレームには、2 つの単純な要素しかありません。それらのクラスは次のとおりです。

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。つまり、子から、他の親の子の 1 つを変更したいのですが、どうすればそれを行うことができますか?

副次的な質問: 私のグラフィカル インターフェイスの一般的な構造は正しいように見えますか? つまり、 letmy_updatemy_labelから継承するのは正しい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

あなたの副次的な質問: あなたのアプリケーションが他に何をする必要があるのか​​ わからないので、正当な理由があるかもしれませんが、継承する余分なクラスでラベルとボタンをラップすると、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 から継承しないでください。それらを余分なフレームにラップする必要はありません。

于 2013-09-11T15:39:51.490 に答える