Python脚本无法识别导入的PyQt5 MainWindow类,调用widget属性报错求解
问题:无法调用PyQt主窗口类获取输入值
我想在Python脚本里根据PyQt文件中lineEdit部件的输入值设置变量,但没法让脚本识别MainWindow类,调用其中的number方法获取输入值。
相关代码
main_file.py
#main_file class MainWindow(QtWidgets.QMainWindow): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.ui = Ui_MainWindow() self.ui.setupUi(self) def number(self): # return text value of line edit return self.ui.lineEdit.text() if __name__ == '__main__': app = QtWidgets.QApplication([]) widget = MainWindow() widget.show() app.exec_()
另一个脚本
import main_file class Row_number: number = 604 def __repr__(self): return repr(self.number) row_number = Row_number() def initialize(): row_number.number = main_file.widget.number
运行错误
AttributeError: module 'main_file' has no attribute 'widget'
问题分析与解决
错误原因
widget变量作用域限制:你在main_file的if __name__ == '__main__':代码块里定义了widget,这个代码块只有直接运行main_file.py时才会执行。当其他脚本importmain_file时,这段代码不会运行,所以main_file模块里根本不存在widget这个属性,自然触发报错。- 方法调用语法错误:就算能访问到
widget,你写的main_file.widget.number是引用方法对象,而非调用方法获取返回值,正确写法应该是main_file.widget.number()(必须加括号)。
解决方法
场景1:同进程内调用(两个脚本属于同一个PyQt应用)
修改main_file.py,把窗口实例化逻辑抽离出if __name__ == '__main__':代码块:
# main_file.py import QtWidgets from ui_mainwindow import Ui_MainWindow # 替换为你实际的UI生成文件 class MainWindow(QtWidgets.QMainWindow): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.ui = Ui_MainWindow() self.ui.setupUi(self) def number(self): return self.ui.lineEdit.text() # 提供创建窗口的公共方法 def get_main_window(): # 避免重复创建QApplication实例 app = QtWidgets.QApplication.instance() if not app: app = QtWidgets.QApplication([]) window = MainWindow() window.show() return window, app
然后修改另一个脚本:
import main_file class Row_number: number = 604 def __repr__(self): return repr(self.number) row_number = Row_number() # 先创建/获取主窗口实例 main_window, app = main_file.get_main_window() def initialize(): # 调用number方法获取输入值,注意加括号 row_number.number = main_window.number()
场景2:不同进程间调用(两个脚本独立运行)
如果两个脚本是分开运行的独立进程,直接import调用行不通。这种情况需要用进程间通信传递数据,比如:
- 将lineEdit的输入值写入本地文件,另一个脚本定时读取文件内容
- 使用socket建立简单通信通道
- 借助
multiprocessing模块的共享内存或消息队列工具
内容的提问来源于stack exchange,提问作者thatoneguy
相关产品推荐
相关产品推荐

