Python Tkinker列表框绑定似乎不起作用
我正在从控制台脚本启动一个简单的对话框来显示一个项目列表,双击列表元素时应该关闭该列表。我正在隐藏根,并等待脚本继续执行操作。尽管如此,当我双击列表元素时并没有发生任何事情,尽管一些消息应该在控制台中打印出来Python Tkinker列表框绑定似乎不起作用,python,tkinter,Python,Tkinter,我正在从控制台脚本启动一个简单的对话框来显示一个项目列表,双击列表元素时应该关闭该列表。我正在隐藏根,并等待脚本继续执行操作。尽管如此,当我双击列表元素时并没有发生任何事情,尽管一些消息应该在控制台中打印出来 import Tkinter as tk class SelectionList: def __init__(self, list_of_options): root = tk.Tk() self.top = tk.Toplevel(root)
import Tkinter as tk
class SelectionList:
def __init__(self, list_of_options):
root = tk.Tk()
self.top = tk.Toplevel(root)
root.withdraw()
self.selection = None
self.initialize(list_of_options)
root.wait_window(self.top)
def initialize(self, list_of_options):
frame = tk.LabelFrame(self.top, text='Select an option')
frame.grid(
row=0, columnspan=1, sticky='W', padx=5, pady=5, ipadx=5, ipady=5)
self.listbox = tk.Listbox(self.top, width=25, height=10)
self.listbox.grid(row=0, column=0, sticky='E', padx=5, pady=2)
for opt in list_of_options:
self.listbox.insert(tk.END, opt)
self.listbox.bind('<Double-1>', self.selection)
def selection(self):
print 'Hello world'
self.selection = self.listbox.get(self.listbox.curselection()[0])
print self.selection
self.quit()
将Tkinter作为tk导入
类别选择列表:
定义初始化(自我,选项列表):
root=tk.tk()
self.top=tk.Toplevel(根)
root.draw()
self.selection=None
自我初始化(选项列表)
root.wait\u窗口(self.top)
def初始化(自我,选项列表):
frame=tk.LabelFrame(self.top,text='Select an option')
frame.grid(
行=0,列span=1,粘性=W',padx=5,pady=5,ipadx=5,ipady=5)
self.listbox=tk.listbox(self.top,宽度=25,高度=10)
self.listbox.grid(行=0,列=0,粘滞=E',padx=5,pady=2)
对于选项列表中的选项:
self.listbox.insert(tk.END,opt)
self.listbox.bind(“”,self.selection)
def选择(自):
打印“Hello world”
self.selection=self.listbox.get(self.listbox.curselection()[0])
打印自选
self.quit()
有什么想法吗
编辑:根据吉尔的回答,我编辑了我的代码:
- 现在该方法被称为_get_selection,以避免与self.selection变量冲突。该方法还接收一个事件,即使我不使用它
- 我调用主循环,并删除了顶层。该类现在从Tkinker.Tk继承,因此实现了一个quit方法
将Tkinter作为tk导入
类别选择列表(tk.tk):
定义初始化(自我,选项列表):
tk.tk.\uuuu初始化(self,None)
self.title('选择一个选项')
self.selection=None
自我初始化(选项列表)
def初始化(自我,选项列表):
frame=tk.LabelFrame(self,text='Select an option')
frame.grid(
行=0,列span=1,粘性=W',padx=5,pady=5,ipadx=5,ipady=5)
self.listbox=tk.listbox(self,宽度=25,高度=10)
self.listbox.grid(行=0,列=0,粘滞=E',padx=5,pady=2)
对于选项列表中的选项:
self.listbox.insert(tk.END,opt)
self.listbox.bind(“”,lambda ev:self.\u获取\u选择)
定义获取选择(自身、事件):
打印“Hello world”
self.selection=self.listbox.get(self.listbox.curselection())
打印自选
self.quit()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
选项列表=['a','b','c','d']
对话框=选择列表(选项列表)
dialog.mainloop()
打印“选定:”+str(对话框选择)
存在许多问题
1) 您定义了self.selection
两次(或者三次,具体取决于您的计数方式)。有一种方法叫做选择
。然后在\uuuu init\uuuu
中有一个同名属性,设置为None
(然后在方法选择中重置该属性)。事实上,该方法受属性的影响,因此当您将列表框绑定到self.selection
时,您将其绑定到None
,因此如果您注意控制台,双击时您将得到一个TypeError
据我所知,属性selection
对您没有任何作用。把它拿走。和selection
方法主体中的self.selection
应重命名为其他内容。如果不需要记住所选项目,请使用局部变量:
selection = self.listbox.get(self.listbox.curselection()[0])
print(selection)
完成后:
2) 绑定到小部件的函数必须采用事件参数。您的选择
方法不接受该参数(它将self
作为第一个参数,并且没有空间容纳其他参数)。因此,您需要更改选择的签名
或更改绑定的函数。要做到后者:
self.listbox.bind('<Double-1>', lambda e: self.selection())
编辑:
我原来的答案中有一个致命的错误:
self.listbox.bind('<Double-1>', lambda e: self.selection)
没有()
就像在下面的代码中调用bar()
foo()
不会被调用,也不会打印任何内容
def foo():
print('foo')
def bar():
foo # should be foo()
为了充实另一种选择:如果你想避免lambda
,你可以简单地在self.selection
(现在self.\u在你编辑的问题中获取选择
,但我将继续使用旧版本)。在您的情况下,不会使用事件参数,但这很好
def selection(self, event):
# no change to the rest
而且绑定可以很简单(这次没有()
):
self.listbox.bind(“”,self.selection)
存在许多问题
1) 您定义了self.selection
两次(或者三次,具体取决于您的计数方式)。有一种方法叫做选择
。然后在\uuuu init\uuuu
中有一个同名属性,设置为None
(然后在方法选择中重置该属性)。事实上,该方法受属性的影响,因此当您将列表框绑定到self.selection
时,您将其绑定到None
,因此如果您注意控制台,双击时您将得到一个TypeError
据我所知,属性selection
对您没有任何作用。把它拿走。和selection
方法主体中的self.selection
应重命名为其他内容。如果不需要记住所选项目,请使用局部变量:
selection = self.listbox.get(self.listbox.curselection()[0])
print(selection)
完成后:
2) 绑定到小部件的函数必须采用事件参数。你的sel
def foo():
print('foo')
def bar():
foo # should be foo()
def selection(self, event):
# no change to the rest
self.listbox.bind('<Double-1>', self.selection)