你好,我正在努力在python中使用多个tkinter窗口。基本上,我有两个类,它们也与两个不同的窗口相关。主类显示主窗口(parentWindow(,另一个类显示第二个窗口(childWindow(。以下代码启动主窗口:
#START THE APPLICATION
root = Tkinter.Tk()
root.title ("GEMEINDESTECKBRIEF-Menü")
# My main Application
runGUI = MainWorkspaceConfig (root)
root.mainloop ()
到目前为止没有任何问题!
现在我正在尝试打开第二个窗口,调用主类中的函数(有点像onClickFunction来打开窗口(
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()
仍然一切正常!窗口将按预期打开,并且 GUI 小部件也将显示并可用。完成给定的任务后,必须关闭窗口,这里所有的麻烦都开始了!!要退出窗口,我正在使用一个带有命令函数的按钮,如下所示:
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(( 不仅关闭了 secondWindow(childWindow(,还关闭了 MainWindow(parentWindow(。self.tkinterFrame.destroy(( 函数从窗口中清除所有小部件,但窗口仍然处于活动状态且可见!!
那么,有什么想法可以解决问题吗?将感谢任何解决方案!!!!
不要在实例中创建第二个Tk()
;你可以/应该只有一个根。
请改用顶级小组件进行facthwgeb
。另外,摆脱facthwgeb.mainloop()
调用,因为同样,应该只有一个调用。
是的,我终于找到了解决问题的方法!!!
第一步:在启动 ChildWindow 的主类中,我将函数 def opendirFactsheetHochwasserGebaeude (self) :
中的代码从 Tkinter.Tk()
更改为 Tkinter.Toplevel(parent)
=>父引用根窗口。更改 Tkinter 类型后,facthwgeb.mainloop()
也被清除,因为它是由 MainWindow(父窗口(提供的
第二步:在实现 ChildWindow 的第二个类中,函数def closeFactsheetHochwGeb (self):
确实私下拥有命令self.tkinterFrame.destroy()
这些命令清除了框架的小部件,但没有清除窗口本身,self.tkinterFrame.quit()
关闭主窗口和子窗口 =>所以这两个命令都没用!!
最后一步:最终解决方案是将self.tkinterFrame.destroy ()
更改为self.tkinterFrame.master.destroy()
!!
有时复杂的事情可能非常简单! :-(
试试这个self.Frame1.destroy()
或者无论您的框架名称如何有时你可能会有这个 self.Frame1 = tk.Frame(top)