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

从wx.TextCtrl向SQL插入数据及获取wx.ListCtrl选中值问题

问题解决方案

1. 解决SQL插入的参数缺失报错

你遇到的报错是因为调用数据库插入函数时,未传入函数定义要求的db、query、parameters三个必填参数。以下是匹配的函数定义与调用示例,结合wx.TextCtrl取值逻辑:

正确实现代码

import wx
import sqlite3  # 以SQLite为例,其他数据库逻辑通用

def insert_to_db(db, query, parameters):
    conn = sqlite3.connect(db)
    cursor = conn.cursor()
    try:
        cursor.execute(query, parameters)
        conn.commit()
    except Exception as e:
        print(f"插入失败: {e}")
        conn.rollback()
    finally:
        conn.close()

class DemoFrame(wx.Frame):
    def __init__(self):
        super().__init__(None, title="数据插入Demo", size=(300, 200))
        panel = wx.Panel(self)
        self.input_ctrl = wx.TextCtrl(panel, pos=(10,10), size=(200,30))
        insert_btn = wx.Button(panel, label="插入数据", pos=(10,50))
        insert_btn.Bind(wx.EVT_BUTTON, self.handle_insert)

    def handle_insert(self, event):
        # 从TextCtrl提取值
        input_val = self.input_ctrl.GetValue().strip()
        if not input_val:
            wx.MessageBox("请输入内容", "提示")
            return
        
        # 传入所有必填参数调用插入函数
        db_path = "your_db.db"
        insert_sql = "INSERT INTO target_table (content) VALUES (?)"
        sql_params = (input_val,)
        insert_to_db(db_path, insert_sql, sql_params)  # 必须传全三个参数
        wx.MessageBox("插入成功", "提示")

if __name__ == "__main__":
    app = wx.App()
    frame = DemoFrame()
    frame.Show()
    app.MainLoop()

检查你的代码:如果数据库操作是类方法,确认是否正确传递self;如果是独立函数,必须保证调用时传入db、query、parameters三个参数,不能遗漏。

2. 获取wx.ListCtrl选中项的实际字符串值

wx.ListCtrl的GetFirstSelected()仅返回选中项的索引,要获取对应文本,需使用GetItemText(index, column)方法,其中column为目标列的索引(从0开始)。示例如下:

实现代码

import wx

class ListCtrlDemoFrame(wx.Frame):
    def __init__(self):
        super().__init__(None, title="ListCtrl取值Demo", size=(400, 300))
        panel = wx.Panel(self)
        
        # 创建带报表样式的ListCtrl
        self.list_ctrl = wx.ListCtrl(panel, pos=(10,10), size=(380,200), style=wx.LC_REPORT)
        self.list_ctrl.InsertColumn(0, "物品名称")
        # 填充测试数据
        test_items = ["笔记本", "钢笔", "便利贴"]
        for idx, item in enumerate(test_items):
            self.list_ctrl.InsertItem(idx, item)
        
        get_btn = wx.Button(panel, label="获取选中项", pos=(10,220))
        get_btn.Bind(wx.EVT_BUTTON, self.handle_get_selected)

    def handle_get_selected(self, event):
        # 获取选中项索引
        selected_idx = self.list_ctrl.GetFirstSelected()
        if selected_idx == -1:
            wx.MessageBox("请先选择一项", "提示")
            return
        
        # 获取选中项的实际文本(第0列)
        selected_text = self.list_ctrl.GetItemText(selected_idx, 0)
        wx.MessageBox(f"选中内容: {selected_text}", "结果")

if __name__ == "__main__":
    app = wx.App()
    frame = ListCtrlDemoFrame()
    frame.Show()
    app.MainLoop()

如果你的ListCtrl有多列,只需修改GetItemText的第二个参数为对应列的索引,即可获取该列的文本内容。


内容的提问来源于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 22:52:21