You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

问题根源及修复方案

核心问题

  1. 实例不匹配:WCT_DataPull中新建的Controller实例和用户操作的GUI实例完全独立,无法获取真实输入。
  2. 无效事件绑定:submit方法里的self.run.clicked.connect()无参数,属于无效代码。
  3. 参数传递逻辑倒置:应该由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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 15:57:19