Qt Designer中TableWidget无法显示LoaiTK=0的数据问题求助
问题
我通过PyQt结合pandas、pyodbc从SQL Server数据库的TK表读取数据,代码如下:
import os import sys import pyodbc as odbc import pandas as pd from check import * # check is my ui file class MainWindow(QMainWindow): def __init__(self,parent=None): QMainWindow.__init__(self) self.ui = Ui_MainWindow() self.ui.setupUi(self) self.setMinimumSize(850,600) self.show() self.ui.locBtn.clicked.connect(lambda: self.display()) def display(self): DRIVER_NAME='SQL Server' SERVER_NAME='DESKTOP-TF6BQMV\SQLEXPRESS01' DATABASE_NAME='SCM' connection_string= f""" DRIVER={{{DRIVER_NAME}}}; SERVER={SERVER_NAME}; DATABASE={DATABASE_NAME}; Trust_Connection=yes; """ conn=odbc.connect(connection_string) c=conn.cursor() df=pd.read_sql("select * from TK",conn) tenTK=self.ui.tenTK.text() ltk=self.ui.tkCb.currentText() df=df[df["LoaiTK"]==0] self.ui.tbTK.setRowCount(0) for row_number, row_data in df.iterrows(): self.ui.tbTK.insertRow(row_number) for column_number, data in enumerate(row_data): self.ui.tbTK.setItem(row_number, column_number, QtWidgets.QTableWidgetItem(str(data))) ## EXECUTE APP ######################################################################## if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_())
当过滤条件改为df=df[df["LoaiTK"]==1]时,TableWidget能正常显示对应数据;但保留df=df[df["LoaiTK"]==0]时,TableWidget无数据显示,而数据库中确实存在LoaiTK值为0和1的两条数据,求问题原因及解决方法。
问题原因分析
- 数据类型不匹配:SQL Server中
LoaiTK字段可能不是整数类型(比如bit、varchar),用整数0直接匹配会导致过滤无结果。 - pandas类型转换异常:pyodbc读取数据时,可能将
LoaiTK的0值转换为其他形式(如bit类型对应False、字符串类型对应"0"),直接用==0无法匹配。 - 隐式空值干扰:如果
LoaiTK=0的行存在空值,会导致布尔索引过滤失效。
解决方法
1. 先排查数据真实形态
在df=pd.read_sql("select * from TK",conn)后添加调试代码,确认LoaiTK的类型和实际值:
print(df["LoaiTK"].dtype) print(df["LoaiTK"].unique())
运行后根据输出调整过滤逻辑。
2. 针对性调整过滤条件
- 若为bit类型:SQL Server的bit在pandas中转为布尔值,0对应
False,过滤条件改为:df = df[df["LoaiTK"] == False] - 若为字符串类型:0存储为"0",过滤条件改为:
df = df[df["LoaiTK"] == "0"] - 若存在空值:先排除空值再过滤:
df = df[df["LoaiTK"].notna() & (df["LoaiTK"] == 0)]
3. 直接在SQL中过滤(推荐)
绕过pandas类型转换问题,让数据库直接返回目标数据:
df = pd.read_sql("select * from TK where LoaiTK = 0", conn)
4. 优化TableWidget填充逻辑
当前用iterrows()效率较低,可改为提前设置行数,同时处理空数据场景:
self.ui.tbTK.setRowCount(df.shape[0]) for row_idx, row in df.iterrows(): for col_idx, value in enumerate(row): self.ui.tbTK.setItem(row_idx, col_idx, QtWidgets.QTableWidgetItem(str(value)))
内容的提问来源于stack exchange,提问作者Matt John
相关产品推荐
相关产品推荐

