Tkinter:当第一次关闭另一个顶层窗口时更新顶层窗口?(参考?)

2024-09-30 02:26:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一个python初学者,正在制作一个程序,该程序应该保存并呈现campingsite的预订(只是为了好玩…)。我用面向对象的方式对它进行了结构化,这意味着我为每个单独的窗口定义了一个类。我需要做的是,当另一个顶层窗口(从子窗口2创建)关闭时,更新一个显示数据库条目的顶层窗口(子窗口2)。在

import Tkinter as tk

class MenuWindow(tk.Tk):
    def __init__(self, master):
        self.master = master

        #Widgets

    def open_subwindow1(self):
       self.window = Toplevel(self.master)
       self.SubSubWindow1 = SubSubWindow1(self.window)

    def open_subwindow2(self):
       self.window = Toplevel(self.master)
       self.SubSubWindow2 = SubSubWindow2(self.window)

class SubWindow1(tk.Tk):
    def __init__(self, master):
         self.master = master

         #Widgets

class Subwindow2(tk.TopLevel):
    def __init__(self, master):
         self.master = master

         #Widgets

         self.button = tk.Button(master, text='Quit', command=open_subsub1)

    def load_values(self):
        #loading sqlite db-values into listboxes

    def open_subsub1(self):
        self.window = Toplevel(self.master)
        self.SubSubWindow1 = SubSubWindow1(self.window)

class SubSubWindow1(tk.TopLevel):
    def __init__(self, master):
        self.master = master

        #Widgets

        self.button = tk.Button(master, text='Quit', command=on_quit)

    def on_quit(self):
        #Here I want to call a function that updates SubWindow2 (loads sqlite database values into several listboxes)

        self.master.destroy()

root = tk.Tk()
myprog = MyProg(root)

root.mainloop()

如何从SubSubWindow1访问Subwindow2中的函数?self.master只引用TopLevel()实例对吗?在

^{pr2}$

不行,我得到一个TypeError: unbound method load_values() must be called with SubWindow2 instance as first argument (got nothing instead)

这是一个未经验证的方法来“嵌套”顶层窗口吗?还有什么选择?在

任何评论都非常感谢!谢谢你的帮助


Tags: selfmasterinitdefopenwidgetswindowtk
1条回答
网友
1楼 · 发布于 2024-09-30 02:26:52

在这篇文章的开头,我应该声明我也是一个新手,我将非常感谢其他人的建议,以免传播错误信息。在

据我所见,您对Python中继承与封装的工作方式存在一些误解。首先,在Tkinter应用程序中,应该只有一个Tk()实例。在你的类定义中,你声明。。。在

class SubWindow1(tk.Tk):

这意味着,每当您创建一个新的SubWindow1时,Tk的一个新实例将被实例化,SubWindow1将继承它的所有属性。在

如果您想创建一个引用顶级实例并具有所有属性的类,那么您的子窗口2是正确的。在

^{pr2}$

但是,在init中,还必须初始化Toplevel的此实例:

class SubWindow2(tk.Toplevel):
    def __init__(self, master):
        tk.Toplevel.__init__(self)
        self.master = master

每个“master”都引用它上面的元素。Tk应用程序的工作方式是树状层次结构。这就是为什么你应该只有一个Tk()的实例,它作为你的“根”。这个Tk实例中包含窗口,其中包含窗口或元素。因此,每个窗口或元素都有一个父级,称为master,这样您就可以四处导航了。在

因此,当您创建子窗口2的实例时,它引用子窗口2中的所有内容,以及顶层实例中包含的所有内容。因为“自我”现在指的是顶层,你可以把它传给孩子们成为大师,比如:

self.sub_sub_window1 = SubSubWindow1(self)

self.master only refers to the TopLevel() instance right?

是的,但是由于您将通过SubWindow2继承继承继承所有顶层属性,所以您可以添加更多方法,并且仍然可以通过自我控制标签。在

最后,您还应该调用pack()来处理希望在窗口中正确显示的元素。在

总之,我对您的程序进行了一些编辑,以尝试演示继承的一些概念以及它在Tkinter应用程序中的工作方式。我希望你能看看这个,从中得到一些东西。请让我知道,如果有任何你不同意的元素,因为它远不是完美的。在

import Tkinter as tk

class MenuWindow():
    def __init__(self, master):
        self.master = master
        self.sub_window_1 = SubWindow1(self.master)
        self.sub_window_2 = SubWindow2(self.master)

class SubWindow1(tk.Toplevel):
    def __init__(self, master):
        tk.Toplevel.__init__(self)
        self.master = master

class SubWindow2(tk.Toplevel):
    def __init__(self, master):
        tk.Toplevel.__init__(self)
        self.master = master
        self.sub_sub_window1 = SubSubWindow1(self)

    def print_hello(self):
        print "Hello!"

class SubSubWindow1(tk.Toplevel):
    def __init__(self, master):
        tk.Toplevel.__init__(self)
        self.master = master
        self.button = tk.Button(self.master, text='Say Hello & Destroy', command=self.on_quit)
        self.button.pack()

    def on_quit(self):
        self.master.print_hello()
        self.master.destroy()

root = tk.Tk()
myprog = MenuWindow(root)
root.mainloop()

相关问题 更多 >

    热门问题