2016-10-10 52 views
0

我在打开辅助窗口时遇到了麻烦。现在我只是用按钮创建顶层窗口,我需要打开相同的辅助窗口如果我单击按钮(不生成新的实例)。用Tkinter打开唯一的辅助窗口

哪个更好的方法来生成单个辅助窗口并且不生成新的窗口实例?

我离开那个我实际工作的代码:

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() 

也许我需要有一个Toplevel的类和呼叫显示一个实例,并关闭显示或隐藏的辅助窗口。

+1

你有什么烦恼? – furas

+1

'撤回()'隐藏,'deiconify()'显示,'focus_set()'设置焦点。 – TigerhawkT3

+0

@furas我想要一个辅助窗口的单个实例,我可以关闭并重新打开,并且当我单击打开的窗口时不会生成一个新窗口。 –

回答

0

最后经过一些测试,我发现如何解决这个问题,这要归功于@furas响应和一些关于Tkinter事件与协议功能的调查。

我有工作在工作:

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() 

使用布尔知道是否存在窗口或不是我能处理窗口时它打开过,只是显示现有窗口或创建一个新的一。