打一个「;“密钥已释放”;在没有库的Python中?

打一个「;“密钥已释放”;在没有库的Python中?,python,keyboard,logic,pyglet,keyrelease,Python,Keyboard,Logic,Pyglet,Keyrelease,我一直在尝试使用诸如等库中的一些“密钥释放”函数,但我遇到了一个问题,即如果我尝试将它们与一个名为的库(这是一个用于基于窗口的应用程序的库)一起使用,它将不允许我使用,并且程序将崩溃 我想知道是否有任何方法可以在没有库的情况下检测密钥发布 附言:我曾经尝试过使用pyglet的on_key_release功能,但它对我来说有缺陷,即使我在key release时为它写了一些东西,它通常也没有做到。我已经检查了我的代码一千次,这对我来说不是问题 Pressing = False # var to i

我一直在尝试使用诸如等库中的一些“密钥释放”函数,但我遇到了一个问题,即如果我尝试将它们与一个名为的库(这是一个用于基于窗口的应用程序的库)一起使用,它将不允许我使用,并且程序将崩溃

我想知道是否有任何方法可以在没有库的情况下检测密钥发布

附言:我曾经尝试过使用pyglet的
on_key_release
功能,但它对我来说有缺陷,即使我在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

这段代码会导致我的玩家在我开始移动他后冻结,即使我什么都不做,只是将整个“关键点”释放dunction清空,它也会这样做。非常奇怪。

因此,如果任何键被释放,您的问题很可能是您正在执行
按=False
。由于松开任何键后按
即为
False
,将强制玩家对象冻结

为了解决这个问题,您应该将关键帧的状态存储在一个变量中(我称之为
self.keys
),在渲染内容之前,更新/检查关键帧并相应地更新播放器对象

下面是一个在玩家对象上移动的工作示例(本例中为红色方块):

来自pyglet导入的
*
从pyglet.gl导入*
key=pyglet.window.key
类main(pyglet.window.window):
定义初始值(self,宽度=800,高度=600,fps=False,*args,**kwargs):
超级(主、自).\uuuu初始(宽度、高度、*args、**kwargs)
self.x,self.y=0,0
self.keys={}
self.mouse_x=0
self.mouse_y=0
square=pyglet.image.SolidColorImagePattern((255,0,0255))。创建_图像(40,40)
self.player_object=pyglet.sprite.sprite(正方形,x=self.width/2,y=self.height/2)
self.alive=1
def on_牵引(自):
self.render()
def on_关闭(自身):
self.alive=0
鼠标运动时的def(自身、x、y、dx、dy):
self.mouse_x=x
钥匙释放时的def(自身、符号、修改器):
尝试:
del self.keys[符号]
除:
通过
def on_键按(自身、符号、修改器):
如果symbol==key.ESCAPE:#[ESC]
self.alive=0
self.keys[符号]=真
def渲染(自):
self.clear()
##运动逻辑,
#检查key.W是否在self.keys中(通过按键和释放按键更新)
如果self.keys中的key.W:
self.player_object.y+=1
如果self.keys中的key.S:
self.player_object.y-=1
如果self.keys中的key.A:
self.player_object.x-=1
如果self.keys中的.D键:
self.player_object.x+=1
self.player_object.draw()
self.flip()
def运行(自):
当self.alive==1时:
self.render()

#-------->这是一把钥匙,听起来像是一把钥匙。你可能应该问为什么Pyglet会出现bug,而不是试图修补更多的问题来解决原来的问题
on-key\u-release
对我来说从来都没有出现过问题(请参阅我在你的另一个答案中的示例代码)好的,谢谢:)我会尝试一下,你也可以将你的
粘贴到on-key\u-release
代码上吗?如果可能的话,粘贴一个我们可以运行/尝试的最小可执行示例?啊,那么问题是角色冻结了?我明白为什么,当你释放任何一把钥匙时,
on_key\u release
,因为你不再按住
A
,例如,
S
W
D
也将是
False
。如果你愿意,我可以给你一个简单的例子,告诉你应该怎么做。
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()