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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 20:05:15