用户单击后如何更改选项菜单的值?

How to change the value of an option menu after user clicks?

我在玩选项菜单。我有一个名为选项的国家列表。选项菜单设置为选项的第一个索引。如果用户点击不同的国家/地区,我该如何更新该值?基本上,即使我在选项菜单中单击第二个(选项[1])国家,该功能也不起作用。

def first_country():
    from_country = start_clicked.get()
    if from_country == options[1]:
        my_pic = Image.open("usa_flag.png")
        resized = my_pic.resize((200, 100), Image.ANTIALIAS)
        new_pic = ImageTk.PhotoImage(resized)
        flag_label = Label(root, image=new_pic)
        flag_label = Label(root, text="function works")
        flag_label.grid(row=3, column=0)

start_clicked = StringVar()
start_clicked.set(options[0])
dropdown = OptionMenu(root, start_clicked, *options, command=first_country())  

在 Python 中,只要您将 () 添加到函数的末尾,它就会调用它。 (除声明外)

在这种情况下,通常情况下,当您要将函数传递给某物时,您只需要传递对该函数的引用

实际上,只需删除 ()

dropdown = OptionMenu(root, start_clicked, *options, command=first_country)    

acw1668 的评论解释得很好:

command=first_country() should be command=first_country instead. The former one will execute the function immediately and assign None to command.

command=first_country() 应该是 command=first_country。前者将立即执行函数并将 None (函数的结果)分配给 command 选项。

OptionMenucommand 选项的回调也需要一个参数,该参数是所选项目:

def first_country(from_country):
    if from_country == options[1]:
        my_pic = Image.open("usa_flag.png")
        resized = my_pic.resize((200, 100), Image.ANTIALIAS)
        new_pic = ImageTk.PhotoImage(resized)
        # better create the label once and update its image here
        flag_label.config(image=new_pic)
        flag_label.photo = new_pic # save a reference of the image

...
dropdown = OptionMenu(root, start_clicked, *options, command=first_country)
...
# create the label for the flag image
flag_label = Label(root)
flag_label.grid(row=3, column=0)
...

请注意,我已经为旗帜图像创建了一次标签,并在函数内部更新了它的图像。如果在函数内创建图像,还需要保存图像的引用,否则将被垃圾收集。