如何在PyQt5项目中跨文件导入name_db变量解决NameError报错
PyQt5跨文件传递数据库名称报错解决方案
报错根因
- 你在
logged.py中通过os.environ['name_db']存储选中的数据库名称,但第二个调用文件中直接使用未定义的name_db变量,没有读取系统环境变量中的值 comboBox选中内容变更时没有同步更新环境变量,默认只会写入初始化时的第一个选项值- 你通过
os.system启动新脚本属于开启独立子进程,子进程虽然会继承父进程的环境变量,但未主动读取就会触发未定义报错
修复步骤
1. 修改logged.py,同步下拉框选中值到环境变量
在setupUi方法中添加下拉框的文本变化信号绑定,实时更新环境变量:
# 原有代码:self.comboBox.addItems(onlyfiles) # 新增以下行 self.comboBox.currentTextChanged.connect(lambda val: os.environ.update({'name_db': val})) # 原有设置初始值的代码可以保留 os.environ['name_db'] = self.comboBox.currentText()
2. 修改第二份代码文件(对应你的journal.py),读取环境变量获取数据库名
找到if __name__ == '__main__'下的数据库初始化部分,修改为:
path = os.getcwd() app = QApplication(sys.argv) # 新增读取环境变量的代码 name_db = os.getenv('name_db') if not name_db: raise ValueError("未选中有效数据库文件,请先在主界面选择") db = QSqlDatabase.addDatabase('QSQLITE') db.setDatabaseName(os.path.join(path, "db", name_db))
可选优化
如果不需要多进程独立运行的话,不要用os.system启动脚本,直接导入对应脚本的功能函数调用,避免跨进程传值的各种问题:
把logged.py里的open方法修改为:
def open(self): # 注释掉原有os.system的代码 # os.system('python create.py') # os.system('python journal.py') # 直接导入运行,把journal.py里的主逻辑封装成run函数即可 import journal journal.run()
内容的提问来源于stack exchange,提问作者jacedaichi
相关产品推荐
相关产品推荐

