python - 根据在另一个 OptionMenu 中选择的内容更改 OptionMenu

标签 python dynamic tkinter optionmenu

我目前正在尝试制作两个 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/

相关文章:

python - 使用 dask 合并 csv 文件

scala - 如何使用特征 scala.Proxy

python - 如何向按钮添加 Shift-Click 选项

java - 从 Java 调用 python 模块时出错

javascript - Bokeh,如何使用 CustomJS 回调更改用于字形颜色的列?

python - 在 unittest tearDown 方法中断言是否可以?

javascript - 如何获取键盘上的箭头键以触发博客中的导航(上一页/下一页)链接

WCF:我需要用动态命名空间替换 "http://tempuri.org/"吗?

框架中的 Python Tkinter 标签

python - 在 macOS 中通过 tkinter 窗口刷新(更新)非常慢 [python、PySimpleGUI、Tkinter、macOS]