Skip to main content
 首页 » 编程设计

Python Tkinter 子窗口问题

2025年05月04日15jpfss

您好, 我正在努力在 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() 实例;你可以/应该只有一个根。

使用 Toplevel facthwgeb 的小部件。另外,去掉 facthwgeb.mainloop() 调用,同样,应该只调用一次。