新闻中心
Tkinter中动态生成Entry和Checkbutton的全局重置与状态管理

本文旨在提供一个关于tkinter中动态生成entry输入框和checkbutton复选框的全局重置解决方案。文章将详细阐述如何正确管理checkbutton的intvar变量,避免常见错误,并展示一个高效的reset_all函数,该函数能够清空所有动态创建的entry内容、重置其状态,并取消所有checkbutton的选中状态,确保应用程序界面的整洁与功能性。
在开发Tkinter图形用户界面时,我们经常需要动态地创建一系列控件,例如在循环中生成多行Entry输入框和与之关联的Checkbutton复选框。当用户需要将界面恢复到初始状态时,实现一个全局的“重置”功能就变得尤为重要。这涉及到清空Entry的内容、将Entry设置为禁用状态,以及取消Checkbutton的选中状态。本教程将详细介绍如何优雅地实现这一功能,特别关注在处理Checkbutton时可能遇到的陷阱。
1. 理解Checkbutton与IntVar的正确关联
在Tkinter中,Checkbutton的状态通常通过一个关联的变量(如IntVar或BooleanVar)来管理。当Checkbutton被选中或取消选中时,它会自动更新这个变量的值。一个常见的错误是在Checkbutton的回调函数中直接尝试修改或覆盖这个变量本身,而不是通过变量的set()方法来修改其值,或者在创建Checkbutton时未正确指定variable参数。
错误示例分析: 原始代码中的set_state函数:
def set_state(i):
if mb_vars[i] == 1: # 这里的mb_vars[i]应该是一个IntVar实例,但这里直接比较整数
new_state = "disabled"
mb_vars[i] = 0 # 错误!这里将IntVar实例替换成了整数0
else:
new_state = "normal"
mb_vars[i] = 1 # 错误!这里将IntVar实例替换成了整数1
mb_mins[i].configure(state=new_state)
mb_secs[i].configure(state=new_state)
mb_pwr[i].configure(state=new_state)
mb_cad[i].configure(state=new_state)上述代码的问题在于,mb_vars列表最初存储的是IntVar实例,但set_state函数内部直接将mb_vars[i]赋值为整数0或1,这导致IntVar实例被覆盖,从而失去了与Checkbutton的关联。
小云雀
剪映出品的AI视频和图片创作助手
1949
查看详情
正确关联Checkbutton和IntVar: 要正确管理Checkbutton的状态,我们需要在创建Checkbutton时,通过variable参数将其与一个IntVar实例关联起来。同时,set_state函数应该通过IntVar.get()方法来读取Checkbutton的当前状态,而不是直接比较mb_vars[i]本身。
以下是修改后的控件创建循环和set_state函数:
from tkinter import *
import tkinter.font as tkFont
from tktooltip import ToolTip
from tkinter import messagebox
debug_on = TRUE
class EntryLen(Entry):
def __init__(self, master=None, max_len=1, max_val=1, **kwargs):
self.var = StringVar()
self.max_len = max_len
self.max_val = max_val
Entry.__init__(self, master, textvariable=self.var, **kwargs)
self.old_value = ''
self.var.trace('w', self.check)
def check(self, *args):
current_value = self.var.get()
if (current_value.isdigit() and
len(current_value) <= self.max_len and
int(current_value) <= self.max_val):
self.old_value = current_value
elif current_value == "":
self.old_value = current_value
else:
self.var.set(self.old_value)
root = Tk()
root.title("Zwift Workout Builder. (Written for my Cycling Club)")
frm_font = tkFont.Font(size=14)
add_font = tkFont.Font(size=16)
main_font = tkFont.Font(size=18)
mbk_font = tkFont.Font(size=8)
DisabledColour = "dark grey"
zdat = []
def Quit_gui():
response=messagebox.askyesno("Exit App?", "Are you sure you want to quit?\n(You could use the top/right X to kill app!)")
if response == 1:
root.destroy()
else:
response=messagebox.showinfo("Not Quitting!", "Stay around and see what's possible :-)")
return
frm_user = Frame(root, relief=RIDGE, bd=4)
frm_main = Frame(root, relief=RAISED, bd=6)
frm_warm = Frame(root, relief=RAISED, bd=2)
frm_blck = Frame(root, relief=RAISED, bd=2)
frm_cool = Frame(root, relief=RAISED, bd=2)
frm_free = Frame(root, relief=RAISED, bd=2)
frm_ints = Frame(root, relief=RAISED, bd=2)
frm_mult = Frame(root, relief=RAISED, bd=2)
frm_text = Frame(root, relief=RAISED, bd=2)
frm_del = Frame(root, relief=RAISED, bd=2)
lbl_user = Label(frm_user, text = "User Information", font="arial", relief=RAISED, bd=2)
lbl_name = Label(frm_user, text = "Name or Inititials", relief=RAISED, bd=2)
lbl_desc = Label(frm_user, text = "Description", relief=RAISED, bd=2)
lbl_tag1 = Label(frm_user, text = "TAG name1", relief=RAISED, bd=2)
lbl_ftp = Label(frm_user, text = "Your FTP (W)", relief=RAISED, bd=2)
lbl_filename = Label(frm_user, text = "Filename", relief=RAISED, bd=2)
ent_name = Entry(frm_user, width = 20)
ent_desc = Entry(frm_user, width = 20)
ent_tag1 = Entry(frm_user, width = 20)
ent_ftp = EntryLen(frm_user, max_len=3, max_val=999, width=3)
ent_filename = Entry(frm_user, width = 20)
frm_user.grid(row=0, column = 0, columnspan = 9)
lbl_user.grid(row=0, column = 0, columnspan=9, sticky="ew", padx=2, pady=2)
lbl_name.grid(row=1, column = 0, sticky="ew", padx=2, pady=2)
lbl_desc.grid(row=1, column = 1, sticky="ew", padx=2, pady=2)
lbl_tag1.grid(row=1, column = 2, sticky="ew", padx=2, pady=2)
lbl_ftp.grid(row=1, column = 3, sticky="ew", padx=2, pady=2)
lbl_filename.grid(row=1, column = 6, sticky="ew", padx=2, pady=2)
ent_name.grid( row=2, column = 0, padx=2, pady=2)
ent_desc.grid( row=2, column = 1, padx=2, pady=2)
ent_tag1.grid( row=2, column = 2, padx=2, pady=2)
ent_ftp.grid( row=2, column = 3, padx=2, pady=2)
ent_filename.grid(row=2, column = 6, padx=2, pady=2)
def Build_workout():
return
def Show_info():
return
def Open_pdf():
return
def Add_Warmup():
global zdat
local_data = []
min_val = ent_mins_W.get()
sec_val = ent_secs_W.get()
pwr1_val = ent_pwr1_W.get()
pwr2_val = ent_pwr2_W.get()
cad_val = ent_cadn_W.get()
if ((min_val == "") and (sec_val == "")) or (pwr1_val == "") or (pwr2_val == ""):
messagebox.showwarning("WARNING", "DATA MISSING! \n\
You must h*e data for either Mins or Secs!\n\
(Mins OR Secs can be blank, but not both.\n\
You must h*e data for start & end power.")
return
else:
if (min_val == ""):
W_time = int(sec_val)
elif (sec_val == ""):
W_time = int(min_val)*60
else:
W_time = int(min_val)*60 + int(sec_val)
if (cad_val == ""):
cad_val = "X"
else:
cad_val = int(cad_val)
local_data.append("WARM")
local_data.append(W_time)
local_data.append(int(pwr1_val))
local_data.append(int(pwr2_val))
local_data.append(cad_val)
zdat.append(local_data)
if debug_on:
debug_window = Toplevel()
debug_window.title("Debugging as I build,show 'zdat' global.")
debug = Label(debug_window, text = zdat)
debug.pack()
frm_warm.grid(row=1, column = 0, padx=10, pady=10)
lbl_name_W = Label(frm_warm, text = "WARMUP", relief=RIDGE, bd=2, fg="RED", font=frm_font)
lbl_name_W.grid(row=0, column = 0, columnspan = 8, sticky="ew", padx=2, pady=2)
lbl_mins_W = Label(frm_warm, text = "Min")
lbl_coln_W = Label(frm_warm, text = ":")
lbl_secs_W = Label(frm_warm, text = "Sec")
lbl_pwr1_W = Label(frm_warm, text = "Start(pwr)")
lbl_pwr2_W = Label(frm_warm, text = "End(pwr)")
lbl_cadn_W = Label(frm_warm, text = "Cad")
lbl_mins_W.grid(row=1, column = 1)
lbl_coln_W.grid(row=1, column = 2)
lbl_secs_W.grid(row=1, column = 3)
lbl_pwr1_W.grid(row=1, column = 5)
lbl_pwr2_W.grid(row=1, col
umn = 6)
lbl_cadn_W.grid(row=1, column = 7)
lbl_time_W = Label(frm_warm, text = "Time")
ent_mins_W = EntryLen(frm_warm, max_len=2, max_val=99, width=2)
ent_secs_W = EntryLen(frm_warm, max_len=2, max_val=60, width=2)
lbl_pwr3_W = Label(frm_warm, text = "Power")
ent_pwr1_W = EntryLen(frm_warm, max_len=3, max_val=999, width=3)
ent_pwr2_W = EntryLen(frm_warm, max_len=3, max_val=999, width=3)
ent_cadn_W = EntryLen(frm_warm, max_len=3, max_val=150, width=3)
lbl_time_W.grid(row=2, column = 0)
ent_mins_W.grid(row=2, column = 1)
ent_secs_W.grid(row=2, column = 3)
lbl_pwr3_W.grid(row=2, column = 4)
ent_pwr1_W.grid(row=2, column = 5)
ent_pwr2_W.grid(row=2, column = 6)
ent_cadn_W.grid(row=2, column = 7)
but_add_W = Button(frm_warm, text="ADD Warmup", relief=RIDGE, bd=2, bg="lightblue", fg="blue", font=add_font, command = Add_Warmup)
but_add_W.grid(row=4, column = 0, columnspan = 8, sticky="ew", padx=2, pady=2)
def ADD_mb_data():
global zdat
local_data = []
local_data.append("MBLK")
for i in range(mb_size):
if mb_vars[i].get() == 1: # 使用.get()方法获取IntVar的值
mins = mb_mins[i].get()
secs = mb_secs[i].get()
pwr = mb_pwr[i].get()
cad = mb_cad[i].get()
rpts = e_repeats.get()
if ((mins == "") and (secs == "")) or (pwr == "") or (rpts == ""):
messagebox.showwarning("WARNING", "DATA MISSING! \nYou must h*e data for Power \nand for either Mins or Secs!\n(Mins or Sec can be blank, but not both.\n Number or repeats cannot be blank (1 to 50 allowed).\nCad is optional).")
return
else:
if secs == "":
secs = 0
elif mins == "":
mins = 0
time = int(mins)*60 + int(secs)
local_data.append(time)
local_data.append(int(pwr))
if cad == "":
local_data.append("X")
else:
local_data.append(int(cad))
local_data.append(int(rpts))
zdat.append(local_data)
if debug_on:
debug_window = Toplevel()
debug_window.title("Debugging as I build, show 'zdat' global.")
debug = Label(debug_window, text = zdat)
debug.pack()
mb_mins = []
mb_secs = []
mb_pwr = []
mb_cad = []
mb_vars = []
lbl_name_MB = Label(frm_mult, text = "MULTI-BLOCK", relief=RAISED, bd=2, width = 20, fg = "blue", font=frm_font)
lbl_name_MB.grid(row=0, column = 0, columnspan = 8, sticky="ew", padx=2, pady=2)
mb_size = 10
frm_mult.grid(row=1, column = 4, rowspan = 5, columnspan=4, padx=10, pady=10, sticky = "n")
# 修正后的set_state函数
def set_state(i):
# 根据IntVar的当前值来设置Entry的状态
state = NORMAL if mb_vars[i].get() else DISABLED
mb_mins[i].configure(state=state)
mb_secs[i].configure(state=state)
mb_pwr[i].configure(state=state)
mb_cad[i].configure(state=state)
mins_lbl = Label(frm_mult, width=3, text="Mins").grid(row=1, column=0)
colon_lbl = Label(frm_mult, width=1, text=":").grid(row=1, column=1)
secs_lbl = Label(frm_mult, width=3, text="Secs").grid(row=1, column=2)
space1_lbl = Label(frm_mult, width=1, text=" ").grid(row=1, column=3)
power_lbl = Label(frm_mult, width=3, text="Pwr").grid(row=1, column=4)
space2_lbl = Label(frm_mult, width=1, text=" ").grid(row=1, column=5)
cadence_lbl = Label(frm_mult, width=3, text="Cad").grid(row=1, column=6)
enable_lbl = Label(frm_mult, width=5, text="Enable").grid(row=1, column=7)
# 修正后的控件创建循环
for i in range(mb_size):
mins = EntryLen(frm_mult, max_len=2, max_val=99, width=2, state = DISABLED, disabledbackground=DisabledColour)
mins.grid(row=i+2, column=0)
secs = EntryLen(frm_mult, max_len=2, max_val=60, width=2, state = DISABLED, disabledbackground=DisabledColour)
secs.grid(row=i+2, column=2)
powr = EntryLen(frm_mult, max_len=3, max_val=999, width=3, state = DISABLED, disabledbackground=DisabledColour)
powr.grid(row=i+2, column=4)
cdnc = EntryLen(frm_mult, max_len=3, max_val=150, width=3, state = DISABLED, disabledbackground=DisabledColour)
cdnc.grid(row=i+2, column=6)
mb_mins.append(mins)
mb_secs.append(secs)
mb_pwr.append(powr)
mb_cad.append(cdnc)
var = IntVar(value=0) # 初始化IntVar
mb_vars.append(var)
# 关键:将IntVar实例通过variable参数关联到Checkbutton
cb = Checkbutton(frm_mult, variable=var, command=lambda i=i: set_state(i))
cb.grid(row=i+2,column=7)
l_uscrmb = Label(frm_mult, text="---------------XXXXXX----------------").grid(row=mb_size+3, column=0, columnspan=以上就是Tkinter中动态生成Entry和Checkbutton的全局重置与状态管理的详细内容,更多请关注其它相关文章!
# cad
# 而不是
# 的是
# 复选框
# 输入框
# 如何实现
# 清空
# 方法来
# 成了
# 回调
# elif
# red
# cdn
# win
# pdf
# ai
# 回调函数
# app
# git
# 官网
# 温岭新媒体营销推广方案
# 龙岗关键词排名推广
# 信用卡营销人员场景推广
# 宁波网站推广公司排名榜
# 龙里县seo
# 三全推广营销
# seo关键词排名心细火23星去
# 中小网站关键词排名软件
# 拼多多场景营销推广策略
# 创作灵感网站建设案例范文
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
yy漫画网页版官方入口_yy漫画官网登录页面链接
QQ邮箱官方网站登录入口_QQ邮箱网页版在线使用
荒野行动PC版怎么注册_荒野行动PC版账号注册详细流程图文教程
怎样把文件彻底粉碎无法恢复_Windows下安全删除敏感数据【隐私保护】
React Router 嵌套组件中 URL 重定向问题的解决方案
Animex动漫社网入口地址 Animex动漫社网正版在线入口
漫蛙MANWA漫画主页官方入口 漫蛙漫画最新在线阅读地址
整合Supabase认证与Django模型:跨模式迁移的解决方案
4399免费游戏网址入口 4399小游戏免费入口点开即玩
《北京人工智能产业白皮书(2025)》发布:全年核心产值预计突破 4500 亿元
css绝对定位元素脱离父容器怎么办_确保父元素position非static
Python实时数据流中的动态最值查找策略
解决Python logging 中 datefmt 导致时间戳固定不变的问题
抖音未来赚钱的新趋势 2025年值得关注的变现风口分析
C++如何实现一个装饰器模式_C++设计模式之动态地给对象添加额外职责
优化 Jest 模拟:强制未实现函数抛出错误以提升测试效率
Sublime Text怎么显示空格和制表符_Sublime显示不可见字符设置
JUnit5/Mockito:优雅测试内部依赖与异常处理的实践
深入理解J*aScript Promise异步执行与微任务队列
蛙漫限时开放最深处链接_蛙漫全站漫画会员同款秒开地址
魅族17怎样用浏览器译外语网页_iPhone魅族17浏览器译外语网页【即时翻译】
C++如何打印当前代码行号与文件名_C++预定义宏FILE与LINE的使用
Log4j Console Appender性能瓶颈与高并发优化策略
126邮箱手机版登录官网2026_126手机邮箱免费入口最新
163邮箱网页版入口导航平台 163邮箱网页版登录入口官网导航
Lar*el用户头像管理:实现图片缩放、存储与旧文件安全删除的最佳实践
Python中高效且防溢出的双曲正弦计算:基于对数空间的优化策略
b站怎么删除评论_b站评论管理与删除操作
地铁跑酷免费秒玩入口链接 地铁跑酷小游戏免费秒玩网站
在Pyomo中实现基于变量的条件约束:Big-M方法详解
Pandas DataFrame:高效添加条件计算列
一加手机电池耗电快怎么办_一加手机电池耗电快的解决方法
C++如何比较两个字符串_C++ string compare函数与操作符对比
2025-2030年全球乘用车销量预测:新能源成增长主力
怎么在mac上运行html代码_mac运行html代码方法【指南】
composer的"require-dev"部分是用来做什么的?
荣耀Play7T运行卡顿解决_荣耀Play7T性能优化
Yandex浏览器官方网页版入口 Yandex浏览器最新版官网
如何将一个大型PHP应用拆分为多个Composer包_微服务与模块化架构的Composer实践
新手怎么开始学化妆 零基础化妆入门教程
汽水音乐车机版8.9下载 汽水音乐车机版8.9版本安装入口
如何将HTML表格多行数据保存到Google Sheet
C++如何实现异步操作_C++11使用std::future和std::async进行异步编程
内存检查:在VS Code中调试C++时的内存视图
京东单号查询入口_京东快递订单追踪入口
微博网页版怎么开启两步验证_微博网页版账号安全两步验证设置方法
在VS Code中配置和运行Dart程序的完整步骤
利用5118提升短视频内容效果_5118短视频关键词优化方法
在Blazor WebAssembly应用中动态注入客户端特定指标代码的策略
J*aScriptWebpack优化_J*aScript构建工具实战


2025-11-20
浏览次数:次
返回列表
umn = 6)
lbl_cadn_W.grid(row=1, column = 7)
lbl_time_W = Label(frm_warm, text = "Time")
ent_mins_W = EntryLen(frm_warm, max_len=2, max_val=99, width=2)
ent_secs_W = EntryLen(frm_warm, max_len=2, max_val=60, width=2)
lbl_pwr3_W = Label(frm_warm, text = "Power")
ent_pwr1_W = EntryLen(frm_warm, max_len=3, max_val=999, width=3)
ent_pwr2_W = EntryLen(frm_warm, max_len=3, max_val=999, width=3)
ent_cadn_W = EntryLen(frm_warm, max_len=3, max_val=150, width=3)
lbl_time_W.grid(row=2, column = 0)
ent_mins_W.grid(row=2, column = 1)
ent_secs_W.grid(row=2, column = 3)
lbl_pwr3_W.grid(row=2, column = 4)
ent_pwr1_W.grid(row=2, column = 5)
ent_pwr2_W.grid(row=2, column = 6)
ent_cadn_W.grid(row=2, column = 7)
but_add_W = Button(frm_warm, text="ADD Warmup", relief=RIDGE, bd=2, bg="lightblue", fg="blue", font=add_font, command = Add_Warmup)
but_add_W.grid(row=4, column = 0, columnspan = 8, sticky="ew", padx=2, pady=2)
def ADD_mb_data():
global zdat
local_data = []
local_data.append("MBLK")
for i in range(mb_size):
if mb_vars[i].get() == 1: # 使用.get()方法获取IntVar的值
mins = mb_mins[i].get()
secs = mb_secs[i].get()
pwr = mb_pwr[i].get()
cad = mb_cad[i].get()
rpts = e_repeats.get()
if ((mins == "") and (secs == "")) or (pwr == "") or (rpts == ""):
messagebox.showwarning("WARNING", "DATA MISSING! \nYou must h*e data for Power \nand for either Mins or Secs!\n(Mins or Sec can be blank, but not both.\n Number or repeats cannot be blank (1 to 50 allowed).\nCad is optional).")
return
else:
if secs == "":
secs = 0
elif mins == "":
mins = 0
time = int(mins)*60 + int(secs)
local_data.append(time)
local_data.append(int(pwr))
if cad == "":
local_data.append("X")
else:
local_data.append(int(cad))
local_data.append(int(rpts))
zdat.append(local_data)
if debug_on:
debug_window = Toplevel()
debug_window.title("Debugging as I build, show 'zdat' global.")
debug = Label(debug_window, text = zdat)
debug.pack()
mb_mins = []
mb_secs = []
mb_pwr = []
mb_cad = []
mb_vars = []
lbl_name_MB = Label(frm_mult, text = "MULTI-BLOCK", relief=RAISED, bd=2, width = 20, fg = "blue", font=frm_font)
lbl_name_MB.grid(row=0, column = 0, columnspan = 8, sticky="ew", padx=2, pady=2)
mb_size = 10
frm_mult.grid(row=1, column = 4, rowspan = 5, columnspan=4, padx=10, pady=10, sticky = "n")
# 修正后的set_state函数
def set_state(i):
# 根据IntVar的当前值来设置Entry的状态
state = NORMAL if mb_vars[i].get() else DISABLED
mb_mins[i].configure(state=state)
mb_secs[i].configure(state=state)
mb_pwr[i].configure(state=state)
mb_cad[i].configure(state=state)
mins_lbl = Label(frm_mult, width=3, text="Mins").grid(row=1, column=0)
colon_lbl = Label(frm_mult, width=1, text=":").grid(row=1, column=1)
secs_lbl = Label(frm_mult, width=3, text="Secs").grid(row=1, column=2)
space1_lbl = Label(frm_mult, width=1, text=" ").grid(row=1, column=3)
power_lbl = Label(frm_mult, width=3, text="Pwr").grid(row=1, column=4)
space2_lbl = Label(frm_mult, width=1, text=" ").grid(row=1, column=5)
cadence_lbl = Label(frm_mult, width=3, text="Cad").grid(row=1, column=6)
enable_lbl = Label(frm_mult, width=5, text="Enable").grid(row=1, column=7)
# 修正后的控件创建循环
for i in range(mb_size):
mins = EntryLen(frm_mult, max_len=2, max_val=99, width=2, state = DISABLED, disabledbackground=DisabledColour)
mins.grid(row=i+2, column=0)
secs = EntryLen(frm_mult, max_len=2, max_val=60, width=2, state = DISABLED, disabledbackground=DisabledColour)
secs.grid(row=i+2, column=2)
powr = EntryLen(frm_mult, max_len=3, max_val=999, width=3, state = DISABLED, disabledbackground=DisabledColour)
powr.grid(row=i+2, column=4)
cdnc = EntryLen(frm_mult, max_len=3, max_val=150, width=3, state = DISABLED, disabledbackground=DisabledColour)
cdnc.grid(row=i+2, column=6)
mb_mins.append(mins)
mb_secs.append(secs)
mb_pwr.append(powr)
mb_cad.append(cdnc)
var = IntVar(value=0) # 初始化IntVar
mb_vars.append(var)
# 关键:将IntVar实例通过variable参数关联到Checkbutton
cb = Checkbutton(frm_mult, variable=var, command=lambda i=i: set_state(i))
cb.grid(row=i+2,column=7)
l_uscrmb = Label(frm_mult, text="---------------XXXXXX----------------").grid(row=mb_size+3, column=0, columnspan=