Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tkinker列表框绑定似乎不起作用_Python_Tkinter - Fatal编程技术网

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)