PySide6桌面应用:刷新按钮调用MariaDB数据时遇参数错误
解决PySide6按钮点击报错TypeError问题
问题核心原因
报错TypeError: MainWindow.on_refreshBtn_clicked() takes 1 positional argument but 2 were given是因为槽函数的参数和信号传递的参数不匹配:
- 你用
@Slot(bool)声明槽函数接收一个布尔值参数,但实际定义的on_refreshBtn_clicked(self)只接受self这一个参数。 - QPushButton的
clicked信号默认会传递一个checked布尔参数(表示按钮是否处于按下状态),当信号触发时会把这个参数传给槽函数,导致参数数量不匹配。
两种修复方案
方案1:匹配信号参数,修改槽函数定义
保留@Slot(bool),给槽函数添加对应的参数:
@Slot(bool) def on_refreshBtn_clicked(self, checked): result = Connectionmaria().get_data_from_store_db() if result: self.storeTree.setRowCount(len(result)) for row, item in enumerate(result): column_1_item = QTableWidgetItem(str(item['column 1'])) self.storeTree.setItem(row, 0, column_1_item) else: QMessageBox.information(self, 'Warning', 'No data gotten from database') return
方案2:移除不必要的参数声明
如果你不需要checked参数,直接修改@Slot装饰器为无参数形式:
@Slot() def on_refreshBtn_clicked(self): # 原有代码不变
代码中其他需要修复的问题
- 重复定义方法:
Connectionmaria类里重复写了两次get_data_from_store_db,保留其中一个即可。 - 数据库连接未实际关闭:
finally块里的self.con.close要改为self.con.close(),否则只是引用方法,不会执行关闭操作。 - 拼写错误:
QMessageBox.informaation应为QMessageBox.information。 - 异常排查优化:建议在
except块打印具体错误信息,便于排查数据库连接或查询问题。
修正后的Connectionmaria类示例
class Connectionmaria(): def __init__(self): print("yes 9") self.host = "127.0.0.1" self.user = "root" self.password = "518Oloko." self.port = 3306 self.database = "Labpal" self.con = None def connect(self): self.con = mariadb.connect( host=self.host, user=self.user, password=self.password, port=self.port, database=self.database ) def get_data_from_store_db(self): try: self.connect() cursor = self.con.cursor(dictionary=True) sql = "SELECT * FROM store_log" cursor.execute(sql) result = cursor.fetchall() return result except Exception as e: print(f"get data failed: {e}") finally: if self.con: self.con.close()
内容的提问来源于stack exchange,提问作者lorkor_blaq
相关产品推荐
相关产品推荐

