使用 Python 的 configparser 时,我遇到了复选框行为问题。应根据 config.ini 中存储的布尔变量来选中或取消选中该复选框。但无论我如何在配置文件中定义条目,该复选框始终处于未选中状态。
这是一个示例脚本
import tkinter as tk
import configparser
def load_config():
config = configparser.ConfigParser()
config.read('config.ini')
return config
def config_window():
configwin = tk.Toplevel(root)
configwin.title("Config")
config = load_config()
number_var = tk.DoubleVar(value=config.getfloat('Settings', 'number'))
status_var = tk.BooleanVar(value=config.getboolean('Settings', 'status'))
label = tk.Label(configwin, textvariable=number_var)
label.pack()
checkbutton = tk.Checkbutton(configwin, text="Status", variable=status_var)
checkbutton.pack()
root = tk.Tk()
root.title("Checkbox Test")
button = tk.Button(text="Open config", command=config_window)
button.pack()
root.mainloop()
以及对应的config.ini:
[Settings]
number = 1.5
status = True
我添加了数字标签来检查基本的程序逻辑,这有效。只有复选框未按预期选中。 “status = True”和“status = False”都会导致复选框未选中。小写或“1”而不是“True”也不会产生所需的结果。
你的
number_var
和status_var
是config_window
函数的局部变量,当函数返回/结束时,局部变量将被垃圾收集(未引用/删除),因为程序认为只有在函数中你才会需要这些变量,并且在它之外你不需要它。
移动到全局变量可以解决你的问题。
这是编辑后的代码:
import tkinter as tk
import configparser
root = tk.Tk()
root.title("Checkbox Test")
# global var and initialize the value as what ever you want to be default
number_var = tk.DoubleVar(value=0)
status_var = tk.BooleanVar(value=False)
def load_config():
config = configparser.ConfigParser()
config.read('config.ini')
return config
def config_window():
global number_var, status_var # grab them into your function
configwin = tk.Toplevel(root)
configwin.title("Config")
config = load_config()
# change the value to what you get from 'config.ini'
number_var.set(config.getfloat('Settings', 'number'))
status_var.set(config.getboolean('Settings', 'status'))
label = tk.Label(configwin, textvariable=number_var)
label.pack()
checkbutton = tk.Checkbutton(configwin, text="Status", variable=status_var)
checkbutton.pack()
button = tk.Button(text="Open config", command=config_window)
button.pack()
root.mainloop()