简体   繁体   English

在选择Python之后立即选择optionmenu

[英]Getting the choice of optionmenu right after selection Python

I was wondering if there is any way for me to see what the User has selected among the list displaying, let's say: ["Apple","Orange","Grapes"] right after they select either one of them? 我想知道是否有任何方法可以让我看到用户在列表显示中选择了什么,让我们说: ["Apple","Orange","Grapes"]之后他们选择了其中一个?

Like when user clicks the optionbox, and clicks Apple, Tkinter will return something 就像用户点击选项框并点击Apple一样,Tkinter将返回一些内容

then if he switches his selection to, let's say, Orange, then that will also return something on the spot. 然后,如果他将他的选择切换到,那么就说,Orange,那么那也会在现场返回一些东西。

Thanks! 谢谢!


How to put parameter correctly? 如何正确放置参数?

from Tkinter import *

def option_changed(a):
    print "the user chose the value {}".format(variable.get())
    print a

master = Tk()

a = "Foo"
variable = StringVar(master)
variable.set("Apple") # default value
variable.trace("w", option_changed(a))

w = OptionMenu(master, variable, "Apple", "Orange", "Grapes")
w.pack()

mainloop()

Trace the StringVar . 跟踪StringVar

from Tkinter import *

def option_changed(*args):
    print "the user chose the value {}".format(variable.get())
    print a

master = Tk()

a = "Foo"
variable = StringVar(master)
variable.set("Apple") # default value
variable.trace("w", option_changed)

w = OptionMenu(master, variable, "Apple", "Orange", "Grapes")
w.pack()

mainloop()

Here, option_changed will be called whenever the user chooses an option from the option menu. 这里,只要用户从选项菜单中选择一个选项,就会调用option_changed


You can wrap the trace argument in a lambda to specify your own parameters. 您可以将trace参数包装在lambda中以指定您自己的参数。

def option_changed(foo, bar, baz):
    #do stuff

#...
variable.trace("w", lambda *args: option_changed(qux, 23, "hello"))

When I come across widgets with annoying interfaces - such as OptionMenu , I generally will write a class around it to abstract away the annoying attributes. 当我遇到烦人的界面小部件时 - 比如OptionMenu ,我通常会在它周围编写一个类来抽象出烦人的属性。 In this case, I really dislike the verbosity of using the StringVar every time I want to create a dropdown, so I simply created a DropDown class which includes the StringVar within the class (written in Python 3.5, but translates easily to all): 在这种情况下,我真的不喜欢每次我想创建一个下拉列表时使用StringVar的冗长,所以我只是创建了一个DropDown类,它包含了类中的StringVar (用Python 3.5编写,但很容易翻译成所有):

class DropDown(tk.OptionMenu):
    """
    Classic drop down entry

    Example use:
        # create the dropdown and grid
        dd = DropDown(root, ['one', 'two', 'three'])
        dd.grid()

        # define a callback function that retrieves the currently selected option
        def callback():
            print(dd.get())

        # add the callback function to the dropdown
        dd.add_callback(callback)
    """
    def __init__(self, parent, options: list, initial_value: str=None):
        """
        Constructor for drop down entry

        :param parent: the tk parent frame
        :param options: a list containing the drop down options
        :param initial_value: the initial value of the dropdown
        """
        self.var = tk.StringVar(parent)
        self.var.set(initial_value if initial_value else options[0])

        self.option_menu = tk.OptionMenu.__init__(self, parent, self.var, *options)

        self.callback = None

    def add_callback(self, callback: callable):
        """
        Add a callback on change

        :param callback: callable function
        :return: 
        """
        def internal_callback(*args):
            callback()

        self.var.trace("w", internal_callback)

    def get(self):
        """
        Retrieve the value of the dropdown

        :return: 
        """
        return self.var.get()

    def set(self, value: str):
        """
        Set the value of the dropdown

        :param value: a string representing the
        :return: 
        """
        self.var.set(value)

Example usage: 用法示例:

# create the dropdown and grid, this is the ONLY required code
dd = DropDown(root, ['one', 'two', 'three'])
dd.grid()

# optionally, define a callback function that retrieves the currently selected option then add that callback to the dropdown
def callback():
    print(dd.get())

dd.add_callback(callback)

Edited to add: Not long after creating this post, I got annoyed with a few other attributes of tk and ended up creating a package called tk_tools to make dropdowns and checkbuttons easier along with addressing other annoyances. 编辑添加:创建这篇文章后不久,我对tk的其他一些属性感到恼火,最后创建了一个名为tk_tools的软件包,使下拉和tk_tools按钮更容易解决其他烦恼。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM