单击按钮时更改 OptionMenu 的选项

Posted

技术标签:

【中文标题】单击按钮时更改 OptionMenu 的选项【英文标题】:Changing the options of a OptionMenu when clicking a Button 【发布时间】:2013-07-08 22:45:20 【问题描述】:

假设我有一个选项菜单 network_select,其中包含要连接的网络列表。

import Tkinter as tk

choices = ('network one', 'network two', 'network three')
var = tk.StringVar(root)
network_select = tk.OptionMenu(root, var, *choices)

现在,当用户按下刷新按钮时,我想更新用户可以连接的网络列表。

我不能使用 .config,因为我查看了 network_select.config() 并没有看到一个看起来像我给它的选项的条目。 我不认为这是可以使用 tk 变量来改变的,因为没有 ListVar 这样的东西。

【问题讨论】:

让它成为对象变量怎么样? 【参考方案1】:

我修改了您的脚本以演示如何执行此操作:

import Tkinter as tk

root = tk.Tk()
choices = ('network one', 'network two', 'network three')
var = tk.StringVar(root)

def refresh():
    # Reset var and delete all old options
    var.set('')
    network_select['menu'].delete(0, 'end')

    # Insert list of new options (tk._setit hooks them up to var)
    new_choices = ('one', 'two', 'three')
    for choice in new_choices:
        network_select['menu'].add_command(label=choice, command=tk._setit(var, choice))

network_select = tk.OptionMenu(root, var, *choices)
network_select.grid()

# I made this quick refresh button to demonstrate
tk.Button(root, text='Refresh', command=refresh).grid()

root.mainloop()

点击“刷新”按钮后,network_select 中的选项被清除,new_choices 中的选项被插入。

【讨论】:

谢谢!每个 Tkinter 小部件都有 .keys() 吗? help(network_select['menu']) 是我需要的!【参考方案2】:

相同,但使用 tk.Menu 小部件:

# Using lambda keyword and refresh function to create a dynamic menu.
import tkinter as tk

def show(x):
    """ Show menu items """
    var.set(x)

def refresh(l):
    """ Refresh menu contents """
    var.set('')
    menu.delete(0, 'end')
    for i in l:
        menu.add_command(label=i, command=lambda x=i: show(x))

root = tk.Tk()
menubar = tk.Menu(root)
root.configure(menu=menubar)
menu = tk.Menu(menubar, tearoff=False)
menubar.add_cascade(label='Choice', menu=menu)

var = tk.StringVar()
l = ['one', 'two', 'three']
refresh(l)
l = ['four', 'five', 'six', 'seven']
tk.Button(root, text='Refresh', command=lambda: refresh(l)).pack()
tk.Label(root, textvariable=var).pack()
root.mainloop()

【讨论】:

【参考方案3】:

在使用 ttk 的情况下,OptionMenu 对象上有一个方便的set_menu(default=None, values) 方法。

【讨论】:

以上是关于单击按钮时更改 OptionMenu 的选项的主要内容,如果未能解决你的问题,请参考以下文章

iphone在按钮单击时更改标签栏项目

单击按钮时更改框架布局的内容

如果单击按钮,下拉列表选项会更改(VueJS 和 Laravel 6)

如何通过单击选项卡来更改操作栏菜单按钮

如何在单击按钮时将按钮颜色保存到共享首选项?

如何通过动态单击按钮来更改选项卡标题名称?