如何解决CustomTkinter中依赖型OptionMenu不显示子选项的问题
在标准Tkinter中用Combobox实现的依赖型下拉列表运行正常,但切换到CustomTkinter的CTkOptionMenu后,仅第一个“州”的下拉菜单能显示选项,城市和法院的下拉菜单无选项显示,且无任何报错信息。
问题原因
CustomTkinter的CTkOptionMenu组件不支持像Tkinter原生ttk.Combobox那样通过combo['values']直接赋值更新选项,必须使用组件提供的configure()方法来动态修改values参数。
修复后的完整代码
from tkinter import * import customtkinter class Ncase: x= { 'Gujarat': { 'Ahmedabad': ['Court 1', 'Court 2', 'Court 3'], 'Surat': ['Court 4', 'Court 5', 'Court 6'] }, 'Maharashtra': { 'Mumbai': ['Court A', 'Court B', 'Court C'], 'Pune': ['Court X', 'Court Y', 'Court Z'], } } def __init__ (self,master): self.master = master # Create Variables for combo box self.state_var = customtkinter.StringVar(master) self.state_var.set('Select State') self.state_var.trace('w', self.on_state_change) self.city_var = customtkinter.StringVar(master) self.city_var.set('Select City') self.city_var.trace('w', self.on_city_change) self.court_var = customtkinter.StringVar(master) self.court_var.set('Select Court') #state lstate=customtkinter.CTkLabel(master,text="State",padx=5,pady=5,anchor="w", justify="left",font=("arial",16)) lstate.grid(column=0,row=2,sticky=E,pady=(0,20)) state_combo = customtkinter.CTkOptionMenu(self.master, variable=self.state_var,values=list(self.x.keys()), state='readonly', width=300,font=("arial",16)) state_combo.grid(column=1,row=2,padx=5,pady=(0,20)) #city lcity=customtkinter.CTkLabel(master,text="City",padx=5,pady=5,anchor="w", justify="left",font=("arial",16)) lcity.grid(column=2,row=2,sticky=E,pady=(0,20)) self.city_combo = customtkinter.CTkOptionMenu(self.master, variable=self.city_var, values=['Select City'],state='readonly',width=300, font=("arial",16)) self.city_combo.grid(column=3,row=2,padx=5,pady=(0,20)) #name of court cname=customtkinter.CTkLabel(master,text="Select Court",padx=5,pady=5,anchor="w", justify="left",font=("arial",16)) cname.grid(column=4,row=2,sticky=E,pady=(0,20)) self.court_combo = customtkinter.CTkOptionMenu(self.master, variable=self.court_var, values=['Select Court'], state='readonly',width=300, font=("arial",16)) self.court_combo.grid(column=5,row=2,padx=5,pady=(0,20)) def on_state_change(self, *args): selected_state = self.state_var.get() # 改用configure方法更新选项 self.city_combo.configure(values=list(self.x.get(selected_state, {}).keys())) self.city_var.set('Select City') self.court_var.set('Select Court') def on_city_change(self, *args): selected_state = self.state_var.get() selected_city = self.city_var.get() # 改用configure方法更新选项 self.court_combo.configure(values=self.x.get(selected_state, {}).get(selected_city, [])) self.court_var.set('Select Court') if __name__ == "__main__": root = Tk() root.title("Main Window") ncase_app = Ncase(root) root.mainloop()
关键修改点
- 将
self.city_combo['values'] = ...替换为self.city_combo.configure(values=...) - 将
self.court_combo['values'] = ...替换为self.court_combo.configure(values=...)
内容的提问来源于stack exchange,提问作者RAHUL THAKRANI
相关产品推荐
相关产品推荐

