我正在尝试在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)
非常感谢。如果代码示例没有任何意义,我很抱歉,但我相信它得到了一般意义。
答案 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}}。