如何将可变长度列表条目逐个插入wx.ListCtrl实现单独可选
解决wx.ListCtrl批量添加独立可选项的问题
你当前的问题是从SQL数据库提取零件号后,wx.ListCtrl将所有零件号作为单个选项展示,无法实现逐个选择。核心问题出在DataFrame转列表的方式错误,以及wx.ListCtrl的初始化配置缺失。
问题根源
- 原代码用
pndf.to_string(index=False,header=0)把整个PN列转成了一个大字符串,导致Combobox.Append([dflist])只添加了一个条目。 - wx.ListCtrl默认风格不支持带复选框的多条目展示,需要设置为报表模式(
wx.LC_REPORT)才能正常显示复选框和多行内容。
解决方案
- 正确转换DataFrame为零件号列表:使用
pndf['PN'].tolist()获取单个零件号组成的列表,同时用dropna过滤空值更规范。 - 配置ListCtrl为报表模式:初始化时添加
style=wx.LC_REPORT | wx.LC_HRULES,并启用复选框。 - 添加列并批量插入条目:先插入列,再遍历零件号列表逐个添加到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
相关产品推荐
相关产品推荐

