【问题标题】:Cannot access shortcuts stored in dictionary for pygame key presses无法访问存储在字典中用于 pygame 按键的快捷方式
【发布时间】:2022-01-25 19:28:38
【问题描述】:
import pygame, sys
from pygame.locals import *


class Text:

    def __init__(self, text, pos, **options) -> None:
        self.text = text
        self.pos = pos

        self.fontname = None
        self.fontsize = 72
        self.fontcolor = Color("black")
        self.set_font()
        self.render()

    def set_font(self):
        self.font = pygame.font.Font(self.fontname, self.fontsize)

    def render(self):
        self.img = self.font.render(self.text, True, self.fontcolor)
        self.rect = self.img.get_rect()
        self.rect.topleft = self.pos

    def draw(self):
        App.screen.blit(self.img, self.rect)


class App:

    def __init__(self) -> None:
        pygame.init()
        flags = RESIZABLE
        App.screen = pygame.display.set_mode((640, 240), flags)
        App.t = Text("Pygame App", pos=(50, 50))
        pygame.display.set_caption("Object Oriented Programming")

    def do_shortcut(self, event):
        self.shortcut = {}
        k = event.key
        m = event.mod
        if (k, m) in self.shortcut:
            exec(self.shortcut[k, m])

    def run(self):
        while True:
            for event in pygame.event.get():
                if event.type == QUIT:
                    pygame.quit()
                    sys.exit()
                if event.type == KEYDOWN:
                    self.do_shortcut(event)

            App.screen.fill(Color("gray"))
            App.t.draw()
            pygame.display.update()
        pygame.quit()


if __name__ == "__main__":

    app = App()
    app.run()

这是上面的整个程序。我尝试将所有组合键存储在字典中,访问它们并执行。

【问题讨论】:

    标签: python dictionary pygame shortcut


    【解决方案1】:

    主要问题是你每次进入do_shortcut函数时都初始化了快捷方式:

    def do_shortcut(self, event): self.shortcut = {}

    您应该使用一些实际值初始化并将 self.shortcut = {} 放在 __init__ 函数中。

    这是一个工作代码:

    import sys
    import time
    import pygame
    from pygame import QUIT, KEYDOWN
    RESIZABLE = True
    
    
    class Text:
        def __init__(self, text, pos, **options) -> None:
            self.text = text
            self.pos = pos
            self.fontname = None
            self.fontsize = 72
            self.fontcolor = pygame.Color("black")
            self.set_font()
            self.render()
    
        def set_font(self):
            self.font = pygame.font.Font(self.fontname, self.fontsize)
    
        def render(self):
            self.img = self.font.render(self.text, True, self.fontcolor)
            self.rect = self.img.get_rect()
            self.rect.topleft = self.pos
    
        def draw(self):
            App.screen.blit(self.img, self.rect)
    
    
    class App:
        def __init__(self) -> None:
            self.shortcut = {(1073741906, 4096): 'down', (1073741905, 4096): 'up'}
            pygame.init()
            flags = RESIZABLE
            App.screen = pygame.display.set_mode((640, 240), flags)
            App.t = Text("Pygame App", pos=(50, 50))
            pygame.display.set_caption("Object Oriented Programming")
    
        def do_shortcut(self, event):
            print("doing")
            k = event.key
            m = event.mod
            print("k = {}, m = {}".format(k, m))
            if (k, m) in self.shortcut:
                print("executing: {}".format(self.shortcut[k, m]))
                exec(self.shortcut[k, m])
    
        def run(self):
            while True:
                time.sleep(1)
                for event in pygame.event.get():
                    print(event)
                    print(event.type)
                    print(KEYDOWN)
                    print("-" * 50)
                    if event.type == QUIT:
                        pygame.quit()
                        sys.exit()
                    if event.type == KEYDOWN:
                        print("*" * 100)
                        self.do_shortcut(event)
    
                App.screen.fill(pygame.Color("gray"))
                App.t.draw()
                pygame.display.update()
            pygame.quit()
    
    
    if __name__ == '__main__':
        app = App()
        app.run()
    

    当然,一旦它到达你的快捷方式的结果,即“向上”和“向下”,我只是为了测试而编写的,它会失败,它不能执行。

    但如果您将快捷方式填入__init__ 函数中的正确位置,它将起作用。

    如果您需要其他帮助,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-19
      • 2015-01-19
      • 2015-03-28
      • 1970-01-01
      • 1970-01-01
      • 2012-12-31
      相关资源
      最近更新 更多