【问题标题】:How to add key binding?如何添加键绑定?
【发布时间】:2018-11-02 19:46:50
【问题描述】:

没有其他 stackoverflow 建议,也没有任何其他外部文档向我展示了如何成功地将键绑定到函数。以下是我尝试过的链接(代码复制和粘贴)但没有运气。我看到很多人认为焦点是失败的原因,好像包含按钮的框架不是用户的目标,因此没有激活;然而,没有任何结果。以下是我尝试过的链接:

http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm

https://softwareengineering.stackexchange.com/questions/213935/why-use-classes-when-programming-a-tkinter-gui-in-python

python tkinter how to bind key to a button

http://www.java2s.com/Code/Python/GUI-Tk/SetButtontogetfocus.htm

How to bind a keypress to a button in Tkinter

我在 PyCharm 5.0.4 中运行 Python 3.6。

上面链接中的代码是我一直在使用/修改的代码,以查看它是如何工作的,但没有一次尝试以执行操作而结束。我得到的最远的是一条错误消息。

谢谢。

编辑:我在下面使用的代码(来自最新链接)

from tkinter import *
root = Tk()

def LeftTurn(event):
    print('left')
frame=Frame(root, width=100, height=100)
frame.bind("<Left>", LeftTurn)   #Binds the "left" key to the frame and exexutes yourFunction if "left" key was pressed
frame.pack()


root.geometry("640x480")
root.title("Rover ")


root.mainloop()

我也试过这个(下)

from tkinter import *

root = Tk()

def yourFunction(event):
    print('left')

frame = Frame(root, width=100, height=100)

frame.bind("<Left>",yourFunction)   #Binds the "left" key to the frame and exexutes yourFunction if "left" key was pressed
frame.pack()

root.mainloop()

【问题讨论】:

  • 请发布您的代码。
  • 向我们展示您尝试过的minimal reproducible example 及其产生的错误消息。
  • 看,问题是:当尝试时它会起作用。所以我们真的需要看看你的代码。
  • 我发布了我尝试的代码,是否可以评论你到底使用了什么?
  • 焦点在窗口或像Entry、Text和其他可以与鼠标或键盘交互的小部件上。

标签: python python-3.x tkinter


【解决方案1】:

因此,您的框架需要以某种方式获得焦点才能使您的绑定起作用。

以下面的示例代码为例。如果您单击测试按钮,焦点将设置在框架上,您可以按左箭头键,您的函数将打印到控制台。如果您随后在输入字段内单击,焦点将移至输入字段,并且您的绑定将不再起作用,直到框架再次获得焦点。

所以这对某些东西很有用,但我从来没有真正需要绑定到“框架”,而是绑定到根或顶层窗口或可以直接与键盘或鼠标交互的特定小部件,如 Entry 或 Text。

from tkinter import *


root = Tk()

def LeftTurn(event):
    print('left')

frame=Frame(root)
Button(frame, text="test", command= frame.focus).pack()
Entry(frame).pack()

frame.bind('<Left>', LeftTurn)
frame.pack()

root.mainloop()

您可能希望将此代码绑定到root。无论点击根窗口中的哪个小部件或在哪个框架中,这都会触发。

from tkinter import *


root = Tk()

def LeftTurn(event):
    print('left')

frame=Frame(root)
Button(frame, text="Button").pack()

root.bind('<Left>', LeftTurn)
frame.pack()

root.mainloop()

【讨论】:

  • 下次使用command = frame.focus即可;这里不需要 lambda。
  • 啊。是的,我可能应该这样做。忘了它可能就像使用focus() 一样简单。已更正。
【解决方案2】:

你是对的,这是一个焦点问题。用户不可能将注意力集中在 Frame 上,因此您要么必须通过添加来为他们这样做

frame.focus()

或者你可以绑定到不会失焦的东西,比如根窗口:

root.bind("<Left>", LeftTurn) 

【讨论】:

  • 是的!感谢您的输入。很高兴我能保留剩下的头发。
  • “用户不可能将注意力集中在一个框架上,所以你要么必须通过添加来为他们做这件事” - 这有点误导。您当然可以创建让用户将焦点设置到框架的绑定。只是它不会自动发生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-31
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
  • 2018-03-18
  • 1970-01-01
相关资源
最近更新 更多