将布尔变量从配置文件传递到 tkinter 复选框

问题描述 投票:0回答:1

使用 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”也不会产生所需的结果。

python python-3.x ini configparser tkinter.checkbutton
1个回答
0
投票

你的

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()
© www.soinside.com 2019 - 2024. All rights reserved.