如何调用导入模块中主代码的功能?

How to call function of main code in an Imported module?

引入的模块可以让主模块调用函数吗? 我创建了一个 sequence diagram 并且我有一个准系统代码示例来说明我的意思:

主要内容:

import test2

def function():
    do sth

测试2:

import tkinter as tk

window  = tk.Tk()
test = tk.Button(master = window, text = "hdsd", command = # call function of main program)
test.grid(row = 0, column = 0)
window.mainloop()

执行此操作的方法是设计导入代码,以便仅导入对象(函数、classes、常量)而不是 运行 代码。然后,一旦有了函数或 classes,就可以将其他函数或对象传递给它们。

例如,考虑这个 main.py:

import test2
def function():
    do sth
test2.create_gui(function)

test2.py 可能看起来像这样:

def create_gui(func):
    window  = tk.Tk()
    test = tk.Button(master = window, text = "hdsd", command = func)
    test.grid(row = 0, column = 0)
    window.mainloop()

可以说,更好的解决方案是对 main.py[=39 中的代码都使用 classes =]。通过将所有功能添加到 class,您可以传递一个实例,您的 GUI 将可以访问所有功能。

main.py

from test2 import GUI
class Main():
    def __init__(self):
        self.gui = GUI(self)

    def function(self):
        do sth

    def another_function(self):
        do sth

if __name__ == "__main__":
    main = Main()
    main.gui.start()

test2.py

import tkinter as tk
class GUI(tk.Tk):
    def __init__(self, main):
        super().__init__()
        test1 = tk.Button(self, text="hdsd", command=main.function)
        test2 = tk.Button(self, text="sdhd", command=main.another_function)

        test1.grid(row=0, column=0)
        test2.grid(row=0, column=1)

    def start(self):
        self.mainloop()