0

Enthought の TraitsUI を使用して UI を設計していますが、目的を達成する方法がわかりません...

ここに私が欲しいものがあります: ビューに Items() があり、英語または SI 単位として表示したいです。SI/English ボタンに基づいて「編集」ボックスの値を変更できますが、ラベルのテキストを変更する方法がわかりません。たとえば、「Length, ft [ 3.28]」という項目があり、それを SI に変換すると、「Length, m [ 1.00]」と表示されます。3.28 から 1.00 への変換はできますが、「ft」を「m」に変更する方法がわかりません。

助言がありますか?

私が試したことの 1 つは、単位名 (「m」や「ft」など) を保持する文字列を定義することです。次に、項目で、次のようにラベルを設定します。

label = 'Top, '+lengthUnits

これは、ビューが最初に構築されたときは正常に機能しますが、単位コントロールを変更してもラベルは更新されません。ビューを強制的にすべての新しい値で更新する方法はありますか?

これは、私がやろうとしていることを示す小さなpyプログラムです(私のスタイルを自由に批判してください:))。また、何が起こるかを示すいくつかの画像を追加してみます。

# NOTE: This version of the code has been modified so that it works as I want it to :)

# Example trying to change text on a View...

from traits.api \
    import HasTraits, Enum, CFloat, String

from traitsui.api \
    import View, Group, HGroup, Item, spring

class TestDialog ( HasTraits ):
    length = CFloat(1.0)
    choose_units = Enum('English', 'SI')
    current_units = 'English'
    unit_name = String('ft')
    ft_to_m = CFloat(3.28)
    
    view = View(
        Group(
            HGroup(
                spring,
                Item(name = "length", label = 'Test length'),
                Item(name = 'unit_name', style = 'readonly', show_label = False),
                spring
            ),
            HGroup(
                spring,
                Item(name = "choose_units"),
                spring
            )
        ),
        title = 'Test Changing View Test'
    )

    def _choose_units_changed(self):
        if self.current_units != self.choose_units:
            if self.choose_units == 'SI':
                self.length /= self.ft_to_m
                self.unit_name = 'm'
            else:
                self.length *= self.ft_to_m
                self.unit_name = 'ft'
        self.current_units = self.choose_units
        
# Run the program (if invoked from the command line):
if __name__ == '__main__':
    # Create the dialog:
    TestIt = TestDialog()

    # put the actual dialog up...
    TestIt.configure_traits()

私の問題を示すスクリーンショット

4

1 に答える 1

1

ここで説明されているように通知を使用します: http://code.enthought.com/projects/traits/docs/html/traits_user_manual/notification.html

更新された質問に応じて更新します。

そうです、ラベルは動的に更新されません。代わりに、ラベルのようなテキスト フィールドを作成します。たとえば、次のようにします。

label_text = String('Test length, English:')

次に、次のようなものでビューに表示します。

Item("label_text", style='readonly', show_label=False),

おそらく、(V)Group 内にネストされた HGroup を使用して、「長さ」表示の左側に配置することもできます。

次に、リスナー内の label_text を変更します。

于 2014-09-17T21:22:24.560 に答える