2011-12-11 167 views
0

我正在尝试一段基于python的tkinter代码,其目标如下: (请通过目标,然后我将举一个例子来解释我到底需要什么,然后最终会发布我写的脚本)基于configparser文件的动态构件创建

  1. 从使用configparser模块实现的配置文件读取。
  2. 基于从此文件中读取的选项,它会自动生成小部件。
  3. 截至目前,这些小部件仅限于标签和输入框。
  4. 每个输入框都与一个变量相关联。因此,只要声明了输入框,就需要自动生成变量 。
  5. 现在,当用户在输入框中输入任何值,并按下计算按钮时,用户输入的值(以特定格式)组合生成的列表为 。

实施例: 让configparser文件有以下内容:

[插件]

标签= ani_label,sham_label

条目= ANI,假

为这种情况生成的列表将如下所示:

out_list = [ '-ani', '< ANI>', ' - 假', '<假>']

< 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 

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

请指教我如何继续。 如果您有更好的方法来满足我的要求,请提出建议。 如果您需要更多输入或者我的查询不清楚,还可以ping通我。

+1

你说你“无法动态创建变量”。为什么?你有错误吗?你是否真的需要使用变量,或者你只是想?您是否知道您不需要使用变量来获取和设置条目窗口小部件的内容。 –

+0

我实际上正在尝试生成单个变量。由于我最近在python中获得了不多的知识,所以这看起来是正确的。 但我的主要目标是开发一个脚本,其中 - 声明,布局和后来的最终输出 - 完全自动化,并且依赖于从configparser文件中读取的内容。 – Ani

回答

1

要做到这一点,IMO的最简单方法是使用dict来存储对动态创建的变量的引用。你可以使用标签作为关键。例如:

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。

+0

感谢您的回复。试过这个后,让我回到你身边。 另外,无论如何,我可以自动化小部件布局,所以通过configparser文件,用户还可以决定放置什么小部件以及放置在哪里。 – Ani