【问题标题】:How do you make a custom popup in tkinter using two seperate classes and inheritance?如何使用两个单独的类和继承在 tkinter 中制作自定义弹出窗口?
【发布时间】:2015-10-15 20:49:15
【问题描述】:

在过去的一个小时里,我一直试图寻找这个问题的答案,但我没有找到任何东西。 (我觉得这应该在互联网上)。

当您单击父 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、弹出窗口、类继承和 wait_window 的问题,但遗憾的是我仍然无法弄清楚。

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

所以,主要问题: -如何将变量从弹出窗口/类“选项”传递到“主页”类? -你如何让弹出/类“选项”窗口等到关闭才能恢复到“主页”类?

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

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

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

    希望对你有帮助!

    【讨论】:

    • 感谢您的帮助!我无法立即进行此操作,但是当我这样做时,它运行良好。我确实必须更改一些东西,因为我忘了提到弹出窗口仅在用户按下主页对象中的按钮时才会显示,而不是像在这种情况下运行 GUI 时那样自动显示。
    • 很高兴听到它有帮助!
    猜你喜欢
    • 2020-11-09
    • 1970-01-01
    • 2015-05-10
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    相关资源
    最近更新 更多