2016-10-10 2 views
0

Ich habe ein Problem, wenn ich ein sekundäres Fenster öffne. Jetzt erstelle ich nur ein Toplevel-Fenster mit einer Schaltfläche und ich muss das gleiche sekundäre Fenster öffnen, wenn ich auf die Schaltfläche klicke (keine neue Instanz erzeugen).Offenes einzigartiges sekundäres Fenster mit Tkinter

Welcher ist der bessere Weg, um ein einzelnes sekundäres Fenster zu generieren und keine neue Fensterinstanz zu generieren?

lasse ich den Code, den ich eigentlich arbeiten:

import tkinter 

class LogWindow(): 
    def __init__(self, parent): 
     self.parent = parent 
     self.frame = tkinter.Frame(self.parent) 

class MainWindow(tkinter.Frame): 
    def __init__(self, parent): 
     tkinter.Frame.__init__(self, parent) 
     self.parent = parent 

     frame = tkinter.Frame(self, borderwidth=1) 
     frame.pack(fill=tkinter.BOTH, expand=True, padx=5, pady=5) 

     self.LogButton = tkinter.Button(frame, text="Log Viewer", command= self.openLogWindow) 
     self.LogButton.grid(sticky=tkinter.E+tkinter.W) 

     self.pack(fill=tkinter.BOTH,expand=True) 

    def openLogWindow(self): 
     self.logWindow = tkinter.Toplevel(self.parent) 
     self.app = LogWindow(self.logWindow) 

def main(): 
    global app, stopRead 
    root = tkinter.Tk() 
    root.geometry("300x300") 
    app = MainWindow(root) 
    root.mainloop() 


if __name__ == '__main__': 
    main() 

Vielleicht brauche ich eine einzelne Instanz einer Toplevel-Klasse und Call-Show haben und in der Nähe des sekundären Fenster anzuzeigen oder auszublenden.

+1

Was genau hast du? – furas

+1

'remove()' zum Ausblenden, 'deiconify()' zum Anzeigen, 'focus_set()' zum Setzen des Fokus. – TigerhawkT3

+0

@furas Ich möchte eine einzelne Instanz eines sekundären Fensters haben, das ich schließen und wieder öffnen kann, und kein neues erzeugen, wenn ich auf das offene Fenster klicke. –

Antwort

0

Endlich nach einigen Tests habe ich herausgefunden, wie man das lösen kann, dank der @furas-Antwort und einiger Untersuchungen über die Tkinter-Ereignisse mit der Protokollfunktion.

Ich habe, dass die Arbeit mit:

import tkinter 

logWindowExists = False 

class LogWindow(): 
    def __init__(self, parent): 
     global logWindowExists, root 
     logWindowExists = True 

     self.parent = parent 
     self.frame = tkinter.Frame(self.parent) 

    def on_closing(self): 
     global logWindowExists 
     logWindowExists = False 
     self.parent.destroy() 

class MainWindow(tkinter.Frame): 
    def __init__(self, parent): 
     tkinter.Frame.__init__(self, parent) 
     self.parent = parent 

     frame = tkinter.Frame(self, borderwidth=1) 
     frame.pack(fill=tkinter.BOTH, expand=True, padx=5, pady=5) 

     self.LogButton = tkinter.Button(frame, text="Log Viewer", command= self.openLogWindow) 
     self.LogButton.grid(sticky=tkinter.E+tkinter.W) 

     self.pack(fill=tkinter.BOTH,expand=True) 

    def openLogWindow(self): 
     if not logWindowExists: 
      self.logWindow = tkinter.Toplevel(self.parent) 
      self.app = LogWindow(self.logWindow) 
      self.logWindow.protocol("WM_DELETE_WINDOW", self.app.on_closing) 
     else: 
      self.logWindow.deiconify() 

def main(): 
    global app, stopRead, root 
    root = tkinter.Tk() 
    root.geometry("300x300") 
    app = MainWindow(root) 
    root.mainloop() 


if __name__ == '__main__': 
    main() 

einen boolean Verwendung zu wissen, ob das Fenster oder nicht vorhanden ist, kann ich umgehen, wenn das Fenster es geöffnet wird oder nicht und zeigt nur das bestehende Fenster oder einen neuen zu schaffen ein.