0

我正在尝试在 python 中创建一个 ttk.notebook,其中一个选项卡中的选择会影响单独选项卡中小部件的选择。每个选项卡当前都设置为不同的类。有没有办法在一个类(选项卡)中传递或调用函数并让它更改小部件/调用另一个类(选项卡)中的函数?

简而言之,我有两个功能:lb1 和 lb2(用于 tk lisboxes)。理想情况下,我希望 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)

最后,在编写时,您的代码是紧密耦合的。这意味着即使是对二的微小更改也可能意味着您也必须修改类一。这使得代码难以维护。您应该创建一个不需要一个类对另一个类的实现有太多了解的接口。

具体来说,在您的示例中,您正在设置一个绑定来调用 lb2_lookup。但是,如果您更改类 2 并将 lb2 重命名为 lb3 会怎样?您真的要修改 One 吗?最好在 Two 中创建一个与小部件没有直接关系的函数。例如:

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

有了它,你现在可以自由地重新实现Two你想要的。唯一的要求是您保留一个名为lookup. lookup但是,只要它以相同的方式工作,确切的内容就可以改变。

因此,例如,现在lookup可以从名为 的小部件返回值lb2,但稍后它可以从名为 的小部件中查找数据foobar。无论做什么lookup,只要它以相同的方式工作(采用相同的参数,返回相同类型的结果),您就不必在更改One时进行修改Two

于 2013-07-25T10:48:05.637 回答