繁体   English   中英

Tkinter python 依赖组合框

[英]Tkinter python dependent combobox

我是 python 和 arcpy 用户,我有一个关于依赖组合框的问题。 其实我在这里问过同样的话题,但还没有人回答。 我从这里这里得到了答案。 但我认为我对 python 编程太新手了,我没有清楚地得到答案。 我在下面尝试我的代码,基于我之前得到的答案:

import Tkinter
from Tkinter import *

root = Tkinter.Tk()

bu = StringVar()
bu.set("")
businessunit = ["DUM", "IND", "KAM", "RAP"]
bu_menu = OptionMenu(root, bu, *businessunit, command=Combobox_1)
bu_menu.config(bg="white", fg="dark blue", width=3, relief=GROOVE)
bu_menu.place(x=95, y=110)

sec = StringVar()
sec.set("")
sector = {"DUM":['GRG', 'KBU', 'LBO', 'PLS', 'PLU', 'PPR', 'RPT', 'SBI', 'SKB'],
                "IND":['BYS','MER','NGD','PER','SJG','SLJ'],
                "KAM":['RSG','SRG','SRY','TSK'],
                "RAP":['BAS','CER','LGB','LON','LOS','MDU','MRE','MRW','PEN','PES','PPD','TEE','TEW','TSB','UKU']}
sec_menu = OptionMenu(root, sec, *sector, command=Combobox_2)
sec_menu.config(bg="white", fg="dark blue", width=3, relief=GROOVE)
sec_menu.place(x=155, y=110)

def __init__(self):

    def Combobox_1(businessunit):
        print bu.get()

    def Combobox_2(sector):
        print sec.get()

    self.Combobox_1.activated[str].connect(self.on_combo_activated)

def on_combo_activated(self, text):
    self.Combobox_2.clear()
    self.Combobox_2.addItems(self.sector[text])

root.pack()
root.mainloop()
root.destroy()

请任何人帮助我。 非常感谢您的回答。

编辑:

在这种情况下,依赖组合框意味着:

如果在 Combobox_1 中选择了 DUM,则 Combobox_2 将只显示 GRG、KBU、LBO 等。

如果在 Combobox_1 中选择了 IND,则 Combobox_2 将只显示 BYS、MER、PER 等。

如果在 Combobox_1 中选择了 KAM,则 Combobox_2 将只显示 RSG、SRG、SRY 等。

如果在 Combobox_1 中选择了 RAP,则 Combobox_2 将仅显示 BAS、CER、LGB 等。

我建议查看: 根据在另一个 OptionMenu 中选择的内容更改 OptionMenu

只需在菜单中根据需要更改值。

(此外,您不需要两次导入 Tkinter,只需使用“import Tkinter”或“import Tkinter as tk”即可)

感谢您的贡献。 其实我之前在我的问题中已经得到了这个问题的答案。 请参阅此链接分级组合框菜单 Python Tkinter

这称为级联组合框。 基本上在您的命令(操作)中,您然后根据第一个选择的值创建带有数据的第二个框。 对于我不知道其他方式的数据库,这很容易,但某种数组或字典也应该可以正常工作。

我是在从我的应用程序调用的一个类中完成的,所以这有点复杂,但如果你不想打扰类 vals 是一个看起来像 {'value1':number,'value2' 的字典,可以很容易地简化:number2} 以保留数据库调用所需的索引以获取更多值或其他内容。 我正在使用 .grid 你可以使用 pack 或任何适合你的东西。

def ebox(self, index=None, row=None, column=None, vals=None):
        self.value[index] = tk.StringVar()
        lis = []
        for item in vals:
            lis.append(item)
        self.combos[index] = ttk.Combobox(self.win, values=lis, textvariable=self.value[index])
        self.combos[index].bind("<<ComboboxSelected>>", lambda event, y=vals: self.eboxclk(event, y))
        self.combos[index].grid(row=row, column=column)
        return

    def eboxclk(self, event=None, index=None):
        print(event.widget.get(), " widget get ")
        print(index[event.widget.get()], " this should be your index")
        return

我为我的小部件初始化了一个字典,但你可以跳过它,只是

    mycombo = ttk.Combobox(master,values=alist, textvariable=tk.StringVar)
    mycombo.bind('<<ComboboxSelected>>', lambda event, dict: dosomething(event, dict)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM