在没有图书馆的情况下在 Python 中创建 "Key Released"?
Make a "Key Released" In Python With No Library?
我一直在尝试使用库中的一些 "key released" 函数,例如 pynput and so, but I ran in to the problem that if I try using them together with a library called pyglet,这是一个用于基于 window 的应用程序的库,它不会让我和程序会崩溃。
我想知道是否有任何方法可以在没有库的情况下检测密钥发布。
P.S:我试过使用 pyglet 中的 on_key_release
函数,但它对我来说是错误的,即使我在按键释放时为它写了一些东西,但通常不会这样做.我已经检查了我的代码一千次,这对我来说不是问题。
Pressing = False # var to indicate when the user is doing a long press and when he is not
@window.event
def on_key_release(symbol, modifiers):
global Pressing
if((symbol == key.A) | (symbol == key.S) | (symbol == key.W) | (symbol == key.D)):
Pressing = False
pass
并且该代码导致我的播放器在我开始移动他后冻结,即使我什么都不做,只是将整个 on_key_release dunction 清空,它也会这样做。真的很奇怪。
因此,如果 any 密钥被释放,您的问题很可能是您正在执行 Pressing = False
。由于 Pressing
是 False
,一旦您释放任何键,就会强制您的播放器对象冻结。
要解决这个问题,您应该将键的状态存储在一个变量中(我称之为 self.keys
),并且在渲染内容之前,update/check 键并更新您的播放器相应对象。
下面是玩家对象(在本例中为红色方块)上的移动示例:
from pyglet import *
from pyglet.gl import *
key = pyglet.window.key
class main(pyglet.window.Window):
def __init__ (self, width=800, height=600, fps=False, *args, **kwargs):
super(main, self).__init__(width, height, *args, **kwargs)
self.x, self.y = 0, 0
self.keys = {}
self.mouse_x = 0
self.mouse_y = 0
square = pyglet.image.SolidColorImagePattern((255, 0, 0, 255)).create_image(40, 40)
self.player_object = pyglet.sprite.Sprite(square, x=self.width/2, y=self.height/2)
self.alive = 1
def on_draw(self):
self.render()
def on_close(self):
self.alive = 0
def on_mouse_motion(self, x, y, dx, dy):
self.mouse_x = x
def on_key_release(self, symbol, modifiers):
try:
del self.keys[symbol]
except:
pass
def on_key_press(self, symbol, modifiers):
if symbol == key.ESCAPE: # [ESC]
self.alive = 0
self.keys[symbol] = True
def render(self):
self.clear()
## Movement logic,
# check if key.W is in self.keys (updated via key_press and key_release)
if key.W in self.keys:
self.player_object.y += 1
if key.S in self.keys:
self.player_object.y -= 1
if key.A in self.keys:
self.player_object.x -= 1
if key.D in self.keys:
self.player_object.x += 1
self.player_object.draw()
self.flip()
def run(self):
while self.alive == 1:
self.render()
# -----------> This is key <----------
# This is what replaces pyglet.app.run()
# but is required for the GUI to not freeze
#
event = self.dispatch_events()
if __name__ == '__main__':
x = main()
x.run()
我已经离开了 @window.event
,因为对我来说,复制粘贴这个 class/inheritance 示例更容易,因为我有它。但是您可以按照自己的方式应用此逻辑。只要确保您没有定义按下或不按下的固态状态,检查各个键并在渲染之前进行相应更新。
我一直在尝试使用库中的一些 "key released" 函数,例如 pynput and so, but I ran in to the problem that if I try using them together with a library called pyglet,这是一个用于基于 window 的应用程序的库,它不会让我和程序会崩溃。
我想知道是否有任何方法可以在没有库的情况下检测密钥发布。
P.S:我试过使用 pyglet 中的 on_key_release
函数,但它对我来说是错误的,即使我在按键释放时为它写了一些东西,但通常不会这样做.我已经检查了我的代码一千次,这对我来说不是问题。
Pressing = False # var to indicate when the user is doing a long press and when he is not
@window.event
def on_key_release(symbol, modifiers):
global Pressing
if((symbol == key.A) | (symbol == key.S) | (symbol == key.W) | (symbol == key.D)):
Pressing = False
pass
并且该代码导致我的播放器在我开始移动他后冻结,即使我什么都不做,只是将整个 on_key_release dunction 清空,它也会这样做。真的很奇怪。
因此,如果 any 密钥被释放,您的问题很可能是您正在执行 Pressing = False
。由于 Pressing
是 False
,一旦您释放任何键,就会强制您的播放器对象冻结。
要解决这个问题,您应该将键的状态存储在一个变量中(我称之为 self.keys
),并且在渲染内容之前,update/check 键并更新您的播放器相应对象。
下面是玩家对象(在本例中为红色方块)上的移动示例:
from pyglet import *
from pyglet.gl import *
key = pyglet.window.key
class main(pyglet.window.Window):
def __init__ (self, width=800, height=600, fps=False, *args, **kwargs):
super(main, self).__init__(width, height, *args, **kwargs)
self.x, self.y = 0, 0
self.keys = {}
self.mouse_x = 0
self.mouse_y = 0
square = pyglet.image.SolidColorImagePattern((255, 0, 0, 255)).create_image(40, 40)
self.player_object = pyglet.sprite.Sprite(square, x=self.width/2, y=self.height/2)
self.alive = 1
def on_draw(self):
self.render()
def on_close(self):
self.alive = 0
def on_mouse_motion(self, x, y, dx, dy):
self.mouse_x = x
def on_key_release(self, symbol, modifiers):
try:
del self.keys[symbol]
except:
pass
def on_key_press(self, symbol, modifiers):
if symbol == key.ESCAPE: # [ESC]
self.alive = 0
self.keys[symbol] = True
def render(self):
self.clear()
## Movement logic,
# check if key.W is in self.keys (updated via key_press and key_release)
if key.W in self.keys:
self.player_object.y += 1
if key.S in self.keys:
self.player_object.y -= 1
if key.A in self.keys:
self.player_object.x -= 1
if key.D in self.keys:
self.player_object.x += 1
self.player_object.draw()
self.flip()
def run(self):
while self.alive == 1:
self.render()
# -----------> This is key <----------
# This is what replaces pyglet.app.run()
# but is required for the GUI to not freeze
#
event = self.dispatch_events()
if __name__ == '__main__':
x = main()
x.run()
我已经离开了 @window.event
,因为对我来说,复制粘贴这个 class/inheritance 示例更容易,因为我有它。但是您可以按照自己的方式应用此逻辑。只要确保您没有定义按下或不按下的固态状态,检查各个键并在渲染之前进行相应更新。