【问题标题】:Binding button to subprogram with a key用按键将按钮绑定到子程序
【发布时间】:2021-03-23 03:00:59
【问题描述】:

代码:

import tkinter as tk

win = tk.Tk()
win.resizable('False', 'False')

#functions

def entered(): #Receives input by the user and deletes what it has written. 
   value = entry.get()
   entry.delete(0,'end')

def delete_insert(event):#Deletes what it's written by default in the entry widget.
   entry.delete(0, 'end')
   entry.config(fg = 'black')

def add_insert(event):
   entry.insert(0, 'Click Here')

frame = tk.Frame(win)
frame.grid(column = 0, row = 0)

button_entry = tk.Button(frame)
button_entry.pack(side = 'right')
button_entry.config(text = 'Buscar', command = entered)
button_entry.bind('Control-Enter', entered) #Keep this line in mind please.

entry = tk.Entry(frame)
entry.pack(side = 'right', padx = 5)
entry.insert(0,'Click Here') #Default text in entry widget.
entry.bind('<FocusIn>', delete_insert)
entry.bind('<FocusOut>', add_insert)

win.mainloop()

输出:

问题:

在按下Enter 时将button_entryentered() 子程序绑定的代码行似乎不起作用。

button_entry.bind('<Control-Enter>', entered)

为什么不呢?当entered()子程序运行时,它会删除entry小部件中插入的文本

def entered(event):
    ....

    entry.delete(0, 'end')

....

entry.insert(0,'Click here')

因此,我的目标是,当按钮button_entryEnter键激活时,它运行子程序entered()。因此,它会删除用户在entry 中插入的文本。

我尝试过的:

我将参数event添加到entered(),如下entered(event)。与其他功能一样,绑定将起作用。不幸的是,当您单击button_entry 时,您会收到以下错误:

TypeError: entered() missing 1 requiered positional argument: 'event'

虽然,如果您单击键盘上的键 Enter,则不会发生任何事情,或者至少看起来像这样,因为我绑定到 button_entry 的子程序没有执行

我想要完成的工作类似于您在 google 事物时所做的工作,您在搜索引擎中输入您想要的内容,然后在键盘上单击 Enter。

【问题讨论】:

  • 你要绑定的是Enter键还是Control和Enter?
  • 在创建按钮时设置命令等于“输入”时,您不这样做吗?
  • 分配event=None。另外,请注意,您的按钮需要获得焦点才能获取关键事件。最好用entry.bind('&lt;Control-Return&gt;', entered)
  • @Nameless 您正在分配一个默认值。如果在调用函数时没有传递任何参数,则事件采用 None。不,我的意思是entry.bind('&lt;Control-Return&gt;', entered) 你的按钮必须有焦点才能接受关键事件。当您在文本框中键入时,焦点将位于条目小部件中,因此 button_entry.bind() 不太可能起作用。
  • 你想用哪个键来触发。

标签: python tkinter


【解决方案1】:

两个错误,你的绑定键错误,你的函数调用似乎也错误。加上你绑定到按钮,那么它需要按钮有焦点,只有这样bind才会起作用。所以你的代码是:

def entered(event=None): 
   value = entry.get()
   entry.delete(0,'end')

entry.bind('<Return>',lambda event: entered()) # Bind the enter key to the entry
# OR win.bind(same thing above)

event 设置为None,这样当按钮尝试调用此函数并且没有传递任何参数时,它不会向您抛出错误。

【讨论】:

  • 我试过了。 Button_entry 没有做好它的工作。当我点击Return 时,代码没有被执行。只是为了澄清一下,我不想单击按钮,而是单击 Return 并产生与单击它时相同的结果。
  • @Nameless 'Return',你的意思是输入键对吗?
  • 是的,不是空格键,不是任何东西,只是上面带有弯曲箭头的键,Return
  • 此代码适用于我,请确保您使用的是相同的代码。生病添加整个代码。请记住,您必须专注于条目小部件才能使其正常工作或使用win.bind()
  • @Nameless 您绑定到不同的键,首先是输入键。其次是 Ctrl + Enter 键。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-18
  • 2021-06-25
  • 2012-10-30
相关资源
最近更新 更多