我目前正在尝试制作两个 OptionMenu
,其中第二个将根据第一个 OptionMenu
中选择的内容动态更新。
例如,我想用列表制作OptionMenu_A
[North America, Europe, Asia]
- 如果选择了
Asia
,则OptionMenu_B
将更改为类似[Japan, China, Malasia]
的内容。 - 如果选择了
Europe
,那么它将变为例如[Germany, France, Switzerland]
。
我可以制作两个 OptionMenu
,但无法让 OptionMenu_B
根据 OptionMenu_A
的状态进行更新。
是否有人愿意证明这种事情是否可能?
最佳答案
是的,这是可能的。使用 StringVar.trace
,您可以检查第一个选项何时更改。然后删除第二个 OptionMenu 的所有选项,并用相应的选项填充它。如果你在这背后有一个像字典这样的数据结构,那么映射对应关系就很容易了:
import sys
if sys.version_info[0] >= 3:
import tkinter as tk
else:
import Tkinter as tk
class App(tk.Frame):
def __init__(self, master):
tk.Frame.__init__(self, master)
self.dict = {'Asia': ['Japan', 'China', 'Malaysia'],
'Europe': ['Germany', 'France', 'Switzerland']}
self.variable_a = tk.StringVar(self)
self.variable_b = tk.StringVar(self)
self.variable_a.trace('w', self.update_options)
self.optionmenu_a = tk.OptionMenu(self, self.variable_a, *self.dict.keys())
self.optionmenu_b = tk.OptionMenu(self, self.variable_b, '')
self.variable_a.set('Asia')
self.optionmenu_a.pack()
self.optionmenu_b.pack()
self.pack()
def update_options(self, *args):
countries = self.dict[self.variable_a.get()]
self.variable_b.set(countries[0])
menu = self.optionmenu_b['menu']
menu.delete(0, 'end')
for country in countries:
menu.add_command(label=country, command=lambda nation=country: self.variable_b.set(nation))
if __name__ == "__main__":
root = tk.Tk()
app = App(root)
app.mainloop()
关于python - 根据在另一个 OptionMenu 中选择的内容更改 OptionMenu,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17252096/