web-dev-qa-db-ja.com

Tk()、Toplevel()およびwinfo_toplevel()。それらの違いと、効果的に使用する方法と時期は?

ウィジェットがどのように作成されているかを理解しようとしています。そして、上記の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()の正確な違いは何ですか。いつ、何を効果的に使用すべきか。本当に良い理解を探しています。

7
cs2612

上記のコードを実行すると、「ルート」ウィジェットが作成されます。 「ルート」を閉じると、「ウィンドウウィジェット」というタイトルのウィジェットと不要なウィジェットの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メソッドも定義されているクラスのオブジェクトインスタンスです。

基本的に、メソッドの大文字と小文字を区別しないスペルを使用しようとしています。これは、ToplevelTkなどのクラス名であるかのように、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つのインスタンスが存在する必要があります。

ToplevelTkインスタンスの唯一の視覚的な部分と見なすことができ、複数のウィンドウのようなウィジェットが必要な場合に使用できます。

最後に、winfo_toplevelは、ウィジェットが存在するToplevelのような親の参照を返すメソッドであり、親はToplevelまたはTkのインスタンスです。

5
Nae