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

STATUSです: 私は自動的に必要なウィジェットを作成することができます。しかし、私は、入力ボックスの値を格納する変数を動的に作成することができません。 変数が計算されたら、自分で計算関数を書くことができます。

どうすればいいですか? 私の要件を満たす良い方法があればお勧めします。 さらに入力が必要な場合やクエリが明確でない場合は、pingを実行してください。

+1

あなたは「変数を動的に作成できません」と言います。どうして?エラーが出ていますか?変数を使用する必要がありますか、それともしたいだけですか?エントリウィジェットの内容を取得および設定するために変数を使用する必要がないことをご存じですか? –

+0

私は実際に個々の変数を生成しようとしていました。私は最近得た謙虚な知識をPythonで手に入れましたが、これは正しい方法でした。 私の主な目標は、-declaration、レイアウト、そして最終的には最終出力が完全に自動化され、configparserファイルから読み込まれる内容に依存するスクリプトを開発することです。 – Ani

答えて

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です。

+0

あなたの返事をありがとう。これを試してみましょう。 また、私はウィジェットのレイアウトを自動化することができるので、configparserファイルを使用して、ユーザーは配置するウィジェットと配置する場所を決定することもできます。 – Ani