0

最初にコードの長さをお詫びしますが、すべてを表示したかったのです。

次のようなインターフェイスがあります。

テーブル インターフェイス

3 番目のオプション メニューを「リスト」に変更すると、「n」値を持つオプションが追加されます (表示されていません)。次に、ユーザーが値を入力できる「n」列が必要です。

また、インターフェイスによって開かれたテキスト ファイルに応じて「n」個の行が存在する可能性があるという問題もあります。

したがって、4列を追加するだけでコードが示すように、「n」個の行と列を追加することが可能かどうか疑問に思っています(ボックスで同じ値を繰り返さないことが困難であり、「n」列が必要になるため)。行数は正常に読み取ることができますが、行数によってはこれらの値をすべて返すのに問題があります。これまでのところ、私は1行を行うことができます..

ありがとうございました!

def numberwritten(number): 
    fg = number.get()
    print fg

numbers = [StringVar() for i in xrange(4) ] #Name available in global scope. Need to add other rows?
for i in numbers: 
    i.trace('w',lambda a,b,c,n=i: numberwritten(n) ) 


def ChoiceBox(choice):


    co_ord = str(frame_table.grid_size())
    col, rows = map(float, co_ord.strip('()').split(','))
    rows = int(rows)
    if choice == "Fixed":
        empty1.destroy()
        #choice_frame.grid_forget()     
        tkMessageBox.showinfo("Message", "No optimisation, value fixed.")
    elif choice == "List":
        column = 7
        for i in xrange(4): 
        choice_title = Label(frame_table, text='Value %g'% float(i+1), bg='white', borderwidth=0, width=10) 
            choice_title.grid(row=1, column=column+i, sticky="nsew", padx=1, pady=1) 
            boxes=[]

        for i in xrange(4):
            for j in range(2, rows): 
                box=Entry(frame_table,bg='white',borderwidth=0,textvariable=numbers[i], width=10, justify="center") # Here I'm having problems with rows 
                box.grid(row=j,column=column+i, sticky='nsew', padx=1, pady=1) 
        boxes.append(box)
        box1,box2,box3,box4=boxes


    elif choice == "Interval" or "Optimisation":
        for i in xrange(2): 
            choice_title1 = Label(frame_table, text='Min Value', bg='white', borderwidth=0)
            choice_title1.grid(row=0, column=column, sticky="nsew", padx=1, pady=1)
            choice_title2 = Label(frame_table, text='Max Value', bg='white', borderwidth=0)
            choice_title2.grid(row=0, column=column+1, sticky="nsew", padx=1, pady=1)

            boxes=[]

        for i in xrange(2): 
            box=Entry(frame_table,bg='white',borderwidth=0,textvariable=numbers[i]) 
            box.grid(row=rows+1,column=i, sticky='ew', padx=1, pady=1) 
            boxes.append(box)
            box1,box2,box3,box4=boxes

更新: 私は少し進んで、クラス Window: の下にある ChoiceBox のセクションは ChoiceBox(self, choice) です。次のセクションでは、「n」個のボックスを受け入れるようにコメント行を変更する必要があります。

column = 7
        for i in xrange(self.number_boxes): 
            choice_title = Label(self.frame_table, text='Value %g'% float(i+1), bg='white', borderwidth=0, width=10) 
            choice_title.grid(row=1, column=column+i, sticky="nsew", padx=1, pady=1) 
        boxes=[]

        for i in xrange(self.number_boxes):
            for j in range(2, rows): 
                box=Entry(self.frame_table,bg='white',borderwidth=0,textvariable=numbers[i], width=10, justify="center") 
                box.grid(row=j,column=column+i, sticky='nsew', padx=1, pady=1) 
            boxes.append(box)
        #box1,box2,box3,box4=boxes

ただし、元の例のコードの最初の数行を含む numberwritten を使用して、できれば行ごとに値のリストを完全に抽出するという問題がまだあります。

4

1 に答える 1

1

インターフェースを表現する最も簡単な方法をまだ見つけたとは確信していませんが、やりたいことを行うのは比較的簡単です。

概念的には、値を編集するためのエントリを追加するには、値のモデルとして機能するオブジェクトを定義 (および参照を保存) する必要があります。次に、その値を操作するウィジェット (または複数のウィジェット) を定義します。次に、必要に応じてそのようなキー バインドを追加します (多くの場合、何もありません。デフォルトはかなり適切です)。最後に、ウィジェットをユーザー インターフェイス全体に追加します (gridたとえば、メソッドを使用します)。ただし、これは、サイズが固定されていないモデルを処理するようにコード全体を設計する必要があることを意味します。(もちろん、エントリの削除は逆のプロセスです。)

コードを小さな断片にリファクタリングして、この全体的なタスクの小さな部分を実行することをお勧めします。たとえば、モデル、エントリ ウィジェットを作成し、そのウィジェットを GUI に追加し、モデル オブジェクトを返す関数を記述します。このような結合エントリを作成する必要がある他の場所では、このエキスパート機能にジョブを実行するよう依頼できるため、1 回で正しく処理できます。物事を非常に明確に定義されたタスクで小さなピースに分割することで、ウィジェット管理の (長くて退屈な) 詳細に行き詰まる代わりに、より複雑なロジックの側面に集中することがはるかに簡単になります。

于 2012-06-29T13:44:09.527 に答える