【问题标题】:pyqt5 form and outer module exchange datapyqt5表单与外层模块交换数据
【发布时间】:2021-04-13 20:04:20
【问题描述】:

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

看起来很简单:

frm.py

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_())

mdl.py

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)

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

【问题讨论】:

    标签: python pyqt5 circular-dependency


    【解决方案1】:

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

    core.py

    _funct = []
    
    
    def register_writer(func):
        _funct.append(func)
        return func
    
    def write(text):
        for f in _funct:
            f(text)
    

    mdl.py

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

    frm.py

    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_())
    

    【讨论】:

    • 非常感谢。我已经用头撞墙三天了。解决方案太漂亮了!
    猜你喜欢
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    • 1970-01-01
    • 2011-02-16
    相关资源
    最近更新 更多