【问题标题】:How to bind a ListBox to the Return Key in order to close the window如何将列表框绑定到返回键以关闭窗口
【发布时间】:2018-06-05 08:38:57
【问题描述】:

这似乎是一个相当简单的问题,但我无法解决它。运行以下代码时,第一个窗口带有两个输入框。当我们使用'TAB'键时,第二个输入框会弹出一个窗口,需要从ListBox中选择一个值。我已经编写了 ListBox 中的值需要进入第一个窗口的输入框的部分,但是,一旦做出选择,我就无法关闭第二个窗口。

from Tkinter import *

def fn_jump(event=None):



    def listbox_update(data):
        # delete previous data
        listbox.delete(0, 'end')

        # put new data
        for item in data:
            listbox.insert('end', item)

    def on_select(event):
        # display element selected on list
        print('(event) previous:', event.widget.get('active'))
        print('(event)  current:', event.widget.get(event.widget.curselection()))
        a = (event.widget.get(event.widget.curselection()))
        print a
        txtbox2.delete(0, END)
        txtbox2.insert(0,a)
        #listbox.bind('<<Return>>', window3.quit())   #This is not working



    window3 = Toplevel()
    window3.title("This window popped out")
    window3.geometry('{}x{}'.format(500,200))



    listbox = Listbox(window3, width=60)
    listbox.grid(row=0)

    listbox.bind('<<ListboxSelect>>', on_select)


    test_list = ('apple', 'banana', 'Cranberry', 'dogwood', 'alpha', 'Acorn', 'Anise', 'Strawberry')

    listbox_update(test_list)


root = Tk()
txtbox1 = Entry(root)
txtbox2 = Entry(root)

txtbox1.grid(row=0)
txtbox2.grid(row=1)

txtbox2.bind('<KeyRelease>', fn_jump)


root.mainloop()

【问题讨论】:

    标签: python-2.7 tkinter pycharm


    【解决方案1】:

    替换:

    #listbox.bind('<<Return>>', window3.quit())   #This is not working
    

    与:

    listbox.bind('<Return>', lambda event : window3.destroy())
    

    正如您在txtbox2.bind('&lt;KeyRelease&gt;', fn_jump) 中看到的那样,bind 期望对要使用的回调函数有一个引用。按下回车键的正确绑定类型是'&lt;Return&gt;' 而不是'&lt;&lt;Return&gt;&gt;'

    【讨论】:

    • 感谢您的解释。您的评论为我指明了正确的方向,但没有满足要求。我会自己发布答案。
    • @mdabdullah 我不知道窗口不应重新弹出的要求。那是因为释放回车键仍然是调用fn_jump的键释放由于txtbox2.bind('&lt;KeyRelease&gt;', fn_jump)。不过,这不包括在问题中。
    【解决方案2】:

    在场景中,由于函数是在一个函数中定义的,仅仅销毁窗口意味着程序仍在父函数 fn_jump 中,从而一遍又一遍地弹出第二个窗口。 为了克服这个问题,我强行将焦点设置在根窗口上的一个文本框上,这解决了这个问题(我认为会有一个我们可以使用的 exit(),但我对 Python 比较陌生)。

    这是最终的工作代码:

    from Tkinter import *
    
    def fn_jump(event=None):
    
        def listbox_update(data):
            # delete previous data
            listbox.delete(0, 'end')
    
            # put new data
            for item in data:
                listbox.insert('end', item)
    
        def on_select(event):
            # display element selected on list
            print('(event) previous:', event.widget.get('active'))
            print('(event)  current:', event.widget.get(event.widget.curselection()))
            a = (event.widget.get(event.widget.curselection()))
            print a
            txtbox2.delete(0, END)
            txtbox2.insert(0,a)
    
    
        window3 = Toplevel()
        window3.title("This window popped out")
        window3.geometry('{}x{}'.format(500,200))
        listbox = Listbox(window3, width=60)
        listbox.grid(row=0)
        listbox.focus_set()
        listbox.bind('<<ListboxSelect>>', on_select)
        listbox.bind('<Return>', lambda event: window3.destroy())  #This is a fix
        txtbox1.focus_set()                                        #This is a fix
        test_list = ('apple', 'banana', 'Cranberry', 'dogwood', 'alpha', 'Acorn', 'Anise', 'Strawberry')
        listbox_update(test_list)
    
    
    root = Tk()
    txtbox1 = Entry(root)
    txtbox2 = Entry(root)
    
    txtbox1.grid(row=0)
    txtbox2.grid(row=1)
    
    txtbox2.bind('<KeyRelease>', fn_jump)
    
    
    root.mainloop()
    

    【讨论】:

      猜你喜欢
      • 2020-12-06
      • 2015-04-12
      • 1970-01-01
      • 1970-01-01
      • 2020-01-15
      • 2017-02-27
      • 2018-04-24
      • 2018-02-07
      • 1970-01-01
      相关资源
      最近更新 更多