Python tkinter 列表框绑定 仅在第二次单击时有效

2024-01-01

如果有其他讨论已经解决了这个问题,我预先表示歉意,但我找不到任何东西。我是 Python 新手(除了 90 年代的一点点 Pascal 之外,我也是编程新手)。

我正在构建一个带有 tk 输入框的 GUI,供用户输入值,然后将其存储在 sqlite 数据库中。我希望用户能够单击列表框中某一字段的值,然后用所选记录的所有字段的值重新填充 tk 输入框。我已经能够完成这项工作,但它仅在第二次单击时起作用,因为我将列表框绑定到函数以填充 Button-1 上的 tk 输入框。第一次单击会生成以下错误,我在其他问题中看到了引用,但我无法将这些答案转化为我的情况:

Error:

回溯(最近一次调用最后一次): 文件“...\Python\Python38-32\lib\tkinter__init__.py”,第 1883 行,位于call返回 self.func(*args) 文件“fe.py”,第 108 行,在 selectitem 中 所选项目.append(lb1.get(index)) 文件“...\Python\Python38-32\lib\tkinter__init__.py”,第 3182 行,在 get 中 返回 self.tk.call(self._w, 'get', 首先) _tkinter.TclError:错误的列表框索引“”:必须是活动的、锚点、结束、@x、y 或数字

下面是复制错误的示例代码 - 要使用,首先通过填写 VAL 和 REF 框并单击添加项目按钮,通过设置 -> 项目菜单添加几个值。然后单击列表框中的一项。第一次单击应该会生成上述错误。当您第二次单击时,应填充输入框:

```
import sqlite3  
import itertools  
import tkinter as tk  
from tkinter import ttk  

INTRO_FONT = ("Arial", 72)  
LARGE_FONT = ("Arial", 12)  
NORMAL_FONT = ("Arial", 10)  
SMALL_FONT = ("Arial", 8)  

#Function to create database  

def create_db():  
    conn = sqlite3.connect("demo.db")  
    cur = conn.cursor()  
    cur.execute("CREATE TABLE IF NOT EXISTS demotable (id INTEGER PRIMARY KEY, val TEXT, ref TEXT)")  
    conn.commit()  
    conn.close()  

#Create database

create_db()

#Main Class to manage frames

class demo(tk.Tk):

    def __init__(self,*args,**kwargs):

        tk.Tk.__init__(self,*args,**kwargs)

        container = tk.Frame(self)
        container.pack(side="top",fill="both",expand=True)
        container.grid_rowconfigure(0,weight=1)
        container.grid_columnconfigure(0,weight=1)

        menubar = tk.Menu(container)

        filemenu = tk.Menu(menubar,tearoff=0)
        filemenu.add_command(label="Exit", command=quit)
        menubar.add_cascade(label="File", menu=filemenu)

        setupmenu = tk.Menu(menubar, tearoff=0)
        setupmenu.add_command(label="Items",command = lambda: self.show_frame(Itemsetuppage))
        menubar.add_cascade(label="Setup", menu=setupmenu)

        tk.Tk.config(self, menu=menubar)

        self.frames={}

        for F in (Itemsetuppage,Itemsetuppage):

            frame = F(container, self)

            self.frames[F] = frame

            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame(Itemsetuppage)

    def show_frame(self, cont):

        frame = self.frames[cont]
        frame.tkraise()  

# Frame that inserts and loads values

class Itemsetuppage(tk.Frame):

def __init__(self, parent, controller):

    tk.Frame.__init__(self, parent)

    #Function to populate listbox with values

    def popitemlist(self):
        lb1.delete(0, tk.END)
        for item in itemlist():
            lb1.insert(tk.END, item)

    #Function to add new item to database
    def additem():
        additem_db(val.get(), ref.get())
        val_entry.delete(0, 'end')
        ref_entry.delete(0, 'end')
        popitemlist(self)

    #Function used to populate tk.Entry boxes from database when item in listbox is clicked
    def selectitem(event):
        global selecteditem
        selecteditem = []
        ndex = lb1.curselection()
        selecteditem.append(lb1.get(ndex))
        itemquery = select_item(selecteditem)
        val_entry.delete(0, 'end')
        val_entry.insert(0, itemquery[1])
        ref_entry.delete(0, 'end')
        ref_entry.insert(0, itemquery[2])

    #Function to query database for values to populate lb1
    def itemlist():
        conn = sqlite3.connect("demo.db")
        cur = conn.cursor()
        cur.execute("SELECT DISTINCT val FROM demotable")
        results = cur.fetchall()
        itemlist = list(itertools.chain(*results))
        conn.commit()
        conn.close()
        return itemlist

    #Function to insert values from tk.Entry boxes to database
    def additem_db(val, ref):
        conn = sqlite3.connect("demo.db")
        cur = conn.cursor()
        cur.execute("INSERT OR IGNORE INTO demotable VALUES (NULL, ?, ?)",(val,ref))
        conn.commit()
        conn.close()

    #Function to query database for individual record to populate tk.Entry boxes when item is clicked in lb1
    def select_item(val):
        conn = sqlite3.connect("demo.db")
        cur = conn.cursor()
        cur.execute("SELECT * FROM demotable WHERE val=?",(val))
        results = cur.fetchall()
        itemdetail = list(itertools.chain(*results))
        conn.commit()
        conn.close()
        return itemdetail

    l1 = tk.Label(self, text="Values in database:")
    l1.grid(row=0, column=0, padx=5, pady=5)

    lb1 = tk.Listbox(self, selectmode=tk.SINGLE)
    lb1.grid(row=1, column=0, padx=5, pady=5)
    popitemlist(self)
    lb1.bind("<Button-1>", selectitem)

    l2 = tk.Label(self, text="Type val into entry box to store:")
    l2.grid(row=0, column=1, padx=5, pady=5)

    val = tk.StringVar(self)
    val_entry = tk.Entry(self, textvariable=val)
    val_entry.grid(row=0, column=2, padx=5, pady=5)

    l2 = tk.Label(self, text="Type ref into entry box to store:")
    l2.grid(row=1, column=1, padx=5, pady=5)

    ref = tk.StringVar(self)
    ref_entry = tk.Entry(self, textvariable=ref)
    ref_entry.grid(row=1, column=2, padx=5, pady=5)

    b1 = tk.Button(self, text="Add item",command=additem)
    b1.grid(row=2, column=2, padx=5, pady=5)

app = demo()  
app.geometry("480x240")  
app.mainloop()

``` 

谢谢您,如果我的代码冒犯了任何人,我们深表歉意!


没有运行你的代码,因为我没有 sqlite3 数据库,我可能还很遥远,但是当选择一个值时,列表框会生成一个虚拟事件<<ListboxSelect>>您可以绑定到它。尝试更换:

lb1.bind("<Button-1>", selectitem)

with

lb1.bind("<<ListboxSelect>>", selectitem)

另外,我认为lb1.curselection()返回一个元组...,尝试打印它,看看会得到什么。在我检查的代码中我总是这样做lb1.curselection()[0].

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python tkinter 列表框绑定 仅在第二次单击时有效 的相关文章

随机推荐

  • Spring Boot应用程序中的双日志文件

    我有一个名为 service1 的 Spring Boot 应用程序 它使用以下属性文件层次结构来配置日志 bootstrap yml 有 spring application name service1 application yml 有
  • MySQL 触发器为新行设置值并更新同一表中的另一行

    我有一个表格来跟踪特定项目的费用 这些费用可能会随着时间的推移而变化 因此我有两列 startDate endDate 当前的费用集始终在遥远的将来有一个 endDate 我已经有一个触发器 用于对输入的新行进行一些计算 但我还希望发生的是
  • Java 中的 XSLT 转换极其缓慢

    我尝试使用 XSLT 转换 XML 文档 作为输入 我有 www wordpress org XHTML 源代码 XSLT 是检索站点标题的虚拟示例 实际上它什么也做不了 它不会改变任何东西 我使用的每个 API 或库 转换大约需要 2 分
  • 如何使 JavaFX TableView 单元格可编辑?

    有很多教程和很多建议 可以通过扩展 JavaFX 单元使其可编辑来实现此目的 好的一个是这个计算器问题 https stackoverflow com questions 7880494 tableview better editing t
  • 在 Objective C 中使用下划线作为属性名称前缀 [重复]

    这个问题在这里已经有答案了 我以前避免在变量名中使用下划线 这可能是我大学 Java 时代的遗留下来的 因此 当我在 Objective C 中定义属性时 我自然会这样做 In the header interface Whatever N
  • “警告 C0007:架构具有未绑定的实例”问题!

    我从 数字设计基础 一书随附的 CD 中获取了以下源代码 当我尝试运行该程序时 出现以下错误 Compiling Fig17 13 vhd C Users SPIDER Desktop EE460 The Final Project Fig
  • 如何在 SQL 中表示和插入有序列表?

    我想在 SQL 表中表示列表 hi hello goodbye good day howdy 按照该顺序 pk i val 1 0 hi 0 2 hello 2 3 goodbye 3 4 good day 5 6 howdy pk 是主键
  • MVC 获取 Azure Active Directory 经过身份验证的用户的名字和姓氏

    我可以使用以下方法获取经过身份验证的用户的用户名 电子邮件格式 var autenticateduser HttpContext User Identity Name 使用 QuickWatch 窗口 我可以使用以下表达式找到名字和姓氏 有
  • 如何在Delphi中定义版本“及以上”ifdefs?

    我正在努力让 Log4D 在 Delphi XE4 中工作 并且遇到一些编译错误 因为它在 use 子句中找不到 Contnrs 除非我将它移到它定义的 ifdef 之外 IFDEF DELPHI5 UP Contnrs ENDIF 经过一
  • 将轮询 Web 服务转换为 RX

    Given public partial class Weather private readonly DispatcherTimer timer new DispatcherTimer private readonly IWeatherD
  • Django 模板内联 jQuery 不起作用

    尝试在我的模板中使用内联 jQuery 以便稍后可以在 AJAX 调用中使用 django url 标签 但我无法让 javascript 工作 在我的子页面中 我扩展了索引页面 其中包含我所有的 javascript 和 jQuery 库
  • 限制减法结果的下限

    我想从标量中减去向量中的值 但是 如果结果小于零 我想将结果设置为零 我尝试过使用max 但它没有给我预期的结果 s 1 750 0 975 0 1125 0 1237 5 1312 5 1400 0 max 1050 s 0 1 300
  • 如何使用apache Camel从mysql表中读取数据并写入到另一个表中

    伙计们 我正在使用 Apache Camel 从 mysql 表读取数据 我在控制台上成功打印它 但根据我的要求 我需要从一个mysql数据库读取数据 然后使用某种条件过滤它 然后将过滤后的数据插入到另一个mysql数据库表中 我在下面发布
  • 如何在Rails中检索图像的EXIF信息

    我正在使用 Rails 回形针在我的页面中显示图像 我想知道如何检索图像的 EXIF 信息 如尺寸 相机型号 高度 宽度等 有人可以帮我吗 谢谢 你给了吗exifr https github com remvee exifr 宝石尝试一下吗
  • 如何在 Java 中覆盖 HTTP 连接中的 DNS

    Curl 具有手动指定将主机解析到哪个 IP 的功能 例如 curl https google com resolve google com 443 173 194 72 113 这在使用 HTTPS 时特别有用 如果只是一个 HTTP 请
  • 在 Scala 工作表中使用自定义枚举时收到错误:java.lang.ExceptionInInitializerError

    UPDATE 2014年9月17日 事实证明 即使先前更新 从 2013 年 2 月 19 日起 中的解决方案无法工作如果一个地方println Value Player2 作为第一个命令 即序数仍然分配不正确 从那以后我创建了一个可验证的
  • Google Play 分阶段推出并修改了屏幕截图

    使用 Google Play 分阶段推出选项 我可以向一小部分用户发布 Android 应用的新版本 根据它的成功程度 我会在给定时间内增加百分比 我假设 因为我找不到记录 如果我将应用程序推广到 10 那么该应用程序的新用户和现有用户都会
  • 使用 nil 合并运算符缩短编译时间

    读完后article https habrahabr ru post 283106 关于快速编译时间 我感兴趣的是为什么使用超过 2 个序列合并运算符会显着增加编译时间 例子 编译时间 3 65 秒 func fn gt Int let a
  • 如何创建自定义 Symfony2 Twig 表单模板块

    我正在开发一个项目 我需要一些自定义表单模板块 不是现有块的修改版本 而是新块 我已经能够创建新的块并让 Symfony Twig 识别和使用它们 但有限制 表单模板块似乎有严格的命名约定 看来模板名称必须恰好包含一个下划线 下划线之前的单
  • Python tkinter 列表框绑定 仅在第二次单击时有效

    如果有其他讨论已经解决了这个问题 我预先表示歉意 但我找不到任何东西 我是 Python 新手 除了 90 年代的一点点 Pascal 之外 我也是编程新手 我正在构建一个带有 tk 输入框的 GUI 供用户输入值 然后将其存储在 sqli