Python 根据在其他选项菜单中选择的内容更改选项菜单
我目前正在尝试制作两个Python 根据在其他选项菜单中选择的内容更改选项菜单,python,dynamic,tkinter,optionmenu,Python,Dynamic,Tkinter,Optionmenu,我目前正在尝试制作两个选项菜单s,其中第二个将根据第一个选项菜单中选择的内容动态更新 例如,我想使选项菜单成为带有列表的 [North America, Europe, Asia] 如果选择了Asia,则选项菜单B将更改为类似[日本、中国、马来西亚]的内容 如果选择了Europe,则它将更改为[德国、法国、瑞士] 我可以创建两个选项菜单s,但无法根据选项菜单A的状态更新选项菜单B 有没有人能证明这样的事情是可能的 是的,这是可能的。使用StringVar.trace可以检查第一个选项何时更
选项菜单
s,其中第二个将根据第一个选项菜单
中选择的内容动态更新
例如,我想使选项菜单成为带有列表的
[North America, Europe, Asia]
- 如果选择了
,则Asia
将更改为类似选项菜单B
的内容[日本、中国、马来西亚]
- 如果选择了
,则它将更改为Europe
[德国、法国、瑞士]
选项菜单
s,但无法根据选项菜单A
的状态更新选项菜单B
有没有人能证明这样的事情是可能的 是的,这是可能的。使用
StringVar.trace
可以检查第一个选项何时更改。然后删除第二个选项菜单的所有选项,并用相应的选项填充它。如果您有一个类似于字典的数据结构,那么可以很容易地映射对应关系:
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()
嗨,我只是想补充一点。我设法使3个动态选项菜单,其中两个是从以前的下拉菜单更新
from tkinter import *
root = Tk()
def update_options_B(*args):
countries = data[variable_a.get()]
variable_b.set(countries[0])
menu = optionmenu_b['menu']
menu.delete(0, 'end')
for country in countries:
menu.add_command(label=country, command=lambda nation=country: variable_b.set(nation))
def update_options_C(*args):
cities = data2[variable_b.get()]
variable_c.set(cities[0])
menu = optionmenu_c['menu']
menu.delete(0, "end")
for city in cities:
menu.add_command(label=city, command=lambda nation=city: variable_c.set(nation))
data = {'Asia': ['Japan', 'China', 'Malasia'],'Europe': ['Germany', 'France', 'Switzerland'], 'Africa': ['Nigeria', 'Kenya', 'Ethiopia']}
data2 = {'Japan': ["jiustu", "kamikaz", "Tokyo"], 'China': ["Shaigon", "Hong Kong"], 'Malasia': ["tiramusto", "quala lopour"], 'Germany': ["Dusseldorf", "Berlin", "Hambourg"], 'France': ["Paris", "Lille"], 'Switzerland': ["Biern", "Bonn"], 'Nigeria': ['Nigeria1', 'Nigeria3'], 'Kenya': ["Keny West", "Notorious"], 'Ethiopia': ["Etanpi", "Neeandertaal"]}
variable_a = StringVar()
variable_b = StringVar()
variable_c = StringVar()
variable_a.trace('w', update_options_B)
variable_b.trace('w', update_options_C)
optionmenu_a = OptionMenu(root, variable_a, *data.keys())
optionmenu_b = OptionMenu(root, variable_b, '')
optionmenu_c = OptionMenu(root, variable_c, '')
variable_a.set('Asia')
optionmenu_a.pack()
optionmenu_b.pack()
optionmenu_c.pack()
root.mainloop()
“self.variable_a.set('Asia')”命令是否会自动触发updateoptions(),从而设置self.optionmenu_b?