需要从不同的类调用类方法而不初始化第一个类或其他方式

Mik*_*235 5 class tkinter python-3.x

我的代码有一个小问题。

有两个班级。第一个创建一个带有选项按钮的窗口。单击按钮后,第二个类被调用并创建另一个带有 Ok 按钮的窗口。假设还有一个复选框,它将背景颜色更改为黑色或类似的颜色。单击按钮后,选项中所做的任何更改都会存储到文件中,并关闭第二个窗口。

所有这些工作正常。我的问题是,现在我需要从第一个类中调用方法 update_init 来将这些更改应用到 MainWindow。下面的代码显示了我对这个问题的第一个解决方案,但据我所知,通过使用第二个主循环,我创建了第二个线程,这应该避免。

class MainWindow:

    def __init__(self, master):
        self.master = master
        self.options_btn = tk.Button(self.master, text="Options", command=self.open_options)
        self.options_btn.pack()
        self.options_window = None

    def open_options(self):
        options_master = tk.Toplevel()
        self.options_window = OptionsWindow(options_master)
        options_master.mainloop()
        lst = meta_load()   # loads changes from a file
        self.update_init(lst)

    def update_init(self, lst):
        #code


class OptionsWindow:

    def __init__(self, master):
        self.master = master
        self.ok_btn = tk.Button(self.master, text="OK", command=self.update_meta)
        self.ok_btn.pack()

    def update_meta(self):
        meta_save(12)  # saves changes into a file
        self.master.destroy()

main_master = tk.Tk()
main_master.minsize(width=1280, height=720)
b = MainWindow(main_master)
main_master.mainloop()
Run Code Online (Sandbox Code Playgroud)

我的第二个解决方案是将两个类合二为一,但如果我这样做,代码会非常混乱。我可以在不初始化新的 MainWindow 类窗口的情况下以某种方式从 OptionsWindow 类调用方法 update_init (在 MainWindow 类中)吗?或者有没有其他方法可以解决这个问题?我将不胜感激任何帮助。

如果这太具体,我很抱歉,我已尝试使其尽可能笼统,但这是一个非常具体的问题,我无法在互联网上的任何地方找到有关它的太多信息。

Com*_*nse 0

一般来说,由于Python的客观性质,您可以从任何您想要的地方调用类方法并向其传递任何内容,而无需初始化该类的实例,但要注意self依赖性!虽然,我不认为这是一个好的做法。

class A:
    def __init__(self):
        self.foo = 'foo'

    def return_foo(self):
        return self.foo


class B:
    def __init__(self):
        self.bar = 'bar'
        print('Ha-ha Im inited!')

    def return_bar(self):
        try:
            return self.bar
        except AttributeError:
            return 'bar'


def test():
    a = A()
    # b = B()
    return_bar = getattr(B, 'return_bar', None)
    if callable(return_bar):
        print('%s%s' % (a.return_foo(), return_bar(None)))


test()
Run Code Online (Sandbox Code Playgroud)

链接: