1

您好,我正在努力在 python 中使用多个 tkinter 窗口。基本上,我有两个类也与两个不同的窗口有关。主类显示主窗口(parentWindow),另一个类显示第二个窗口(childWindow)。以下代码启动 MainWindow:

#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 ()函数从窗口中清除所有小部件,但窗口仍然处于活动状态且可见!!

那么,任何想法如何解决这个问题?将感谢任何解决方案!!!!

4

3 回答 3

7

不要进行第二次Tk()审查;你可以/应该只有一个根。

改为使用Toplevel小部件。facthwgeb此外,摆脱facthwgeb.mainloop()呼叫,同样,应该只有一个呼叫。

于 2013-03-19T10:28:04.533 回答
0

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

第一步:在启动 ChildWindow 的主类中,我将函数中的代码def opendirFactsheetHochwasserGebaeude (self) :从=>Tkinter.Tk()更改Tkinter.Toplevel(parent)为父级引用根窗口。更改 Tkinter 类型后,facthwgeb.mainloop()由于它是由 MainWindow(父级)提供的,因此也被清除了

第二步:在实现 ChildWindow 的第二类中,该函数def closeFactsheetHochwGeb (self):确实拥有self.tkinterFrame.destroy()清除框架小部件而不是窗口本身的命令,并self.tkinterFrame.quit()关闭 MainWindow 和 ChildWindow => 所以这两个命令都是无用的!

最后一步:最终的解决方案是self.tkinterFrame.destroy ()self.tkinterFrame.master.destroy()!!

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

于 2013-03-22T09:37:39.630 回答
0

试试这个self.Frame1.destroy() 或任何你的框架名称有时你可以有这个 self.Frame1 = tk.Frame(top)

于 2019-09-30T18:13:46.913 回答