首页 > 解决方案 > pyqt5表单与外模块交换数据

问题描述

我有一个 Pyqt5 表单,用户可以在其中输入数据。该数据被发送到另一个模块,在该模块中进行处理并返回以在表单中显示。

非常简单地看起来像这样:

文件

import sys
from PyQt5.QtWidgets import *
import mdl


def fnc0(in_val):
    mdl.fnc1(in_val)


def fnc2(rezult):
    msg.setText(rezult)


app = QApplication(sys.argv)
window = QWidget()
layout = QVBoxLayout()

btn = QPushButton('button')
btn.clicked.connect(lambda: fnc0(5))

layout.addWidget(btn)
msg = QLabel('')
layout.addWidget(msg)
window.setLayout(layout)
window.show()
sys.exit(app.exec_())

文件

import frm


def fnc1(in_val):
    out_val = str(in_val*2)
    frm.fnc2(out_val)

但是,这样做时,我得到了使用循环模块的错误:

AttributeError: partially initialized module 'mdl' has no attribute 'fnc1' (most likely due to a circular import)

是否可以处理从表单发送到另一个模块的数据,然后将结果返回给表单?

标签: pythonpyqt5circular-dependency

解决方案


一个可能的解决方案是在第三个文件中创建一个逻辑,我们可以在其中注册接收结果的函数和调用这些函数的函数:

核心.py

_funct = []


def register_writer(func):
    _funct.append(func)
    return func

def write(text):
    for f in _funct:
        f(text)

文件

import core


def fnc1(in_val):
    out_val = str(in_val * 2)
    core.write(out_val)

文件

import sys
from PyQt5.QtWidgets import *

import core
import mdl


@core.register_writer
def fnc2(rezult):
    msg.setText(rezult)


app = QApplication(sys.argv)
window = QWidget()
layout = QVBoxLayout()

btn = QPushButton("button")
btn.clicked.connect(lambda: mdl.fnc1(5))

layout.addWidget(btn)
msg = QLabel()
layout.addWidget(msg)
window.setLayout(layout)
window.show()
sys.exit(app.exec_())

推荐阅读