PyQt5点击按钮后无法将参数传递至WCT_DataPull执行备份问题
问题:PyQt5 GUI输入参数无法传递到SQL备份模块
我正尝试将WCT_Control中的用户输入传递至WCT_DataPull模块,实现SQL数据备份为CSV文件的功能。目前用户在GUI输入服务器、数据库等信息后,点击提交按钮能正确获取输入值,但无法将这些参数传递到执行备份逻辑的WCT_DataPull中。
现有代码
WCT_Control.py
from PyQt5.QtWidgets import * from WCT_View import Ui_MainWindow class Controller(QMainWindow, Ui_MainWindow): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setupUi(self) self.run.clicked.connect(lambda : self.submit()) def submit(self): self.run.clicked.connect() server = self.server_entry.text() database = self.data_entry.text() station = self.station_entry.text() app = self.app_entry.text() backup_name = self.filename_entry.text() self.server_entry.setText('') self.data_entry.setText('') self.station_entry.setText('') self.app_entry.setText('') self.filename_entry.setText('') return server, database, station, app, backup_name
WCT_DataPull.py
from WCT_Control import * import pyodbc import csv pull_data = Controller() def write_bak(): driver = 'ODBC Driver 17 for SQL Server' serv, data, stat, app, bak_name = pull_data.submit() conn = pyodbc.connect('DRIVER={0};SERVER={1};DATABASE={2};Trusted_Connection=yes'.format(driver, serv, data)) cursor = conn.cursor() rows = cursor.execute(""" select DnsName, PackageName, Code, Value from WorkstationApplicationSettings where DnsName=? and PackageName=? """, stat, app).fetchall() for row in rows: print(row.PackageName,':', row.Code, ':', row.Value) with open(bak_name, 'w', newline='') as f: writer = csv.writer(f) writer.writerows(rows)
问题根源及修复方案
核心问题
- 实例不匹配:WCT_DataPull中新建的
Controller实例和用户操作的GUI实例完全独立,无法获取真实输入。 - 无效事件绑定:
submit方法里的self.run.clicked.connect()无参数,属于无效代码。 - 参数传递逻辑倒置:应该由GUI实例主动传递参数给备份函数,而非让备份函数新建GUI实例取参。
修改后的代码
WCT_Control.py
from PyQt5.QtWidgets import * from WCT_View import Ui_MainWindow from WCT_DataPull import write_bak class Controller(QMainWindow, Ui_MainWindow): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setupUi(self) self.run.clicked.connect(self.submit) def submit(self): server = self.server_entry.text() database = self.data_entry.text() station = self.station_entry.text() app = self.app_entry.text() backup_name = self.filename_entry.text() # 清空输入框 self.server_entry.clear() self.data_entry.clear() self.station_entry.clear() self.app_entry.clear() self.filename_entry.clear() # 直接传递参数调用备份函数 write_bak(server, database, station, app, backup_name)
WCT_DataPull.py
import pyodbc import csv def write_bak(server, database, station, app, backup_name): driver = 'ODBC Driver 17 for SQL Server' conn = pyodbc.connect(f'DRIVER={{{driver}}};SERVER={server};DATABASE={database};Trusted_Connection=yes') cursor = conn.cursor() rows = cursor.execute(""" select DnsName, PackageName, Code, Value from WorkstationApplicationSettings where DnsName=? and PackageName=? """, station, app).fetchall() for row in rows: print(f'{row.PackageName}: {row.Code}: {row.Value}') with open(backup_name, 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) # 写入表头提升CSV可读性 writer.writerow(['DnsName', 'PackageName', 'Code', 'Value']) writer.writerows(rows) conn.close() # 关闭数据库连接
额外优化建议
- 输入校验:在
submit中检查输入是否为空,避免后续操作出错。 - 异常捕获:在
write_bak中添加try-except块,处理数据库连接、文件写入等环节的异常。 - 异步执行:用QThread将备份逻辑放到子线程,防止GUI卡顿。
内容的提问来源于stack exchange,提问作者DoomDragoon
相关产品推荐
相关产品推荐

