[英]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.