サーチ…


TkとToplevelの違い

Tkはアプリケーションの絶対的なルートであり、インスタンス化する必要のある最初のウィジェットであり、GUIは破棄されるとシャットダウンします。

Toplevelはアプリケーション内のウィンドウです。ウィンドウを閉じると、そのウィンドウ{1}に配置されているすべての子ウィジェットが破棄されますが、プログラムはシャットダウンされません。

try:
    import tkinter as tk #python3
except ImportError:
    import Tkinter as tk #python2

#root application, can only have one of these.
root = tk.Tk() 

#put a label in the root to identify the window.
label1 = tk.Label(root, text="""this is root
closing this window will shut down app""")
label1.pack()

#you can make as many Toplevels as you like
extra_window = tk.Toplevel(root)
label2 = tk.Label(extra_window, text="""this is extra_window
closing this will not affect root""")
label2.pack()

root.mainloop()

あなたのPythonプログラムが(ほとんどの場合)1つのアプリケーションを表す場合、 Tkインスタンスは1つだけ必要ですが、好きなだけ多くのToplevelウィンドウを作成することができます。

try:
    import tkinter as tk #python3
except ImportError:
    import Tkinter as tk #python2

def generate_new_window():
    window = tk.Toplevel()
    label = tk.Label(window, text="a generic Toplevel window")
    label.pack()

root = tk.Tk()

spawn_window_button = tk.Button(root,
                                text="make a new window!",
                                command=generate_new_window)
spawn_window_button.pack()

root.mainloop()

{1}:Toplevel( A = Toplevel(root) )が別のToplevel( B = Toplevel(A) )の親である場合、ウィンドウAを閉じるとウィンドウBも閉じます。

ウィンドウスタックを配置する(.liftメソッド)

特定のウィンドウを他のウィンドウの上に持ち上げる最も基本的なケースは、そのウィンドウ( ToplevelまたはTkいずれか.lift()メソッドを呼び出すだけです。

import tkinter as tk #import Tkinter as tk #change to commented for python2

root = tk.Tk()

for i in range(4):
    #make a window with a label
    window = tk.Toplevel(root)
    label = tk.Label(window,text="window {}".format(i))
    label.pack()
    #add a button to root to lift that window
    button = tk.Button(root, text = "lift window {}".format(i), command=window.lift)
    button.grid(row=i)

root.mainloop()

しかし、そのウィンドウが破壊されて持ち上げようとすると、次のようなエラーが発生します:

Exception in Tkinter callback
Traceback (most recent call last):
  File "/.../tkinter/__init__.py", line 1549, in __call__
    return self.func(*args)
  File "/.../tkinter/__init__.py", line 785, in tkraise
    self.tk.call('raise', self._w, aboveThis)
_tkinter.TclError: bad window path name ".4385637096"

ユーザーの前に特定のウィンドウを配置しようとしているが、閉じられている場合は、そのウィンドウを再作成することをお勧めします。

import tkinter as tk #import Tkinter as tk #change to commented for python2

dialog_window = None

def create_dialog():
    """creates the dialog window
  ** do not call if dialog_window is already open, this will
     create a duplicate without handling the other
if you are unsure if it already exists or not use show_dialog()"""
    global dialog_window
    dialog_window = tk.Toplevel(root)
    label1 = tk.Label(dialog_window,text="this is the dialog window")
    label1.pack()
    #put other widgets
    dialog_window.lift() #ensure it appears above all others, probably will do this anyway

def show_dialog():
    """lifts the dialog_window if it exists or creates a new one otherwise"""
    #this can be refactored to only have one call to create_dialog()
    #but sometimes extra code will be wanted the first time it is created
    if dialog_window is None:
        create_dialog()
        return
    try:
        dialog_window.lift()
    except tk.TclError:
        #window was closed, create a new one.
        create_dialog()
    
    
root = tk.Tk()

dialog_button = tk.Button(root,
                          text="show dialog_window",
                          command=show_dialog)
dialog_button.pack()
root.mainloop()

このようにして、 show_dialog関数はダイアログウィンドウが存在するかどうかを表示します。また、 .winfo_exists()を呼び出して、 try:exceptでラップする代わりにウィンドウを持ち上げようとする前にそれが存在するかどうかを調べることができます。

あり.lower()と同じように動作する方法.lift()スタック内のウィンドウを下げる以外、方法は:

import tkinter as tk #import Tkinter as tk #change to commented for python2

root = tk.Tk()
root.title("ROOT")
extra = tk.Toplevel()
label = tk.Label(extra, text="extra window")
label.pack()

lower_button = tk.Button(root,
                         text="lower this window",
                         command=root.lower)
lower_button.pack()

root.mainloop()

他のアプリケーションの下でも下がっていることに気づくでしょう。特定のウィンドウの下にだけ下がって.lower()メソッドに渡すことができます。これは同様に.lift()メソッドを使って行うこともできます1。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow