다소 큰 Python 3.6 프로젝트를위한 tkinter 창 관리를 테스트 중이며, 올바르게 얻을 수없는 것 또는 상당히 잘 이해할 수있는 것 하나가 있습니다. 다음 코드에서 창은 예상대로 닫히고 닫힙니다 (즉, 빨간색 'x'단추를 클릭하거나 OS X에서 Command-W 누르기). 하지만 보조 창 닫기 이벤트에 대한 콜백 광고를 시도하면 문제가 생깁니다. 예를 들어 두 개 이상의 보조 창이있는 경우 키보드 단축키 또는 버튼이 항상 활성 창을 닫는 것은 아닙니다. 여기에 무엇이 잘못되었는지에 대한 아이디어가 있습니까?"wm_protocol"이 Python3/tkinter에서 일반적인 창 관리를 중단하는 이유는 무엇입니까?
#!/usr/bin/env python3.6
# encoding: utf-8
import tkinter as tk
import tkinter.font
from tkinter import ttk
class baseApp(ttk.Frame):
"""
Parent classe for main app window (will include some aditional methods and properties).
"""
def __init__(self, master, *args, **kwargs):
super().__init__(master, *args, **kwargs)
self.master = master
self.mainframe = ttk.Frame(master)
self.mainframe.pack()
class App(baseApp):
""" Base class for the main application window """
def __init__(self, master, *args, **kwargs):
super().__init__(master, *args, **kwargs)
self.master = master
self.lbl_text = ttk.Label(self.mainframe, text="This is the Main Window")
self.lbl_text.pack()
self.btn = ttk.Button(self.mainframe, text="Open Second window",
command=lambda: self.create_detail_window(self, number=0))
self.btn.pack()
def create_detail_window(self, *event, number=None):
self.newDetailsWindow = tk.Toplevel(self.master)
self.newDetailsWindow.geometry('900x600+80+130')
self.newDetailsWindow.title(f'Detail: {number}')
self.newDetailsWindow.wm_protocol("WM_DELETE_WINDOW", lambda: self.close_detail_window()) # This line breaks window management!...
self.detail_window = detailWindow(self.newDetailsWindow, 0)
self.newDetailsWindow.focus()
def close_detail_window(self, *event):
""" will test for some condition before closing, save if necessary and
then call destroy()
"""
self.newDetailsWindow.destroy() # Shouldn't this be enough to close the secondary window?...
class detailWindow(ttk.Frame):
""" Base class for secondary windows """
def __init__(self, master, rep_num, *args,**kwargs):
super().__init__(master,*args,**kwargs)
self.num_rep = rep_num
self.master.minsize(900, 600)
self.master.maxsize(900, 600)
print(f"Showing details about nr. {self.num_rep}")
self.mainframe = ttk.Frame(master)
self.mainframe.pack()
self.lbl_text = ttk.Label(self.mainframe,
text=f"Showing details about nr. {self.num_rep}")
self.lbl_text.pack()
if __name__ == "__main__":
root = tk.Tk()
janela_principal = App(root)
root.title('Main Window')
root.bind_all("<Mod2-q>", exit)
root.mainloop()
내가 선을 드 언급 할 때 윈도우 관리가 상처 입는 self.newDetailsWindow.wm_protocol("WM_DELETE_WINDOW", lambda: self.close_detail_window())
것으로 보인다 :
여기에 내 현재 테스트 코드입니다. 라인 self.newDetailsWindow.destroy()
이 2 차 창을 닫을만큼 충분하지 않아야합니까? ... 객체를 인스턴스화하는 방식에 문제가 있습니까?
문제를 자세히 설명해 주시겠습니까? Windows 컴퓨터에서 오류를 재현 할 수 없습니다. – Dashadower
Mac에서는이 코드를 실행하고 두 번 이상의 보조 창을 열려면 두 번 이상 버튼을 클릭하고 backgroung에있는 창 중 하나를 클릭하면 현재 사용하고 있습니다 (예를 들어 첫 번째 보조 창), 키보드 바로 가기가 예상대로 작동하지 않습니다. 다른 창 (마지막으로 열린 창)이 닫힙니다. 그런 다음 전체 응용 프로그램을 종료하지 않으면 첫 번째 보조 창이 닫히지 않습니다. –