You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决CustomTkinter中依赖型OptionMenu不显示子选项的问题

解决CustomTkinter依赖型CTkOptionMenu不更新选项的问题

在标准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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 10:27:04