0

あるタブでの選択が別のタブでのウィジェットの選択に影響する Python で ttk.notebook を作成しようとしています。現在、各タブは異なるクラスとして設定されています。あるクラス(タブ)で関数を渡したり呼び出したりして、ウィジェットを変更したり、他のクラス(タブ)で関数を呼び出したりする方法はありますか?

つまり、lb1 と lb2 (tk lisbox 用) の 2 つの関数があります。理想的には、lb1 の選択関数が関数を呼び出して、lb2 にリストを作成するようにしたいと考えています。それぞれ別のクラスです。

私がやろうとしていることの一般的なサンプルは次のとおりです。

class One(ttk.Frame):
    ...
    lb1 = Listbox(listvariable = apps, height = 5)
    def lb2_lookup(self, *args):
        #this would somehow call a function to populate lb2
    self.lb1.bind('<<ListboxSelect>>', self.lb2_lookup)



class Two(ttk.Frame):
    lb2 = Listbox(listvariable = lb2apps, height = 5)

本当にありがとう。コード サンプルが意味をなさない場合は申し訳ありませんが、一般的な要点は理解できると思います。

4

1 に答える 1

0

解決策は、あるクラスが別のクラスの関数を呼び出すには、そのクラスへの参照、または他のクラスへの参照を持つある種のコントローラー クラスへの参照が必要なだけです。

class One(ttk.Frame):
    def __init__(self, master, other_class):
        self.other_class = other_class
        ...
        self.lbl.bind('<<ListboxSelect>>`, self.other_class.lb2_lookup)

two = Two(...)
one = One(..., other_class = two)

同じことを達成する別の方法は、クラスにインターフェースを提供させて、作成後にクラスを接続できるようにすることです。

class One(...):
    ...
    def set_target(self, other_class):
        self.other_class = other_class
class Two(...):
    ...
one = One(...)
two = Two(...)
one.set_target(two)

最後に、書かれているように、コードは密結合されています。つまり、Two の小さな変更でも、クラス One も変更する必要があることを意味する場合があります。これにより、保守が困難なコードが作成されます。あるクラスが他のクラスの実装について多くを知る必要のないインターフェイスを作成する必要があります。

具体的には、あなたの例では、lb2_lookup を呼び出すバインディングを設定しています。しかし、クラス Two を変更して、lb2 を lb3 に名前変更するとどうなるでしょうか。Oneも変更する必要がありますか?ウィジェットに直接関係しない関数を Two で作成することをお勧めします。例えば:

class One(...):
    ...
    self.lb1.bind('<<ListboxSelect>>', self.other_class.lookup)

これで、自由に再実装Twoできるようになりました。唯一の要件は、 という名前のメソッドを保持することですlookuplookupただし、同じように機能する限り、正確には何が変わる可能性があります.

したがって、たとえば、今lookupは という名前のウィジェットから値を返すlb2ことができますが、後で という名前のウィジェットからデータを検索できますfoobar。何をlookupしても、同じように機能する (同じ引数を取り、同じタイプの結果を返す)限り、 を変更するOneたびに変更する必要はありませんTwo

于 2013-07-25T10:48:05.637 に答える