基于configparser文件的动态窗口小部件创建

时间:2011-12-11 11:45:30

标签: python dynamic tkinter

我正在尝试一段基于python的tkinter代码,其目标如下: (请完成目标,然后我会举一个例子来解释我究竟需要什么,然后最后会发布我写的剧本)

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

      

    [插件]

         

    label = ani_label,sham_label

         

    entry = ani,sham

    为此案例生成的列表将如下所示:

      

    out_list = [' -ani','< ani>' -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
    

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

    请告知我如何继续。 如果您有更好的方法来满足我的要求,请建议。 如果您需要更多输入或我的查询不清楚,也请ping我。

1 个答案:

答案 0 :(得分:1)

最简单的方法是使用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的调用结果,即无。