从另一个模块调用函数

3
我正在制作一个项目,需要将多个模块导入到一个主模块中。我决定将交互移动到单个Tkinter窗口中。例如,我使用tkinter.Entry()代替input()。每个交互步骤都有一个函数。
当我完成第一个模块的最后一个函数时,配置的按钮具有转到第二个模块中的函数的命令。我收到一个错误,说命令未定义。
我似乎无法将配置的按钮变量导入到下一个模块中,而我尝试的其他任何事情都没有结果。第一个模块完成后,它根本不会进入下一个模块。
我在主模块中创建了主要的Tkinter窗口,并在导入其他模块后使用mainloop。我想调用的函数难道不应该被定义吗?如果后面的函数在另一个模块中,我怎样才能从一个函数到达下一个函数?
以下是一个最小示例: main_script.py
import tkinter
mainwindow = tkinter.Tk()
# here i set the window to a certain size etc.
import mod1
import mod2
mainwindow.mainloop()

mod1.py

import tkinter
def button1():
    label.destroy()
    button1.destroy()
    button2.config(text = "continue", command = func2)
def button2():
    label.destroy()
    button1.destroy()
     button2.config(text = "continue", command = func2)
label = tkinter.Label(text = "example label")
button1 = tkinter.Button(text = "button1", command = button1)
button2 = tkinter.Button(text = "button2", command = button2)
label.pack()
button1.pack()
button2.pack()

mod2.py

def func2():
    button2.destroy()
    print ("haha it works...")

2
尝试将您的代码削减到最少限度,以便“运行并重现问题”(http://stackoverflow.com/help/mcve)。删除所有不必要的内容以查看错误,然后张贴它。这样隔离问题可能有助于您自己解决问题,同时也帮助我们看清问题所在。 - user2357112
1
欢迎来到 Stack Overflow!非常感谢您对代码的关注。我也会剥离掉较不相关的部分。 - Veedrac
好的,谢谢。两个很好的评论,我明白这样做比我的原始问题更好了。谢谢。 - W1ll1amvl
1个回答

2

导入一个模块不会影响你所导入的模块能够看到的内容。如果你想在 mod2 中使用 mod1 的内容,在 mod1 中使用 mod2 的内容,你需要让它们相互导入并使用适当的模块引用彼此的内容:

# mod1
import mod2
...
    button2.config(text = "continue", command = mod2.func2)

# mod2
import mod1
def func2():
    mod1.button2.destroy()

循环导入会导致初始化顺序问题,因此像这样的导入是不好的。在将代码分成模块时,请尝试以这样的方式进行,以避免需要循环导入。

这是一个相当不错的解决方案,它在示例代码上运行良好,并且应该能够满足我的需求。底部的提示也很好,谢谢。 - W1ll1amvl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接