ウィジェットがどのように作成されているかを理解しようとしています。そして、上記の3つの関数がウィジェットの作成に使用されていることに気付きましたが、一方の違いと他方に対する利点を思い付くことができませんでした。とはいえ、私は この回答 を調べましたが、それでも混乱が残ります(そして、_winfo_toplevel
_についても何も言われていませんでした)。
これが私のコードです。
_from tkinter import *
root = Tk()
root.title("Root widget")
root.mainloop()
window = Toplevel()
window.title("Window widget")
window.mainloop()
_
上記のコードを実行すると、「ルート」ウィジェットが作成されます。 「ルート」を閉じると、「ウィンドウウィジェット」というタイトルのウィジェットと不要なウィジェットの2つのウィジェットが作成されます。不要なウィジェットを閉じると、「ウィンドウウィジェット」も破壊されます。ここで実際に何が起こっているのか、そしてどのように克服するのですか?
別のサンプル:
_class ldo(Frame):
def __init__(self, master = None):
Frame.__init__(self,master)
self.grid()
self.appOutline()
def appOutline(self):
top = self.winfo_toplevel()
self.menuBar = Menu(top)
top["menu"] = self.menuBar
self.subMenu1 = Menu(self.menuBar)
self.menuBar.add_cascade(label = "File", menu = self.subMenu1)
app = ldo()
app.master.title("Sample UI")
app.mainloop()
_
一方、このコードはwinfo_toplevel()
を使用しており、ウィジェットは完全に正常に見えます。ここで、私の仮定は、Frame
がウィジェットを作成する役割を果たし、winfo_toplevel()
が他のtkinterアイテムの拡張ツールであるということです。しかし、それが実際に何をするのか知りたいのです。
ただし、以下のスニペットは機能しません。
_winf = winfo_Toplevel()
winf.title("Winfo Widget")
winf.mainloop()
_
そして、そのようなエラーを返します:
_winf = winfo_Toplevel()
NameError: name 'winfo_Toplevel' is not defined
_
Tk()、Toplevel()、winfo_Toplevel()の正確な違いは何ですか。いつ、何を効果的に使用すべきか。本当に良い理解を探しています。
上記のコードを実行すると、「ルート」ウィジェットが作成されます。 「ルート」を閉じると、「ウィンドウウィジェット」というタイトルのウィジェットと不要なウィジェットの2つのウィジェットが作成されます。不要なウィジェットを閉じると、「ウィンドウウィジェット」も破壊されます。ここで実際に何が起こっているのか、そしてどのように克服するのですか?
実際のTk()
インスタンスがない状態でウィジェットを作成すると、Tk()
インスタンスが自動的に作成されるため、最初のコードの2番目の部分で不要なトップレベルのようなウィジェットが作成されます。スニペットが実行されます。さらに、ウィジェットがmaster
オプションなしで作成される場合、インスタンスはTk
インスタンスの1つの子であると見なされます。上記の場合、1つだけであり、それは自動的に作成されたもの。親が破棄されると、その下にあるすべてのウィジェットも破棄されるため、Tk
のインスタンスである不要なウィジェットを閉じると、親が破棄されるため、Toplevel
インスタンスも破棄されます。 。
2番目の部分では、 winfo_toplevel
は、自動的に作成されたTk
インスタンスを再度参照し、自動的に作成されたTk
を親として他の子を作成します。これは技術的には問題ありませんが、私が推測するのと同じGUIを作成する標準的な方法よりも、コードとして維持するのは難しいでしょう。
winf = winfo_Toplevel() winf.title("Winfo Widget") winf.mainloop()
上記のコードでは、インポートまたは別の方法で定義されていない限り、winfo_Toplevel
は意味がありません。まず、pythonは大文字と小文字が区別されるため、winfo_toplevel
と同じではありません。次に、 python 大文字と小文字は区別されませんでした。メソッドであり、最初の位置引数がないため、エラーがスローされます。これは、winfo_toplevel
メソッドも定義されているクラスのオブジェクトインスタンスです。
基本的に、メソッドの大文字と小文字を区別しないスペルを使用しようとしています。これは、Toplevel
やTk
などのクラス名であるかのように、winfo_toplevel
はほとんど関係ありません。
次のコードを調べます。
import tkinter as tk
root = tk.Tk()
root.title("This is the actual Tk instance, root")
toplevel = tk.Toplevel(root)
toplevel.title("This is a Toplevel, whose parent is root"),
r_lbl = tk.Label(text="""This label is a children to the default master,
as it lacks the first positional argument for an explicit parent
assignment.""")
r_lbl2 = tk.Label(r_lbl.winfo_toplevel(), text="""This label checks who the
toplevel parent for r_lbl is, and then selects that parent as a parent
to itself.""")
r_lbl3 = tk.Label(root, text="""This label will appear on root, as it's
explicitly passed as the first positional argument, which is the parent,
as root.""")
t_lbl = tk.Label(toplevel, text="""This label will appear on toplevel, as it's
explicitly passed as the first positional argument, which is the parent,
as toplevel.""")
t_lbl2 = tk.Label(t_lbl.winfo_toplevel(), text="""This label checks who the
toplevel parent for t_lbl is, and then selects that parent as a parent
to itself.""")
r_lbl.pack()
r_lbl2.pack()
r_lbl3.pack()
t_lbl.pack()
t_lbl2.pack()
root.mainloop()
結論として、Tk
は、Toplevel
ウィジェットであると同時に、実行されるGUI全体のthetclインタープリターでもあります。スレッドで。複数存在する可能性があります 推奨されません 通常は複数のインスタンスが正当化されないためですが、has GUIを使用するには、少なくとも1つのインスタンスが存在する必要があります。
Toplevel
はTk
インスタンスの唯一の視覚的な部分と見なすことができ、複数のウィンドウのようなウィジェットが必要な場合に使用できます。
最後に、winfo_toplevel
は、ウィジェットが存在するToplevel
のような親の参照を返すメソッドであり、親はToplevel
またはTk
のインスタンスです。