如何使用两个独立的类和继承在tkinter中创建一个自定义弹出窗口?

2024-06-17 18:28:04 发布

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

我在过去的一个小时里试图寻找这个问题的答案,但什么也没找到。(我觉得这个应该放在网上)。在

当你点击父图形用户界面上的一个按钮时,我正在尝试创建一个自定义弹出窗口。然后我希望用户输入变量,然后将这些变量返回到原始类。我基本上是弹出一个输入选项。但是,我要注意的是,并不是所有的选项都必须输入,它只是取决于用户的情况。用户也可以在任何时候点击“选项”按钮,所以当弹出窗口退出时,我希望它在最初点击选项按钮时返回到父图形用户界面。我所做的是:

from Tkinter import *

class Home(Frame):  #This class defines the main(master) GUI

    def __init__(self, master):
        Frame.__init__(self, master)

    #Other methods in class "Home" that get, variables, etc.

    def call_popup(self):
        options_popup = Options(self)

        #wait_window does not work here
        self.master.wait_window(options_popup)

class Options(Toplevel):    #This class defines the popup GUI

    def __init__(self, master):
        Toplevel.__init__(self, master)
        self.popup = self

    #Other methods in class "Options"

    def get_variable(self): #Just an example methods in class "Options"
        #Simplified code but lets say I now have the variable foo in self.foo, unique to class "Options"
    #I want to pass this variable back to class "Home"

    def exit_popup(self):
        self.popup.destroy()

        #I want it to return to the spot that the user was originally at
        #when they hit the "options button" in the home GUI.  I also want all
        #values inputted in the "options" popup to return to the class "Home"

root = Tk()
Home(root)
root.mainloop()

我相信问题的一个(很大的)部分是我对类(以及Tkinter)相当陌生。在

我看过很多关于tkinter、弹出窗口、类继承和等待窗口的问题,但不幸的是,我仍然无法理解。在

我也尝试过像这样传递类“Options”:def __init__(self, master, options):(第3行),但是它超过了参数的数量。在

所以,主要问题是: -如何将变量从popup/class“Options”传递到class“Home”? -如何让弹出窗口/类“选项”窗口等到关闭后再返回类“主页”?在


Tags: theto用户inselfmasterhomeinit
1条回答
网友
1楼 · 发布于 2024-06-17 18:28:04

好吧。我相信我已经在代码中实现了您遇到的问题,请参见下面的进一步解释:

from Tkinter import *

class Home(Frame):

    def __init__(self, master):
        Frame.__init__(self, master)
        self.entryvalue = None  # this will store the popop entry value
        self.call_popup(self)
        print("Popup closed!")
        print("Entry value:" + self.entryvalue)

    def call_popup(self, master):
        options_popup = Options(master)
        options_popup.wait_window()



class Options(Toplevel):

    def __init__(self, master):
        Toplevel.__init__(self, master)
        self.master = master

        # add an entry widget
        self.e1 = Entry(self)
        self.e1.pack()

        # add a button
        b1 = Button(self, text="Popup button", command=self.buttonpressed)
        b1.pack()

    def buttonpressed(self):
        self.master.entryvalue = self.e1.get()
        self.exit_popup()

    def exit_popup(self):
        self.destroy()


root = Tk()
Home(root)
root.mainloop()

你的第一个问题。您需要为popup/options对象提供一个对希望数据结束的对象的引用,在本例中是home对象。如您所见,我将它作为一个新参数传递给弹出窗口的init方法。然后我向按钮添加了一个命令,该命令将在home对象中设置entryvalue变量。这也可能是函数调用或类似的调用。在

为了让代码等待窗口完成,您应该对options_popup对象调用wait_window()方法,因为这是您正在等待的。您也可以将它移到弹出窗口的init方法,并在self上调用它。在

有关对话框窗口的详细信息,请看这个article。我认为这个对话框支持类的例子很好。在

希望有帮助!在

相关问题 更多 >