我对Python和编程都是新手。所以对于更有经验的程序员来说,也许有一个简单的解决方案。我已经读了很多关于循环导入的问题,但不幸的是,如果我不想将所有代码移动到一个文件中,那么没有什么可以适用于我的情况。
我用pyqt (qt creator)创建了一个用户界面并转换了主窗口。UI到mainwindow.py。我的计划是将代码分成3个模块。一个主模块用于启动应用程序,一个ui模块包含主窗口的类,一个按钮模块包含按钮的类。
我的问题是按钮类中的函数应该改变主窗口实例的标签值。我学会了在主模块中创建主窗口实例。因此,我需要将实例从主模块导入到buttons模块中,以更改预期值,这导致了循环导入。
我要如何组织/结构我的代码来避免这种情况?
为了更好地理解,下面是一个简短的例子:main.py
import sys
from qtpy import QtWidgets
from ui import MainWindow
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())
ui.py
from qtpy import QtWidgets
from userinterface.mainwindow import Ui_MainWindow
import buttons
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
QtWidgets.QMainWindow.__init__(self)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.button_0 = buttons.NumberButton(0)
self.button_1 = buttons.NumberButton(1)
self.ui.btn_0.clicked.connect(self.button_0.button_clicked)
self.ui.btn_1.clicked.connect(self.button_1.button_clicked)
buttons.py
from main import window
class NumberButton:
def __init__(self, number):
self.number = str(number)
def button_clicked(self):
window.ui.lb_result.setText(self.number)
您的设计问题是您的NumberButton
类调用一个特定的窗口实例。您必须让按钮知道它们属于哪个窗口。尝试以下操作:从button .py中删除import语句,并向__init__
方法添加一个新参数window
:
class NumberButton:
def __init__(self, window, number):
self.window = window
self.number = str(number)
def button_clicked(self):
self.window.ui.lb_result.setText(self.number)
然后在NumberButton
中实例化:
...
self.button_0 = buttons.NumberButton(self, 0)
...
如果你只导入模块,python应该自动避免循环导入。import ui
和import buttons
也是如此