用户单击后如何更改选项菜单的值?
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
选项。
OptionMenu
的 command
选项的回调也需要一个参数,该参数是所选项目:
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)
...
请注意,我已经为旗帜图像创建了一次标签,并在函数内部更新了它的图像。如果在函数内创建图像,还需要保存图像的引用,否则将被垃圾收集。
我在玩选项菜单。我有一个名为选项的国家列表。选项菜单设置为选项的第一个索引。如果用户点击不同的国家/地区,我该如何更新该值?基本上,即使我在选项菜单中单击第二个(选项[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
选项。
OptionMenu
的 command
选项的回调也需要一个参数,该参数是所选项目:
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)
...
请注意,我已经为旗帜图像创建了一次标签,并在函数内部更新了它的图像。如果在函数内创建图像,还需要保存图像的引用,否则将被垃圾收集。