Python Tkinter子窗口问题
你好,
我在使用Python的多个tkinter窗口时遇到了一些困难。基本上,我有两个类,它们分别对应两个不同的窗口。主类显示主窗口(parentWindow),而另一个类显示第二个窗口(childWindow)。下面的代码是用来启动主窗口的:
#START THE APPLICATION
root = Tkinter.Tk()
root.title ("GEMEINDESTECKBRIEF-Menü")
# My main Application
runGUI = MainWorkspaceConfig (root)
root.mainloop ()
到目前为止,没有任何问题!
现在我想通过在主类中调用一个函数来打开第二个窗口(有点像点击按钮打开窗口的功能):
def opendirFactsheetHochwasserGebaeude (self) :
#validates the workspace resp. database directory and
#print self.checkFactsheet2.get()
#print self.inputSpace1.get()
try:
if self.checkFactsheet2.get()==1 :
if self.inputSpace1.get() or self.inputSpace2.get() != "":
#write workspace environment to __initFile__
if self.inputSpace1.get() != "":
self.writeWorkspEnv(self.inputSpace1.get())
#Copy file in seperate thread
start_new_thread(self.copyDefaultFactoWorkspace,())
if self.inputSpace2.get() != "":
self.writeWorkspEnv(self.inputSpace2.get())
# !!!!!!! START SECOND WINDOW !!!!!
facthwgeb = Tkinter.Tk()
facthwgeb.title ("Factsheet Hochwasser-Gebäude")
runGUI = Factsheet_hochwassergebaeude (facthwgeb)
facthwgeb.mainloop ()
#facthwgeb.protocol('WM_DELETE_WINDOW', runGUI.closeFactsheetHochwGeb)
else:
#self.inputSpace1.get() and self.inputSpace2.get () =="":
tkMessageBox.showwarning ("Keine Arbeitsumgebung festgelegt", "Bitte entweder einen neuen Workspace anlegen oder eine bestehende Datenbank auswählen!")
self.selectBox1.deselect()
到现在为止,一切都很好!窗口按预期打开,界面上的小部件也能正常显示和使用。
完成任务后,这个窗口需要关闭,问题就出现在这里!!!为了关闭窗口,我使用了一个按钮,并给它设置了一个命令函数,代码如下:
def closeFactsheetHochwGeb (self):
try:
if self.inputSpace1.get() and self.inputSpace2.get() != "":
with open('%s/__initFile__.txt'%os.path.dirname(os.path.realpath(__file__)), 'r') as file:
# read a list of lines into data
data = file.readlines()
data[13] = self.inputSpace1.get()+"\n"
data[14] = self.inputSpace2.get()+"\n"
# and write everything back
with open('%s/__initFile__.txt'%os.path.dirname(os.path.realpath(__file__)), 'w') as file:
file.writelines( data )
file.close()
# self.tkinterFrame.destroy()
self.tkinterFrame.quit()
但是,self.tkinterFrame.quit() 不仅关闭了第二个窗口(childWindow),还把主窗口(parentWindow)也关掉了。而 self.tkinterFrame.destroy() 函数虽然清除了窗口里的所有小部件,但窗口仍然是活跃的并且可见!
所以,有什么办法解决这个问题吗?我会非常感激任何解决方案!!!
3 个回答
试试这个 self.Frame1.destroy()
,或者你可以用你框架的名字。 有时候你可能会看到这样的代码 self.Frame1 = tk.Frame(top)
不要创建第二个 Tk()
实例;你只能有一个主窗口。
可以使用 Toplevel 组件来处理 facthwgeb
。另外,去掉 facthwgeb.mainloop()
这个调用,因为应该只调用一次这个。
太好了,我终于找到了解决我问题的方法!!
第一步:在主类中,也就是启动子窗口的地方,我把函数 def opendirFactsheetHochwasserGebaeude (self) :
里的代码从 Tkinter.Tk()
改成了 Tkinter.Toplevel(parent)
,这里的 parent 指的是根窗口。改完 Tkinter 的类型后,facthwgeb.mainloop()
也不需要了,因为它是由主窗口(Parent)提供的。
第二步:在实现子窗口的第二个类中,函数 def closeFactsheetHochwGeb (self):
之前用的命令 self.tkinterFrame.destroy()
是用来清除框架里的小部件,但并没有关闭窗口,而 self.tkinterFrame.quit()
则是关闭主窗口和子窗口,所以这两个命令其实没用!!
最后一步:最终的解决办法是把 self.tkinterFrame.destroy ()
改成 self.tkinterFrame.master.destroy()
!!
有时候复杂的事情其实可以很简单!! :-)