如何在Tkinter中实现跨类调用复选框全选功能?
解决方案
要实现Win1窗口的"AUTO"按钮选中Win3所有复选框并跳转Win2的功能,只需对代码做以下关键修改:
修改后的完整代码
from tkinter import * import tkinter as tk class Win1(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) Label(self, text= "ISMC", font= ('Helvetica 20 bold')).pack(padx=5, pady=5) # 调整AUTO按钮逻辑:先选中Win3所有复选框,再跳转Win2 b1=Button(self, text="AUTO", command=lambda: [controller.frames[Win3].select_all(), controller.show_frame(Win2)]).pack(padx=5, pady=5) class Win2(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) b1=Button(self, text= "button 1", command=lambda:controller.show_frame(Win3)).pack(padx=5, pady=5) b2=Button(self, text= "button 1").pack(padx=5, pady=5) b3=Button(self, text= "button 3").pack(padx=5, pady=5) b4=Button(self, text= "PROCEED").pack(padx=5, pady=5) b5=Button(self, text= "BACK", command=lambda:controller.show_frame(Win1)).pack(padx=5, pady=5) class Win3(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) val_x=0 val_y=10 self.vars = [] self.array = [] for i in range(3): self.array.append("RELAY " + str(i+1)) self.vars.append(StringVar()) self.vars[-1].set(0) Checkbutton(self, text=self.array[i], variable=self.vars[-1], onvalue=1, offvalue=0).place(x=val_x, y=val_y) val_y=val_y+50 # 新增选中所有复选框的方法 def select_all(self): for var in self.vars: var.set(1) b1=Button(self, text="back", bg="red", fg="white", command=lambda:controller.show_frame(Win2)).place(x=30,y=140) b2=Button(self, text="proceed", bg="green", fg="white").place(x=30,y=160) # 给Win3自带的Select All按钮绑定选中功能 b3=Button(self, text= "Select All", command=self.select_all).place() class Application(tk.Tk): def __init__(self, *args, **kwargs): tk.Tk.__init__(self, *args, **kwargs) window = tk.Frame(self) window.pack(side = "top", fill = "both", expand = True) self.frames = {} for F in (Win1, Win2, Win3): frame = F(window, self) self.frames[F] = frame frame.grid(row = 0, column=0, sticky="nsew") self.show_frame(Win1) def show_frame(self, window): frame = self.frames[window] frame.tkraise() self.title("Test") self.geometry('1500x1500') app = Application() app.mainloop()
核心修改说明
- 给Win3添加
select_all方法:遍历保存复选框状态的self.vars列表,将每个变量的值设为1,对应复选框的选中状态。 - 调整Win1的AUTO按钮命令:通过
controller.frames[Win3]获取Win3的实例,先调用其select_all方法,再执行跳转Win2的操作,用lambda表达式实现多步骤执行。 - (可选)完善Win3的Select All按钮:给Win3自带的按钮绑定
select_all方法,让它也具备选中所有复选框的功能。
点击Win1的AUTO按钮后,Win3的所有复选框会被自动选中,随后跳转到Win2窗口。
内容的提问来源于stack exchange,提问作者user20623107
相关产品推荐
相关产品推荐

