【问题标题】:Python Tkinter Child Window IssuePython Tkinter 子窗口问题
【发布时间】:2023-04-08 14:38:02
【问题描述】:

您好, 我正在努力在 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() 函数会清除窗口中的所有小部件,但窗口仍然处于活动状态且可见!!

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

【问题讨论】:

    标签: python user-interface python-2.7 tkinter


    【解决方案1】:

    不要创建第二个Tk() 实例;你可以/应该只有一个根。

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

    【讨论】:

    • 感谢您的留言,我已经尝试过 Toplevel,它根本不会改变 self.tkinterFrame.quit() 函数的行为!是否可以只清除 facthwgeb.mainloop()??
    • @freeski_52:由于您的代码没有解释 self.tkinterFrame 的来源,我无法确定,但是当您使用 Toplevel 小部件时,destroy() 不会做您想做的事情?
    • self.tkinterFrame 是对Tkinter.Frame() Widgetdestroy() 的引用,在我的情况下,它只是清除窗口的小部件,而不是窗口本身
    • 然后销毁Toplevel而不是Frame?
    • 这确实是个好主意,但我不知道该怎么做!关闭窗口的按钮在第二个类中实现,该按钮的onClick函数也是如此。启动窗口的功能在主类中,那么如何检查单击的按钮然后在主类中销毁框架?
    【解决方案2】:

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

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

    第二步:在实现 ChildWindow 的第二类中,函数 def closeFactsheetHochwGeb (self):did 私有地拥有命令 self.tkinterFrame.destroy(),它清除了框架的小部件,但没有清除窗口本身和 @987654327 @closes MainWindow 和 ChildWindow => 所以这两个命令都没用!!

    最后一步:最后的解决办法是将self.tkinterFrame.destroy ()改为self.tkinterFrame.master.destroy()!!

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

    【讨论】:

      【解决方案3】:

      试试这个self.Frame1.destroy() 或者无论你的框架名称可能是什么 有时你可以拥有这个 self.Frame1 = tk.Frame(top)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-20
        • 2012-06-24
        • 1970-01-01
        相关资源
        最近更新 更多