在从main.py访问实例值时避免循环导入



我对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 uiimport buttons也是如此

最新更新