如何根据tkinter checkbutton更改列表

2024-10-01 22:29:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在尝试使用tkinter CheckButton小部件编辑列表中的项目-列表中的每个项目都是一个新的CheckButton。我需要一个save方法将数据保存到文本文件,以及一个load方法从文本文件加载信息,并根据列表中的项目标记复选框

这是到目前为止我的代码,但是当我检查按钮并更新列表/文件时,列表似乎没有改变

这是我的代码,我需要知道当我选中复选框时列表为什么没有更新:

import tkinter.messagebox as box

modulesMain = Tk()
moduleChecks = []

def SaveChanges():
    # Clear the text file
    modules = open("modules.txt", "w") #Write mode to overwrite the whole file
    modules.write("") # Put in blank text
    modules.close()
    modules = open("modules.txt", "a") # Append mode to append the file
    for item in moduleChecks:
        modules.write(item + "\n")
    print(moduleChecks)



appButton = Checkbutton(modulesMain, text = "Test", variable = moduleChecks[0]).grid()
searchButton = Checkbutton(modulesMain, text = "Test", variable = moduleChecks[1]).grid()






Save = Button(modulesMain, text = "Save Changes", command = SaveChanges).grid()

Tags: the项目方法代码textmodules列表tkinter
3条回答

每个复选框的变量必须是IntVar。您的moduleCheck列表当前未初始化,因此当您尝试访问其中的元素时,将出现错误

在下面的代码(由您修改)中,我初始化了moduleCheck以包含两个IntVars。 当您按下保存按钮时,它将向控制台打印复选框的当前状态

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()

这里有一个可运行的示例,我认为它展示了如何完成您所要求的一切。它假定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()

这是一个基本的解决方案

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()

相关问题 更多 >

    热门问题