不幸的是,您在某种程度上受系统底层自动重复机制的支配。例如,在我目前使用的mac上,如果我按住“w”,我将得到一系列新闻和发布事件。当按下时,如果我按下“o”,我会得到一个“o”的新闻和发布流,但没有更多的“w”事件。

您需要设置一个小型状态机,并绑定到按键和按键释放事件。这将让您跟踪哪些键已按下,哪些键未按下。然后,每次你画一个框架,你可以查询机器,看看哪些键被按下,并采取相应的行动。

这是我拼凑出来的一个快速技巧。我只在我的mac上测试过,而且只在Python2.5上测试过。我并没有真正尝试过做一个“Python”或者高效的人。代码只是用来说明这项技术。使用此代码,您可以同时按“w”或“s”和“o”或“l”来上下移动两个桨。'''Example that demonstrates keeping track of multiple key events'''

from Tkinter import *

class Playfield:

def __init__(self):

# this dict keeps track of keys that have been pressed but not

# released

self.pressed = {}

self._create_ui()

def start(self):

self._animate()

self.root.mainloop()

def _create_ui(self):

self.root = Tk()

self.p1label = Label(text="press w, s to move player 1 up, down",

anchor="w")

self.p2label = Label(text="press o, l to move player 2 up, down",

anchor="w")

self.canvas = Canvas(width=440, height=440)

self.canvas.config(scrollregion=(-20, -20, 420, 420))

self.p1label.pack(side="top", fill="x")

self.p2label.pack(side="top", fill="x")

self.canvas.pack(side="top", fill="both", expand="true")

self.p1 = Paddle(self.canvas, tag="p1", color="red", x=0, y=0)

self.p2 = Paddle(self.canvas, tag="p2", color="blue", x=400, y=0)

self._set_bindings()

def _animate(self):

if self.pressed["w"]: self.p1.move_up()

if self.pressed["s"]: self.p1.move_down()

if self.pressed["o"]: self.p2.move_up()

if self.pressed["l"]: self.p2.move_down()

self.p1.redraw()

self.p2.redraw()

self.root.after(10, self._animate)

def _set_bindings(self):

for char in ["w","s","o", "l"]:

self.root.bind("" % char, self._pressed)

self.root.bind("" % char, self._released)

self.pressed[char] = False

def _pressed(self, event):

self.pressed[event.char] = True

def _released(self, event):

self.pressed[event.char] = False

class Paddle():

def __init__(self, canvas, tag, color="red", x=0, y=0):

self.canvas = canvas

self.tag = tag

self.x = x

self.y = y

self.color = color

self.redraw()

def move_up(self):

self.y = max(self.y -2, 0)

def move_down(self):

self.y = min(self.y + 2, 400)

def redraw(self):

x0 = self.x - 10

x1 = self.x + 10

y0 = self.y - 20

y1 = self.y + 20

self.canvas.delete(self.tag)

self.canvas.create_rectangle(x0,y0,x1,y1,tags=self.tag, fill=self.color)

if __name__ == "__main__":

p = Playfield()

p.start()

python bind_Python bind-允许同时按下多个键相关推荐

  1. python bind_Python tkinter之Bind(绑定事件)的使用示例

    1.绑定鼠标事件并获取事件属性 # -*- encoding=utf-8 -*- import tkinter from tkinter import * def left_mouse_down(ev ...

  2. Python分析离散心率信号(下)

    Python分析离散心率信号(下) 如何使用动态阈值,信号过滤和离群值检测来改善峰值检测. 一些理论和背景 到目前为止,一直在研究如何分析心率信号并从中提取最广泛使用的时域和频域度量.但是,使用的信号 ...

  3. python代码根据当前时间获取下一周的日期

    python代码根据当前时间获取下一周的日期 #使用python代码根据当前日期计算下一周的日期范围 import datetime,calendar import pandas as pddef g ...

  4. python批量重命名指定目录下所有文件的后缀名

    python批量重命名指定目录下所有文件的后缀名 有个需求,需要把某个文件夹下所有后缀名为.abc的更改为.xyz; #批量重命名指定目录下面所有文件的后缀名. word_dir为需要更改后缀的文件夹 ...

  5. python详细安装教程linux-Linux环境下Python的安装方法

    本文主要介绍linux下采用源码包的方式进行python的安装. 一.下载python源码包 打开ubuntu下的shell终端,通过wget命令下载python源码包,如下图所示: 将python- ...

  6. python线下培训-Python培训线上和线下有什么区别?

    大家想要学习Python的话,主要的方式主要是自学好参加培训,由于自学对自己的基础抗干扰能力要求比较大,好多小伙伴一般都会选择参加培训的方式来进行学习Python知识,而Python培训又包括线上和线 ...

  7. python怎么读文件夹下的文件夹-python如何获取当前文件夹下所有文件名详解

    前言 本文主要给大家介绍了关于python获取当前文件夹下所有文件名的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 os 模块下有两个函数: os.walk() os.li ...

  8. 二级python 刷题就能过吗_Python 刷题笔记:这很不python,官方大大能改下吗?

    惊讶:数值相等的整数或浮点数作为dict 字典的键将指向同一项?! 1.刷题遇到知识盲区 今天继续在 xue.cn 刷题,意外发现:整数和浮点数先后设为字典的键,会有奇怪的现象! 题目如下: What ...

  9. 尚学python课程---11、linux环境下安装python注意

    尚学python课程---11.linux环境下安装python注意 一.总结 一句话总结: 准备安装依赖包:zlib.openssl:yum install zlib* openssl*:pytho ...

最新文章

  1. java有没有求组合的函数_如何在Java 8中使用compose和andThen组合函数
  2. Qt Model/View 学习笔记 (四)
  3. Java学习之 多态 Polymorphism
  4. Flask实战2问答平台-父模板抽离(登录注册界面)
  5. (转)IIS7 配置ASP.NET 2.0, WCF, ASP.NET MVC
  6. 在SAP Smart Business workspace里创建KPI tile的错误消息
  7. android studio 默认继承AppCompatActivity动态设置标题title的方法
  8. linux下C的一些开发技巧总结
  9. ecology9 系统文件常用说明
  10. iOS Crash类别总结
  11. iOS设计模式解析(五)责任链模式
  12. RTOS中动态内存和静态内存管理机制
  13. PHP获取客户端IP函数
  14. X4扭曲字体或图形 coreldraw_cdrx4精简版下载|coreldraw x4 sp2 精简版下载增强版 15.2.3.1614 - 系统天堂...
  15. HOI BMVC2018| iCAN: Instance-Centric Attention Network for Human-Object Interaction Detection论文阅读笔记
  16. mysql 打开sql日志,记录所有sql
  17. 两种简单方法:把输入的整数(最多不超过五位),按输入的反方向输出。例如输入12345,要求输出结果是54321.编程实现此功能。
  18. 最新鲁班H5页面生成工具系统源码+功能强大/仿易企秀
  19. 松耦合(Loose coupling)笔记
  20. 解决gradle编译报Error:All flavors must now belong to a named flavor dimension.问题

热门文章

  1. AT32F415 USART1、2、3,DMA 用结构体统一配置收发
  2. linux的yun命令是访问互联网,如何在Linux终端中知道你的公有IP?
  3. 自己动手写CPU(1)五级流水线及CPU第一条指令ori
  4. go 编译 android arm,golang交叉编译
  5. arm引脚复用linux,ARM知识分享-i.MX6Q GPIO复用修改方法
  6. 20000赫兹的声音试听下载_好听又不贵,DLC球顶双面镀铍动圈:七赫兹i99
  7. 干掉搜狗输入法云代理SogouCloud.exe
  8. hive中文字符乱码 解决方法【转】
  9. iOS设计模式 - 组合
  10. [转载]EF中的那些批量操作