2016-07-30 16 views
0

Ich habe ein Python-Programm, in dem ich ein paar benutzerdefinierte modale Fenster erstellt habe, die Kinder eines Top-Tkinter-Fensters sind. Ein Beispiel für ein solches Fenster ist unten, aber ich habe andere, kompliziertere. Was ich tun möchte, aber nicht bestimmen kann, ist, irgendwo zu haben, dass ich das nenne und auf eine Antwort warte. Ich habe versucht, etwas wie unten, es schafft nicht das FensterWie warte ich auf die Antwort vom modalen Fenster, bevor ich tkinter weiter benutze?

modal = ModalWindow(tk.Tk(), 'Title', 'Text') 
while modal.choice is None: 
    pass 
if modal.choice == 'Yes': 
    # Do Something 

Was ist der richtige Weg, um diese Art von Sache zu behandeln?

Benutzerdefinierte Modal Fenster Beispiel

class ModalWindow(object): 

    def __init__(self, root, title, text): 
     self.choice = None 

     # Setup the window 
     self.modalWindow = tk.Toplevel(root) 
     self.modalWindow.title(title) 
     self.modalWindow.resizable(False, False) 

     # Setup the widgets in the window 
     label = ttk.Label(self.modalWindow, text = text, font = '-size 10') 
     label.grid(row = 0, column = 0, columnspan = 2, padx = 2, pady = 2) 

     but = ttk.Button(self.modalWindow, text = 'Yes', command = self.choiceYes) 
     but.grid(row = 1, column = 0, sticky = 'nsew', padx = 2, pady = 5) 

     but = ttk.Button(self.modalWindow, text = 'No', command = self.choiceNo) 
     but.grid(row = 1, column = 1, sticky = 'nsew', padx = 2, pady = 5) 

     self.modalWindow.rowconfigure(1, minsize = 40) 

    def choiceYes(self): 
     self.choice = 'Yes' 
     self.modalWindow.destroy() 

    def choiceNo(self): 
     self.choice = 'No' 
     self.modalWindow.destroy() 

Antwort

1

Nach einigen weiteren Graben, fand ich meine eigene Antwort. Das Folgende macht was ich will. Die Funktion wait_window akzeptiert ein tkinter-Fenster und pausiert bis das Fenster geschlossen wurde.

root = tk.Tk() 
modal = ModalWindow(root, 'Title', 'Text') 
root.wait_window(modal.modalWindow) 
if modal.choice == 'Yes': 
    # Do Something 
0

Ich vermisse etwas Grundlegendes hier. Wenn das Fenster anwendungsmodal ist, müssen Sie warten: Programmatisch ist nichts zu machen. Wenn Sie versuchen, auf ein Ereignis zu warten, das in einem Fenster der ANOTHER-Anwendung auftaucht, werden Sie abgespritzt, wenn Sie nicht einen dornigen OLE-Code schreiben (ich nehme Windows hier an, da UNIX-Verfahren niemals einen Vorabend in Betracht ziehen würden) solch eine Lösungskomponente).

+0

Aber die Sache ist, du bist nicht. Mit der Modal Window-Klasse, die ich geschrieben habe, bringt es die GUI, es ist ein eigener Thread, und diese GUI wartet, aber der Code, der sie aufgerufen hat, wird weiterhin ausgeführt. Das Problem rührt von der Tatsache her, dass die while-Schleife direkt danach dazu führt, dass die GUI nicht vollständig auftaucht. Führen Sie den Code selbst aus und Sie werden sehen. – zephyr