2011-12-11 209 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