python / tk - 影响其他类中的小部件

时间:2013-07-25 02:40:22

标签: python tkinter

我正在尝试在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)

非常感谢。如果代码示例没有任何意义,我很抱歉,但我相信它得到了一般意义。

1 个答案:

答案 0 :(得分: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中的一个小变化也可能意味着你必须修改一级。这使代码难以维护。您应该创建一个不需要一个类来了解其他类的实现的接口。

具体来说,在您的示例中,您正在设置绑定以调用lb2_lookup。但是如果你改变第二类并将lb2重命名为lb3怎么办?你真的想要修改一个吗?最好在Two中创建一个与widget不直接相关的函数。例如:

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

有了这个,你现在可以随心所欲地重新实现Two。唯一的要求是保留名为lookup的方法。但是,只要lookup以相同的方式工作,{I}}确实可以改变。

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