tkinter
여러 창 (TopLevel 위젯)
수색…
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()
파이썬 프로그램이 하나의 응용 프로그램을 나타낼 경우 (거의 항상 Tk
인스턴스는 하나만 있어야하지만 원하는만큼 많은 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 = Toplevel(A)
창이 닫힙니다.
창 스택 정렬 (.lift 메소드)
특정 윈도우를 다른 윈도우 위로 들어 올리는 가장 기본적인 경우는 해당 윈도우 ( Toplevel
또는 Tk
)에서 .lift()
메소드를 호출하면 .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
함수는 대화 상자가 있는지 여부를 보여주는 대화 상자 창을 표시합니다. 또한 try:except
로 래핑하지 않고 .winfo_exists()
를 호출하여 창을 들어 올리려고 시도하기 전에이를 호출 할 수 있습니다.
.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()
메서드를 사용하여 다른 윈도우를 올리거나 하나.