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

时间:2015-10-15 20:49:16

标签: python tkinter

我试图在最后一小时寻找这个问题的答案,但我还没有找到任何答案。 (我觉得这应该在互联网上)。

当您单击父GUI框架上的按钮时,我正在尝试创建自定义弹出窗口。然后我希望用户输入变量,然后将这些变量返回到原始类。我本质上是一个弹出窗口输入选项。但是,我应该注意,并非所有选项都必须输入,它只取决于用户的情况。用户可以点击"选项"按钮在任何时候都是,所以当弹出窗口退出时,我希望它在最初命中选项按钮时返回到父GUI。我正在做的是以下内容:

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,popups,继承类和wait_window的问题,遗憾的是我仍然无法解决这个问题。

我也试过通过课程"选项"像这样:def __init__(self, master, options):(第3行),但它超过了参数的数量。

所以,主要问题: - 如何从弹出/类"选项"中传递变量?上课"家庭"? - 你有怎样的弹出/课程"选项"窗口等到关闭才恢复到班级" Home"?

1 个答案:

答案 0 :(得分:0)

好。我相信我已经在您的代码中实现了您遇到问题的内容,请参阅下面的进一步说明:

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。我认为这个对话支持类示例非常好。

希望它有所帮助!