Создание динамического виджета на основе файла configparser - PullRequest
0 голосов
/ 11 декабря 2011

Я пробую часть кода tkinter на основе Python со следующей целью: (Пожалуйста, перейдите к цели, затем я возьму пример, чтобы объяснить, что именно мне нужно, а затем в конце опубликую сценарий, который я написал)

  1. Считывает из файла конфигурации, который реализован с помощью модуля configparser.
  2. На основании опций, считанных из этого файла, он автоматически генерирует виджет.
  3. На данный момент эти виджеты ограничены только ярлыками и полями ввода.
  4. Каждое поле ввода связано с переменной. Следовательно, необходимо создать переменную автоматически при объявлении поля ввода.
  5. Теперь, когда пользователь вводит любое значение в поле ввода и нажимает кнопку вычисления, список генерируется с помощью комбинации значений, введенных пользователем (в определенном формате).

Пример: Пусть файл configparser имеет следующее содержимое:

[виджет]

label = ani_label, sham_label

entry = ani, sham

Список, сгенерированный для этого случая, будет выглядеть так:

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

означает значение, хранящееся в переменной 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 голос
/ 11 декабря 2011

Самый простой способ сделать это, 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...