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

如何修改TTK Checkbutton状态?实现单选互斥遇问题

解决TTK Checkbutton单选(互斥选中)问题

你的问题出在错误使用state属性控制选中状态:state参数是用来设置按钮的启用/禁用状态(比如disabled会让按钮变灰不可用),而Checkbutton的选中状态是由绑定的variable变量来控制的。

下面是两种可行的解决方案:

方案一:共享变量实现自动互斥(推荐)

给两个Checkbutton绑定同一个变量,设置不同的onvalue,这样选中其中一个时,另一个会自动取消选中,无需手动处理:

import tkinter as tk
from tkinter import ttk
import sv_ttk

class App(tk.Tk):
    def __init__(self):
        super().__init__()
        sv_ttk.use_dark_theme()

        self.geometry('1200x800')
        self.title("Menu")
        self.resizable(0,0)

        self.columnconfigure(0, weight=2)
        self.columnconfigure(1, weight=0)

        # 创建共享变量,用于控制两个Checkbutton的选中状态
        self.selection_var = tk.StringVar(value="")

        rowCount = 0
        # 绑定共享变量,设置不同的onvalue
        self.createBooking = ttk.Checkbutton(
            self, 
            text="View film listing", 
            style="Toggle.TButton",
            variable=self.selection_var,
            onvalue="view",
            offvalue="",
            command=lambda : self.button_selection(0)
        )
        self.createBooking.grid(column=0, row=rowCount, sticky=tk.W, padx=5, pady=5)
        rowCount+=1

        self.viewFilmListing = ttk.Checkbutton(
            self, 
            text="Create booking", 
            style="Toggle.TButton",
            variable=self.selection_var,
            onvalue="create",
            offvalue="",
            command=lambda : self.button_selection(1)
        )
        self.viewFilmListing.grid(column=0, row=rowCount, sticky=tk.W, padx=5, pady=5)
        

    def button_selection(self, option):
        if option == 0: 
            print("调用影片列表功能")
            # 这里可以添加你的业务逻辑
        elif option == 1:
            print("调用创建预订功能")
            # 这里可以添加你的业务逻辑

if __name__ =="__main__":
    app=App()
    app.mainloop()

方案二:手动控制独立变量

如果需要给每个Checkbutton绑定独立变量,可在选中时手动修改另一个变量的值来取消选中:

import tkinter as tk
from tkinter import ttk
import sv_ttk

class App(tk.Tk):
    def __init__(self):
        super().__init__()
        sv_ttk.use_dark_theme()

        self.geometry('1200x800')
        self.title("Menu")
        self.resizable(0,0)

        self.columnconfigure(0, weight=2)
        self.columnconfigure(1, weight=0)

        # 为每个Checkbutton创建独立变量
        self.view_var = tk.BooleanVar(value=False)
        self.create_var = tk.BooleanVar(value=False)

        rowCount = 0
        self.createBooking = ttk.Checkbutton(
            self, 
            text="View film listing", 
            style="Toggle.TButton",
            variable=self.view_var,
            command=lambda : self.button_selection(0)
        )
        self.createBooking.grid(column=0, row=rowCount, sticky=tk.W, padx=5, pady=5)
        rowCount+=1

        self.viewFilmListing = ttk.Checkbutton(
            self, 
            text="Create booking", 
            style="Toggle.TButton",
            variable=self.create_var,
            command=lambda : self.button_selection(1)
        )
        self.viewFilmListing.grid(column=0, row=rowCount, sticky=tk.W, padx=5, pady=5)
        

    def button_selection(self, option):
        if option == 0: 
            # 选中"View film listing"时,取消另一个的选中状态
            self.create_var.set(False)
            print("调用影片列表功能")
        elif option == 1:
            # 选中"Create booking"时,取消另一个的选中状态
            self.view_var.set(False)
            print("调用创建预订功能")

if __name__ =="__main__":
    app=App()
    app.mainloop()

关键说明

  • Checkbutton的选中状态由variable绑定的变量控制,通过var.set(True/False)(或对应自定义值)来切换选中状态
  • state属性仅控制按钮是否可交互,和选中状态无关
  • 使用Toggle.TButton样式时,变量控制选中状态的逻辑依然生效

内容的提问来源于stack exchange,提问作者OttoLuck

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 11:35:26