基于configparser文件动态创建小部件

0 投票
1 回答
555 浏览
提问于 2025-04-17 08:09

我正在尝试一段基于Python的tkinter代码,目标如下:

  1. 从一个配置文件中读取数据,这个文件是用configparser模块实现的。
  2. 根据从这个文件中读取的选项,自动生成界面组件(widget)。
  3. 目前这些组件仅限于标签(label)和输入框(entry box)。
  4. 每个输入框都和一个变量关联。因此,每当声明一个输入框时,需要自动生成一个变量。
  5. 当用户在输入框中输入任何值并按下计算按钮时,会生成一个包含用户输入值组合的列表(以特定格式)。

举个例子: 假设configparser文件的内容如下:

[widget]

label = ani_label,sham_label

entry = ani,sham

在这种情况下生成的列表会是这样的:

out_list = ['-ani','< ani >','-sham','< sham >']

< ani > 表示存储在ani变量中的值

下面是我尝试过的代码。

from Tkinter import *
from Tkinter import Tk
import Tkinter as tk
import ttk
import ConfigParser
import sys
############ Initialize ###############################
parser_read = ConfigParser.ConfigParser()
parser_read.read('option_read.config')
config_list = {}
config_list['label'] = parser_read.get('widget','label').split(',')
config_list['entry'] = parser_read.get('widget','entry').split(',')


######
def calculate():
    #Will include the list generation part
    pass


#######
root = Tk()
root.title("NRUNTEST GUI VERSION 1")
#
menuframe = ttk.Frame(root)
menuframe.grid(column=0,row=0)
menuframe.columnconfigure(0,weight=1)
menuframe.rowconfigure(0,weight=1)
#
mainframe_label = ttk.Frame(root)
mainframe_label.grid(column=1,row=0)
mainframe_label.columnconfigure(0,weight=1)
mainframe_label.rowconfigure(0,weight=1)
#
mainframe_entry = ttk.Frame(root)
mainframe_entry.grid(column=2,row=0)
mainframe_entry.columnconfigure(0,weight=1)
mainframe_entry.rowconfigure(0,weight=1)


#
general_label= Label(menuframe,text="Please Enter the Values Below").grid(column=1,row=0,sticky=(E))
compiler_label= ttk.Label(menuframe,text="Compiler")
compiler_label.grid(column=1,row=1,sticky=W)
#
calculate_button = ttk.Button(menuframe, text="Calculate", command=calculate).grid(column=1,row=2,sticky=(W,E))
#Automatic Widget declaration ###
for x in config_list['label']:
    x = ttk.Label(mainframe_label,text=x).grid()

for x in config_list['entry']:
    #print x
var = lambda: sys.stdout.write(x)
x = ttk.Entry(mainframe_entry,textvariable = x).grid()


root.mainloop()

option_read.config的内容是

[widget]
label : animesh_label,sharma
entry : animesh_entry,sharma

状态: 我可以自动创建所需的组件。但我无法动态创建变量来存储输入框的值。 一旦变量被计算出来,我可以自己编写计算函数。

请告诉我该如何继续。 如果你有更好的方法来满足我的需求,请告诉我。 如果你需要更多信息或者我的问题不清楚,请随时联系我。

1 个回答

1

我觉得最简单的方法是用一个字典来存储动态创建的变量的引用。你可以用标签作为键。比如:

vars = {}
for x in config_list['entry']:
    vars[x] = StringVar()
    entry = ttk.Entry(mainframe_entry, textvariable=vars[x])
    entry.grid()

顺便说一下,你知道如果你这样做 x=ttk.Entry(...).grid(...)x 并不包含对这个小部件的引用吗?它实际上包含的是调用 grid 的结果,而这个结果是 None。

撰写回答