在 Python 的 tkinter 中,有人可以确定为什么 <<ListBoxSelect>> 没有开火吗?
In tkinter for Python, can someone identify why <<ListBoxSelect>> is not firing?
我正在尝试在 python 中使用 tkinter 开发一个小型数据库应用程序。我有一个小型数据库,其中包含各种资产的库存编号。我已经使用 tkinter 成功构建了列表框,并设法使用 sqlite3 的库填充它。
我一直在尝试将 << ListBoxSelect >> 事件绑定到在列表框中选择的项目并输出资产的信息。几个小时后,我现在要做的就是让绑定事件完全触发并打印出一个简单的字符串,直到我弄清楚为止。
在我 post 我的代码之前,我使用 This code snippet 来查看是否可以让任何绑定事件起作用。该代码片段确实有效,但是尝试将其编写的方式集成到我自己的代码中并没有成功。事件绑定器根本不会在我的代码中触发。任何人都可以确定这是为什么或我做错了什么吗?
请查看下面的相关代码(请注意粘贴到本论坛时缩进不正确):
class MainWindow(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
# Create Widgets
self.invListbox = tk.Listbox(self, height=20, width=10, selectmode=tk.SINGLE)
self.assetDescLabel1 = tk.Label(self, text="Asset Description")
self.assetDescEntry1 = tk.Entry(self)
self.exitButton = tk.Button(self, text="Exit", command=exit)
# Configure Widgets
# Updates assetDescEntry based on invListbox selection
self.invListbox.bind('<<ListboxSelect>>', self.invOnSelect())
# Place Widgets
self.invListbox.grid(row=1, column=1)
self.assetDescLabel1.grid(row=1, column=2)
self.assetDescEntry1.grid(row=2, column=2)
self.exitButton.grid(row=2, column=1)
# Populate invListbox
self.InvList = main.sqlInventoryNumberList()
for row in self.InvList:
item = row[0]
self.invListbox.insert(1, item)
def invOnSelect(self):
selection = "This is just a regular old string"
print(selection)
我无法将上面的代码添加到 运行,因为缺少太多内容。您必须在 bind 语句中绑定函数而不是函数的结果。所以 .bind( ... , func )
不是 .bind(..., func() )
。您的函数也必须采用事件对象。下面是一个最小的工作示例。
import tkinter as tk
def invOnSelect(event):
selection = "This is just a regular old string"
print( event, selection )
root = tk.Tk()
invListbox = tk.Listbox( root, height=20, width=10, selectmode=tk.SINGLE )
invListbox.grid()
invListbox.bind( '<<ListboxSelect>>', invOnSelect ) # invOnSelect has no brackets here.
InvList = [ '1', '2', '3' ]
for item in InvList:
invListbox.insert(tk.END, item)
root.mainloop()
这些想法应该融入您的应用程序。
我正在尝试在 python 中使用 tkinter 开发一个小型数据库应用程序。我有一个小型数据库,其中包含各种资产的库存编号。我已经使用 tkinter 成功构建了列表框,并设法使用 sqlite3 的库填充它。
我一直在尝试将 << ListBoxSelect >> 事件绑定到在列表框中选择的项目并输出资产的信息。几个小时后,我现在要做的就是让绑定事件完全触发并打印出一个简单的字符串,直到我弄清楚为止。
在我 post 我的代码之前,我使用 This code snippet 来查看是否可以让任何绑定事件起作用。该代码片段确实有效,但是尝试将其编写的方式集成到我自己的代码中并没有成功。事件绑定器根本不会在我的代码中触发。任何人都可以确定这是为什么或我做错了什么吗?
请查看下面的相关代码(请注意粘贴到本论坛时缩进不正确):
class MainWindow(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
# Create Widgets
self.invListbox = tk.Listbox(self, height=20, width=10, selectmode=tk.SINGLE)
self.assetDescLabel1 = tk.Label(self, text="Asset Description")
self.assetDescEntry1 = tk.Entry(self)
self.exitButton = tk.Button(self, text="Exit", command=exit)
# Configure Widgets
# Updates assetDescEntry based on invListbox selection
self.invListbox.bind('<<ListboxSelect>>', self.invOnSelect())
# Place Widgets
self.invListbox.grid(row=1, column=1)
self.assetDescLabel1.grid(row=1, column=2)
self.assetDescEntry1.grid(row=2, column=2)
self.exitButton.grid(row=2, column=1)
# Populate invListbox
self.InvList = main.sqlInventoryNumberList()
for row in self.InvList:
item = row[0]
self.invListbox.insert(1, item)
def invOnSelect(self):
selection = "This is just a regular old string"
print(selection)
我无法将上面的代码添加到 运行,因为缺少太多内容。您必须在 bind 语句中绑定函数而不是函数的结果。所以 .bind( ... , func )
不是 .bind(..., func() )
。您的函数也必须采用事件对象。下面是一个最小的工作示例。
import tkinter as tk
def invOnSelect(event):
selection = "This is just a regular old string"
print( event, selection )
root = tk.Tk()
invListbox = tk.Listbox( root, height=20, width=10, selectmode=tk.SINGLE )
invListbox.grid()
invListbox.bind( '<<ListboxSelect>>', invOnSelect ) # invOnSelect has no brackets here.
InvList = [ '1', '2', '3' ]
for item in InvList:
invListbox.insert(tk.END, item)
root.mainloop()
这些想法应该融入您的应用程序。