【问题标题】:How to bind spacebar key to a certain method in tkinter (python)如何将空格键键绑定到tkinter(python)中的某个方法
【发布时间】:2013-03-23 03:19:12
【问题描述】:

我正在用 python 做一个项目,我做了一个方法来在 tkinter 中绘制一个特定的东西。我想要它,这样每当我按下空格键时,图像就会自行重绘(再次运行该方法,因为我对该方法进行了编码,以便它可以重绘自身)。如果我按下空格键,我将如何将空格键绑定到方法以便程序运行、绘制和重新绘制?

例如,我希望这样每当我按下空格键时,程序就会在画布上的随机位置绘制:

from Tkinter import *
from random import *

root=Tk()
canvas=Canvas(root,width=400,height=300,bg='white')
def draw():
    canvas.delete(ALL)# clear canvas first
    canvas.create_oval(randint(0,399),randint(0,299),15,15,fill='red')
draw()
canvas.pack()
root.mainloop()

如何将空格键绑定到方法?

【问题讨论】:

    标签: python methods python-2.7 tkinter python-imaging-library


    【解决方案1】:

    您也可以使用canvas.bind_all("<space>", yourFunction) 这将监听整个应用程序中的事件,而不仅仅是小部件。

    【讨论】:

      【解决方案2】:
      from Tkinter import *
      from random import *
      
      root=Tk()
      canvas=Canvas(root,width=400,height=300,bg='white')
      def draw(event=None):
          canvas.delete(ALL)# clear canvas first
          canvas.create_oval(randint(0,399),randint(0,299),15,15,fill='red')
      draw()
      canvas.pack()
      
      root.bind("<space>", draw)
      root.mainloop()
      

      【讨论】:

      • 非常感谢!我查看了其他问题,但找不到与我需要的类似的东西。我想添加 event=None 很重要。
      • 很高兴为您提供帮助。是的,回调函数是由 Tkinter 使用参数调用的,所以它需要传递一些东西。通过将其设置为 None,您可以在第 9 行调用它而不传递任何东西。
      【解决方案3】:

      你可以这样做:

      from Tkinter import *
      from random import *
      
      root=Tk()
      canvas=Canvas(root,width=400,height=300,bg='white')
      
      def draw(event):
          if event.char == ' ':
              canvas.delete(ALL)# clear canvas first
              canvas.create_oval(randint(0,399),randint(0,299),15,15,fill='red')
      
      root.bind('<Key>', draw)
      
      canvas.pack()
      root.mainloop()
      

      基本上,您将绘图函数绑定到某个顶级元素到&lt;Key&gt; 绑定,只要按下键盘上的键就会触发该绑定。然后,传入的事件对象有一个char 成员,其中包含一个字符串,表示在键盘上按下的键。

      只有当它绑定的对象有焦点时才会触发该事件,这就是我将draw 方法绑定到root 对象的原因,因为它始终是焦点。

      【讨论】:

      • 你为什么选择绑定&lt;key&gt;而不是&lt;space&gt;?看起来你正在为自己做更多的工作
      • @BryanOakley 是的,直到我看到另一个答案之后,我才意识到 &lt;space&gt; 的存在。如果它有用,我会留下我的答案,但我赞成另一个答案。
      猜你喜欢
      • 1970-01-01
      • 2012-10-30
      • 2018-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多