python - 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)
是否可以处理从表单发送到另一个模块的数据,然后将结果返回给表单?
解决方案
一个可能的解决方案是在第三个文件中创建一个逻辑,我们可以在其中注册接收结果的函数和调用这些函数的函数:
核心.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_())
推荐阅读
- office-js - 如何重置所有 yeoman 生成器
- sql - 在将值插入数据库之前检查约束
- angular - 没有得到任何带有惰性路由Angular 9的chunk.js/module.js
- python - ImportError:使用 pyinstaller 创建 .exe 时无法导入名称“pywrap_tensorflow”
- python - Python BigQuery 属性错误:“行”对象没有属性
- delphi - Delphi 的 try...except 对子程序有何作用?异常处理是否适用于子过程?
- c - 这个哈希表的刷新函数有什么问题?
- javascript - 如何获取 Firestore 中离线的记录
- android - 如何通过代码使我的应用设备所有者
- google-sheets-api - 不同语言环境下的公式分隔符差异