如何解决python中的循环导入问题



我得到了以下两个python文件:

1:debug.py

import tkinter as tk
from tkinter import scrolledtext
from tkinter import *
from tkinter import ttk
from helper import show_msg
root = Tk()
root.geometry('900x500')
root.resizable(False, False)
root.title("test")
menu = ["elem1", "elem2"]
menu1 = ttk.Combobox(root, state="readonly",values=["choose"] + menu, width=55)
menu1.current(0)
menu1.pack()
menu1.bind("<<ComboboxSelected>>", show_msg(menu1))
debug_frame = tk.Frame(root)
debug_frame.pack()
debug_bar = scrolledtext.ScrolledText(debug_frame, width=100, height=5)
debug_bar.pack()
root.mainloop()

2:helper.py

import tkinter as tk
from debug import debug_bar
def print_msg_on_screen(msg):
debug_bar.insert(tk.INSERT, msg)
print(msg)
def show_msg(menu1):
if(menu1.current() == 0):
msg="choose an element"
print_msg_on_screen(msg)
if (menu1.current() == 1):
msg = "you chose element1"
print_msg_on_screen(msg)
if (menu1.current() == 2):
msg = "you chose element2"
print_msg_on_screen(msg)

我想把我从helper.py的show_msg得到的任何消息打印到我在debug.py中声明的调试栏(在tkinter中(中,但我一直收到这个错误:

ImportError:无法从部分初始化的模块"helper"导入名称"show_msg"(很可能是由于循环导入(

有没有办法使这种循环导入有效?提前谢谢!

最好将debug_bar传递给show_msg()(然后传递给print_msg_on_screen()(,因此无需在helper.py:中导入debug

调试.py
...
# lambda should be used instead of direct calling show_msg()
menu1.bind("<<ComboboxSelected>>", lambda e: show_msg(menu1, debug_bar))
...
helper.py
import tkinter as tk
def print_msg_on_screen(msg, widget):
widget.insert(tk.INSERT, msg+'n')
print(msg)
def show_msg(menu1, widget):
print(f'{menu1}')
if(menu1.current() == 0):
msg="choose an element"
print_msg_on_screen(msg, widget)
if (menu1.current() == 1):
msg = "you chose element1"
print_msg_on_screen(msg, widget)
if (menu1.current() == 2):
msg = "you chose element2"
print_msg_on_screen(msg, widget)

在定义debug_bar之前调用show_msg(show_msg引用print_msg_on_screen,后者引用debug_bar(。

如果你在其他地方没有使用show_msgprint_msg_on_screen,我会把它们都移到debug.py中,然后这样订购:

def print_msg_on_screen(msg):
...
def show_msg(menu1):
...
debug_bar = ...
menu1.bind(..., show_msg(menu1))

最新更新