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

如何用wxPython按钮实现ListCtrl列表的刷新功能?

实现ListCtrl列表刷新功能

我有一个关联SQL数据库的ListCtrl控件,它会从数据库拉取零件编号列表,供用户选择更新特定零件。我希望实现让用户点击按钮刷新列表,查看更新后的内容。

当前代码如下:

import sys
import wx
import wx.adv

dflist = ['Test1'],['Test2']


class compwin(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self,None,-1,'',
                          size=(300,300))
        panel = wx.Panel(self,-1)
        self.part = None
        #textbox printout

        #Prompts for Update Field
        wx.TextCtrl(panel,value = "Update Part:",size=(100,20),pos=(5,10),style=wx.TE_READONLY|wx.BORDER_NONE)
        def ComboBox(panel):
            self.ComboUp = wx.ListCtrl(panel, wx.ID_ANY, size=(150,125),pos=(10,30),style=wx.LC_REPORT|wx.LC_SORT_ASCENDING)
            self.ComboUp.InsertColumn(0,"Select a Part Number:",wx.LIST_FORMAT_RIGHT)
            self.ComboUp.SetColumnWidth(0,150)
            for Part in dflist:
                self.ComboUp.Append((Part))
            return
        ComboBox(panel)

        #define buttons
        self.refresh = wx.Button(panel,label ="Refresh", name ="3",pos=(200,180))
        
        #bindings for panel
   
        self.Bind(wx.EVT_BUTTON,self.OnClick_Refresh,self.refresh)

############################ REFRESH BUTTON #########################################
    def OnClick_Refresh(self,e):
        self.ComboUp.Destroy()
        wx.BeginBusyCursor()
        self.ComboUp = wx.ListCtrl(self,wx.ID_ANY, size=(150,125),pos=(10,10),style=wx.LC_REPORT|wx.LC_SORT_ASCENDING)
        self.ComboUp.InsertColumn(0,"Select a Part Number:",wx.LIST_FORMAT_RIGHT)
        self.ComboUp.SetColumnWidth(0,150)
        for Part in dflist:
            self.ComboUp.Append((Part))        
        wx.EndBusyCursor()

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

我尝试在OnClick_Refresh方法中调用嵌套的ComboBox函数:

j = compwin()
j.ComboBox()

但出现错误:

AttributeError: 'compwin' object has no attribute 'ComboBox'. Did you mean: 'ComboUp'?

原本以为销毁ListCtrl后重新创建是最简单的方法,但显然理解有误,请问如何实现点击按钮刷新列表的功能?


解决方案

错误原因

ComboBox是__init__方法内部定义的嵌套函数,不属于compwin类的成员方法,所以无法通过类实例调用。另外,销毁重建控件不仅麻烦,还可能导致布局错乱,更高效的方式是清空现有列表内容,重新从数据库拉取数据并填充。

修正后的代码

import sys
import wx
import wx.adv

# 模拟数据库数据,实际使用时替换为从SQL查询的逻辑
def get_part_list():
    # 这里可以替换成你的SQL查询代码,比如:
    # import sqlite3
    # conn = sqlite3.connect('your_db.db')
    # cursor = conn.cursor()
    # cursor.execute("SELECT part_number FROM parts")
    # return cursor.fetchall()
    return [('Test1',), ('Test2',)]

class compwin(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, '零件更新选择', size=(300,300))
        self.panel = wx.Panel(self, -1)
        self.part = None

        # 静态提示文本
        wx.TextCtrl(self.panel, value="Update Part:", size=(100,20), pos=(5,10), 
                    style=wx.TE_READONLY|wx.BORDER_NONE)
        
        # 初始化ListCtrl
        self._init_listctrl()

        # 刷新按钮
        self.refresh = wx.Button(self.panel, label="Refresh", name="3", pos=(200,180))
        self.Bind(wx.EVT_BUTTON, self.OnClick_Refresh, self.refresh)

    def _init_listctrl(self):
        """初始化ListCtrl控件并填充数据"""
        self.ComboUp = wx.ListCtrl(self.panel, wx.ID_ANY, size=(150,125), pos=(10,30),
                                  style=wx.LC_REPORT|wx.LC_SORT_ASCENDING)
        self.ComboUp.InsertColumn(0, "Select a Part Number:", wx.LIST_FORMAT_RIGHT)
        self.ComboUp.SetColumnWidth(0, 150)
        self._fill_list_data()

    def _fill_list_data(self):
        """填充ListCtrl的数据,刷新时直接调用此方法"""
        # 清空现有内容
        self.ComboUp.DeleteAllItems()
        # 从数据源获取最新数据(实际是从SQL数据库拉取)
        part_list = get_part_list()
        # 填充新数据
        for part in part_list:
            self.ComboUp.Append(part)

    def OnClick_Refresh(self, e):
        wx.BeginBusyCursor()
        # 直接刷新数据,无需销毁重建控件
        self._fill_list_data()
        wx.EndBusyCursor()

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

关键修改点

  1. 提取复用方法:把原来的嵌套ComboBox函数拆分为类的成员方法_init_listctrl(初始化控件)和_fill_list_data(填充数据),方便刷新时复用。
  2. 高效刷新逻辑:刷新时调用_fill_list_data,先通过DeleteAllItems()清空现有内容,再重新拉取最新数据填充,避免销毁重建控件的麻烦。
  3. 数据源解耦:新增get_part_list函数模拟数据库查询,实际使用时替换为你的SQL查询逻辑,让数据获取和界面逻辑分离。
  4. 修正父容器问题:确保ListCtrl的父容器始终是self.panel,避免之前刷新时把父容器设为self(Frame)导致的位置偏移。

内容的提问来源于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 04:57:04