2013-08-13 1 views
0

로드해야하는 백업을 선택하는 코드가 있습니다. Toplevel 창을 열고로드 할 백업 중 하나를 선택할 수 있습니다. 이 창이 열리면 원본 창에 대한 입력을 차단하고 싶습니다. 따라서 원래 창으로 돌아갈 수있는 유일한 방법은 새 Toplevel 창을 닫는 것입니다.tkinter Toplevel 창이 일부 메소드에 반응하지 않는 것 같습니다.

내가 일하는 것이 기대 코드의 일부 :

 top.update_idletasks() 
     top.overrideredirect(True) 
     top.mainloop() 

나 :

 top.transient(parent) 
     top.mainloop() 

Niether 코드 부분에 나타납니다

from tkinter import * 



class BackupsGui: 
    def __init__(self, parent): 
     top = Toplevel() 
     self.top = top 

좀 더 코드와 __init__가 끝나는 어떤 방식 으로든 Toplevel 상호 작용을 변경하거나 변경하지 않는 경우 top.mainloop() prece des top.transient() 또는 top.update_idletasks().

무엇이 놓치나요?

답변

1

transientoverrideredirect은 이벤트 처리와 관련이 없습니다. 최상위를 제외한 모든 입력을 차단하려면 최상위 창에서 grab_set을 호출해야합니다. 그러면 모든 이벤트가 해당 창으로 전송됩니다.

다음 코드를 실행하고 확인란을 선택하지 않으면 계속 새 창을 만들고 확인란의 값을 변경할 수 있습니다. 선택하면 다음 창에 모든 이벤트가 표시되므로 다른 창과 상호 작용할 수 없습니다.

import Tkinter as tk 

class Example(tk.Frame): 
    def __init__(self, root): 
     tk.Frame.__init__(self, root) 
     self.do_grab = tk.BooleanVar() 
     cb = tk.Checkbutton(self, text="New window grabs all events", 
          variable=self.do_grab, onvalue=True, offvalue=False) 
     cb.pack() 
     new_button = tk.Button(self, text="New window", command=self.on_click) 
     new_button.pack() 

    def on_click(self): 
     self.top = tk.Toplevel(self) 
     button = tk.Button(self.top, text="dismiss", command=self.top.destroy) 
     do_grab = self.do_grab.get() 

     if do_grab: 
      label = tk.Label(self.top, wraplength=200, 
          text="This window grabs all events") 
     else: 
      label = tk.Label(self.top, wraplength = 200, 
          text="This window does NOT grab all events") 
     label.pack(fill="x") 
     button.pack() 

     if do_grab: 
      self.top.grab_set() 

if __name__ == "__main__": 
    root = tk.Tk() 
    Example(root).pack(side="top", fill="both", expand=True) 
    root.mainloop() 
+0

예상보다 많은 도움을 주셔서 감사합니다. 나는 또한 Toplevel 윈도우와의 상호 작용을 변화시키지 않는이 기능들에 문제가 있었고, 오늘날 그 문제는 신비하게 사라졌습니다. 나는 내가 나중에 실행 한 것 또는 다른 어리석은 실수보다 다른 소스 코드를 편집하고 있었다고 생각한다. – user1687327

관련 문제