如何解决如何根据Tkinter检查按钮更改列表
我一直在尝试使用tkinter CheckButton小部件来编辑列表中的项目-列表中的每个项目都是一个新的Checkbutton。我想要一个save方法将数据保存到文本文件,并希望使用load方法从文本文件加载信息并根据列表中的项目标记复选框。
到目前为止,这是我的代码,但是当我单击按钮并更新列表/文件时,列表似乎没有改变
这是我的代码,我需要知道为什么在选中复选框时列表没有更新:
=>
解决方法
每个复选框的变量都必须为IntVar
。您的moduleCheck
列表当前尚未初始化,因此当您尝试访问其中的元素时,会出现错误。
在下面的代码中(从您的代码修改而来),我初始化了moduleCheck
以包含两个IntVar。
当您按下保存按钮时,它将把控制台的当前状态打印到控制台。
import tkinter as tk
modulesMain = tk.Tk()
moduleChecks = [tk.IntVar() for i in range(2)]
def SaveChanges():
for idx,item in enumerate(moduleChecks):
print(f"{idx} = {item.get()}")
appCheck = tk.Checkbutton(modulesMain,text = "App",variable = moduleChecks[0])
appCheck.grid()
searchCheck = tk.Checkbutton(modulesMain,text = "Check",variable = moduleChecks[1])
searchCheck.grid()
saveButton = tk.Button(modulesMain,text = "Save Changes",command = SaveChanges)
saveButton.grid()
modulesMain.mainloop()
,
这是一个基本的解决方案。
import tkinter as tk
root = tk.Tk()
#list of options. doubles as checkbox label text
#appending to this list is all that is necessary to create more options
opts = ['App','Search']
#create an StringVar for every option
#this way there doesn't have to be type conversions for reading/writing files
vars = [tk.StringVar(value='0') for _ in opts]
#create checkboxes for every option
for opt,var in zip(opts,vars):
tk.Checkbutton(root,text=opt,variable=var,onvalue='1',offvalue='0').grid(sticky='w')
#write the checkbox values to file
def save_options_state():
with open("modules.txt","w") as file:
file.write(''.join([v.get() for v in vars]))
#set checkbox values from file
def load_options_state():
with open("modules.txt","r") as file:
for n,var in zip(list(file.read().strip()),vars):
var.set(n)
#save/load buttons
tk.Button(root,text="save",command=save_options_state).grid()
tk.Button(root,text="load",command=load_options_state).grid(row=2,column=1)
root.mainloop()
,
这是一个可运行的示例,我认为该示例显示了如何完成您所要求的一切。假设modules.txt
文件包含以下格式的数据,其中每一行都包含模块的名称以及是否进行了检查。
Mod1,0
Mod2,0
Mod3,0
文件中的数据用于创建Checkbutton
的列表(每个模块一个),并最初设置为文件中指示的当前状态。
这是示例代码:
from tkinter import *
import tkinter.messagebox as box
dataFilename = "modules.txt"
moduleChecks = []
def ReadModules():
with open(dataFilename,"r") as file:
for line in (line.strip() for line in file):
moduleName,moduleState = line.split(',')
moduleChecks.append((moduleName,int(moduleState)))
print('read:',moduleChecks)
def SaveChanges():
print('writing:',moduleChecks)
with open(dataFilename,"w") as file:
for checkButton in moduleCheckbuttons:
moduleName = checkButton.cget('text')
moduleState = checkButton.var.get()
file.write(','.join((moduleName,str(moduleState))) + '\n')
ReadModules()
modulesMain = Tk()
moduleCheckbuttons = []
# Create a Checkbutton for each module based on moduleChecks values.
for moduleName,moduleState in moduleChecks:
intVar = IntVar(value=moduleState)
checkButton = Checkbutton(modulesMain,text=moduleName,variable=intVar)
checkButton.var = intVar # Attach reference to variable.
checkButton.grid()
moduleCheckbuttons.append(checkButton)
saveButton = Button(modulesMain,text="Save Changes",command=SaveChanges)
saveButton.grid()
modulesMain.mainloop()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。