从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
相关产品推荐
相关产品推荐

