Python Tkinter子窗口问题

1 投票
3 回答
3657 浏览
提问于 2025-04-17 19:37

你好

我在使用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 个回答

0

试试这个 self.Frame1.destroy(),或者你可以用你框架的名字。 有时候你可能会看到这样的代码 self.Frame1 = tk.Frame(top)

7

不要创建第二个 Tk() 实例;你只能有一个主窗口。

可以使用 Toplevel 组件来处理 facthwgeb。另外,去掉 facthwgeb.mainloop() 这个调用,因为应该只调用一次这个。

0

太好了,我终于找到了解决我问题的方法!!

第一步:在主类中,也就是启动子窗口的地方,我把函数 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()!!

有时候复杂的事情其实可以很简单!! :-)

撰写回答