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

如何将可变长度列表条目逐个插入wx.ListCtrl实现单独可选

解决wx.ListCtrl批量添加独立可选项的问题

你当前的问题是从SQL数据库提取零件号后,wx.ListCtrl将所有零件号作为单个选项展示,无法实现逐个选择。核心问题出在DataFrame转列表的方式错误,以及wx.ListCtrl的初始化配置缺失。

问题根源

  1. 原代码用pndf.to_string(index=False,header=0)把整个PN列转成了一个大字符串,导致Combobox.Append([dflist])只添加了一个条目。
  2. wx.ListCtrl默认风格不支持带复选框的多条目展示,需要设置为报表模式(wx.LC_REPORT)才能正常显示复选框和多行内容。

解决方案

  1. 正确转换DataFrame为零件号列表:使用pndf['PN'].tolist()获取单个零件号组成的列表,同时用dropna过滤空值更规范。
  2. 配置ListCtrl为报表模式:初始化时添加style=wx.LC_REPORT | wx.LC_HRULES,并启用复选框。
  3. 添加列并批量插入条目:先插入列,再遍历零件号列表逐个添加到ListCtrl中。

修改后的完整代码

import wx
import wx.adv
import sqlalchemy
from six.moves import urllib
import pandas as pd

# 读取SQL列用于下拉菜单
params = urllib.parse.quote_plus(
    "Driver={ODBC Driver 18 for SQL Server};"
    "Server=SERVER;"
    "Database=DB;"
    "Trusted_Connection=yes;"
    "TrustServerCertificate=yes"
)
engine = sqlalchemy.create_engine(f"mssql+pyodbc:///?odbc_connect={params}") 
engine.connect()

# 获取零件号列表并处理空值
sqlread = pd.read_sql_query('''SELECT * FROM Shortage''', engine)
pndf = pd.DataFrame(sqlread, columns=['PN'])
# 过滤空值,比原写法更严谨
pndf = pndf.dropna(subset=['PN'])
# 转换为单个零件号的列表
pn_list = pndf['PN'].tolist()

print(pn_list)

class compwin(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, 'Shortage Sheet Compiler v0.1', size=(400, 300))
        panel = wx.Panel(self, -1)

        # 提示文本
        wx.TextCtrl(panel, value="Update What Part?", size=(100, 20), pos=(25, 20), style=wx.TE_READONLY | wx.BORDER_NONE)

        # 初始化带复选框的ListCtrl,设置报表模式
        Combobox = wx.ListCtrl(panel, wx.ID_ANY, size=(125, 125), pos=(20, 40), style=wx.LC_REPORT | wx.LC_HRULES)
        Combobox.EnableCheckBoxes()
        # 添加列(报表模式必须先加列)
        Combobox.InsertColumn(0, "零件号")
        
        # 批量添加零件号条目
        for pn in pn_list:
            # Append接收列表参数,每个元素对应一列的值
            Combobox.Append([pn])

if __name__ == '__main__':
    app = wx.App()
    frame = compwin()
    frame.Show()
    app.MainLoop()

关键修改点

  • 替换to_string为tolist(),得到独立的零件号列表。
  • 初始化ListCtrl时添加wx.LC_REPORT风格,确保支持多行和复选框。
  • 先插入列,再循环添加每个零件号作为单独条目。

内容的提问来源于stack exchange,提问作者Anima_et_Animus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 18:34:49