2011-01-07 20 views
0

私はいくつかの複雑なPythonオブジェクトの中から1つを選択するためにGUIをTkinterに書き込もうとしています。それらはデータベースからのレコードを表します。必要に応じて、整数一意のIDを指定してマップからオブジェクトを復元することができます。Tkinterコントロールのオブジェクト:StringVar、IntVar、DoubleVar、BooleanVarを超える方法

リストボックスとOptionMenuウィジェットは、任意のオブジェクトのシーケンスとこれらの任意のオブジェクトから表示する文字列を取得するための関数を受け入れます。それらの変数は、望ましくない変換なしで、それらのオブジェクトの1つを与えます。

代わりに、ウィジェットや、さらに重要なことに、文字列や文字列以外のものは数値や真理値に変換されません。 私は任意のオブジェクトを取得する方法がなく、ID値を含むリストを作成することはできません。なぜなら、わかりやすい文字列表現ではなくidを表示するからです。

テストとして、StringVarを持つOptionMenuにタプルを配置し、それらを文字列に変換しました。

変数からオブジェクトを取得(または取得)したり、ウィジェットの変数に入れられていない文字列をウィジェットに表示するために使用できるエキゾチックなウィジェットや手法はありますか? 私が考えることができる最良のアプローチは、コマンド用に動的に生成されたlambdaでいっぱいのメニューですが、それは醜く潜在的に大きすぎます。

+0

http://effbot.org/tkinterbook/listbox.htmは、それぞれから取得した文字列がユニークな目的であり、

selitems = [complexobjects[int(idx)] for idx in listbox.curselection()] 

は、このページを読んで、ちょうど インデックスを使用し、それを保存したり、それをルックアップする必要はありませんか? – Brandon

+0

この場合、あまりにも簡単です。 – user412090

答えて

0

私がこの問題を解決するために行ったことは、少なくとも私のListBoxでは、リスト内のすべてのデータを表す配列を持つことでした。あなたがするあなたの文字列 表現を好きでstr(complexobjects)を置き換える

for obj in complexobjects: 
    listbox.insert(END, str(complexobjects)) 

complexobjectsは、オブジェクトのリストであると言います。あなたは

+1

このアプローチの問題は、リストボックス内の項目のインデックスを推測する必要があるため、insert()呼び出しを制約することです。任意のinsert()呼び出しを受け入れる通常のListboxサブクラスのように動作させる方法はありません。 通常のTkinterのほんの一部をバイパスし、やや再利用可能なListboxサブクラスを作ることを望みましたが、私は代わりにいくつかの複合ウィジェットの中に隠された特別なリストボックスを埋め込むと思います。 – user412090

+0

これは必ずしもあなたが任意の挿入をやめることを必ずしも止めない。それは十分に簡単なことですか?つまり、あなたはTKinterのリストボックスオブジェクトを簡単にサブクラス化することができます。または、自分で作成し、そのクラスのメンバーを任意の挿入を許可するリストボックスのインスタンスにすることができます。 – milkypostman

関連する問題