pygame не достигает ввода K_a или любого ввода из ввода в моем классе - PullRequest
1 голос
/ 11 июля 2020

Я создаю класс, который позволяет пользователям создавать текстовые поля для игр pygame. Я могу выполнить команду mousebuttondown, но она не доходит до этого оператора ввода с клавиатуры. Ниже приведен весь мой код вместе с той частью, которая вызывает у меня проблему. Мне также нужен способ ввода для каждой буквы.

не удалось распечатать

def main(self, events, mousepos, id):
    for event in events:
        if event.type == pygame.QUIT:
            exit()
        if event.type == pygame.MOUSEBUTTONDOWN:
            if self.rect(id, mousepos):
                if event.type == pygame.K_a:
                    print("reached")
                    self.dict_text[id] = []
                    self.dict_text[id].append("a")
                    self.surface.blit(self.font.render(f'{str(self.dict_text[id])}', self.antialias, (0, 0, 0)),
                                      (self.x, self.y))
                else:
                    print("didn't")

            else:
                pass

весь код - игнорировать обновление

import pygame

pygame.font.init()


class textBox:
    def __init__(self, surface, id, color, width, height, x, y, antialias, maxtextlen):
        self.surface = surface
        self.id = id
        self.color = color
        self.width = width
        self.height = height
        self.x = x
        self.y = y
        self.antialias = antialias
        self.maxtextlen = maxtextlen

        self.text_list = []
        self.text_list_keys = []
        self.currentId = 0
        self.click_check = False
        self.font = pygame.font.SysFont('comicsans', 20)
        self.dict_all = {}

        pygame.draw.rect(self.surface, (self.color), (self.x, self.y, self.width, self.height))
        # for i in self.text_list_keys:
        #     if self.id not in i:
        #         self.text_list_keys.append(self.id)
        #         self.text_list.append(tuple(self.id))
        #     else:
        #         self.nothing()
        self.dict_all[self.id] = tuple((self.x, self.y, self.width, self.height))
        self.dict_text = {}

    def update(self, events, mousepos):
        for event in events:
            if event.type == pygame.QUIT:
                exit()
            if event.type == pygame.MOUSEBUTTONDOWN and ((self.x + self.width) > mousepos[0] > self.x) \
                    and ((self.y + self.height) > mousepos[1] > self.y):
                print("reached: " + mousepos)
                self.click_check = True
            else:
                self.click_check = False

            if self.click_check:
                print("1")
                if event.type == pygame.KEYDOWN:
                    print("@")
                    if event.key == pygame.K_a:
                        print("reached")
                        new_t = ""
                        for j in range(len(self.text_list)):
                            t = (self.text_list[j][0]).index(self.getId(self.currentId))
                            new_t = t
                        self.text_list[new_t].append("a")
                        self.surface.blit(self.font.render(f'{self.text_list[new_t]}', self.antialias, (0, 0, 0)),
                                          (self.x, self.y))

                    else:
                        print("this")

            else:
                pass

    def rect(self, text_id, mousepos):
        x, y, width, height = self.dict_all[text_id]
        if ((x + width) > mousepos[0] > x) and ((y + height) > mousepos[1] > y):
            print("yes")
            return True
        else:
            return False

    def getId(self, text_id):
        self.currentId = text_id

    def nothing(self):
        return False

    def main(self, events, mousepos, id):
        for event in events:
            if event.type == pygame.QUIT:
                exit()
            if event.type == pygame.MOUSEBUTTONDOWN:
                if self.rect(id, mousepos):
                    if event.type == pygame.K_a:
                        print("reached")
                        self.dict_text[id] = []
                        self.dict_text[id].append("a")
                        self.surface.blit(self.font.render(f'{str(self.dict_text[id])}', self.antialias, (0, 0, 0)),
                                          (self.x, self.y))
                    else:
                        print("didn't")

                else:
                    pass

test.py

import pygame
from pygame_textbox import textBox

pygame.init()

win_width = 500
win_height = 500

screen = pygame.display.set_mode((win_width, win_height))
pygame.display.set_caption("test")

run = True
while run:
    mouse = pygame.mouse.get_pressed()
    screen.fill((0, 0, 0))
    events = pygame.event.get()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
            pygame.quit()
            exit()

    a = textBox(screen, 1, (255,  255, 255), 100, 30, 100, 100, True, 20)
    # a.getId(1)
    a.rect(1, mouse)
    mouse_pos = pygame.mouse.get_pos()
    a.main(events, mouse_pos, 1)
    pygame.display.update()

редактируемый основной

def main(self, events, mousepos, id):
    for event in events:
        if event.type == pygame.QUIT:
            exit()
        if event.type == pygame.MOUSEBUTTONDOWN:
            if self.rect(id, mousepos):
                if event.type == pygame.KEYDOWN:
                    # keys = pygame.key.get_pressed()
                    # if keys[pygame.K_a]:
                    if event.type == pygame.K_a:
                        print("reached")
                        self.dict_text[id] = []
                        self.dict_text[id].append("a")
                        self.surface.blit(self.font.render(f'{str(self.dict_text[id])}', self.antialias, (0, 0, 0)),
                                          (self.x, self.y))
                    else:
                        print("didn't")

            else:
                pass

Обновленные файлы

import pygame

pygame.font.init()


class textBox:
    def __init__(self, surface, id, color, width, height, x, y, antialias, maxtextlen):
        self.surface = surface
        self.id = id
        self.color = color
        self.width = width
        self.height = height
        self.x = x
        self.y = y
        self.antialias = antialias
        self.maxtextlen = maxtextlen

        self.text_list = []
        self.text_list_keys = []
        self.currentId = 0
        self.click_check = False
        self.font = pygame.font.SysFont('comicsans', 20)
        self.dict_all = {}
        self.pressed = False
        self.dict_text = {}
        self.dict_text[id] = []

        # pygame.draw.rect(self.surface, (self.color), (self.x, self.y, self.width, self.height))
        # for i in self.text_list_keys:
        #     if self.id not in i:
        #         self.text_list_keys.append(self.id)
        #         self.text_list.append(tuple(self.id))
        #     else:
        #         self.nothing()
        self.dict_all[self.id] = tuple((self.x, self.y, self.width, self.height))
        self.dict_text = {}

    def draw(self):
        pygame.draw.rect(self.surface, (self.color), (self.x, self.y, self.width, self.height))

    # def update(self, events, mousepos):
    #     for event in events:
    #         if event.type == pygame.QUIT:
    #             exit()
    #         if event.type == pygame.MOUSEBUTTONDOWN and ((self.x + self.width) > mousepos[0] > self.x) \
    #                 and ((self.y + self.height) > mousepos[1] > self.y):
    #             print("reached: ", mousepos)
    #             self.click_check = True
    #         else:
    #             self.click_check = False
    #
    #         if self.click_check:
    #             print("1")
    #             if event.type == pygame.KEYDOWN:
    #                 print("@")
    #                 if event.key == pygame.K_a:
    #                     print("reached")
    #                     new_t = ""
    #                     for j in range(len(self.text_list)):
    #                         t = (self.text_list[j][0]).index(self.getId(self.currentId))
    #                         new_t = t
    #                     self.text_list[new_t].append("a")
    #                     self.surface.blit(self.font.render(f'{self.text_list[new_t]}', self.antialias, (0, 0, 0)),
    #                                       (self.x, self.y))
    #
    #                 else:
    #                     print("this")
    #
    #         else:
    #             pass

    def rect(self, text_id, mousepos):
        x, y, width, height = self.dict_all[text_id]
        if ((x + width) > mousepos[0] > x) and ((y + height) > mousepos[1] > y):
            print("yes")
            return True
        else:
            return False

    def getId(self, text_id):
        self.currentId = text_id

    def nothing(self):
        return False

    def main(self, events, mousepos, id):
        for event in events:
            if event.type == pygame.QUIT:
                exit()
            if event.type == pygame.MOUSEBUTTONDOWN:
                self.pressed = False
                if self.rect(id, mousepos):
                    self.pressed = True
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_a:
                        if self.pressed:
                            print("reached")
                            self.dict_text[id].append("a")
                            self.surface.blit(
                                self.font.render(f'{str(self.dict_text[id])}', self.antialias, (0, 0, 0)),
                                (self.x, self.y))
                        else:
                            print("didn't")

                else:
                    pass

test.py

import pygame
from pygame_textbox import textBox

pygame.init()

win_width = 500
win_height = 500

screen = pygame.display.set_mode((win_width, win_height))
pygame.display.set_caption("test")

run = True
a = textBox(screen, 1, (255, 255, 255), 100, 30, 100, 100, True, 20)

while run:
    mouse = pygame.mouse.get_pressed()
    screen.fill((0, 0, 0))
    events = pygame.event.get()
    a.draw()
    a.getId(1)
    a.rect(1, mouse)
    mouse_pos = pygame.mouse.get_pos()
    a.main(events, mouse_pos, 1)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
            pygame.quit()
            exit()


    pygame.display.update()

1 Ответ

1 голос
/ 11 июля 2020

Кнопка сохраняется в атрибуте события key, а не в атрибуте type: (см. pygame.event)

if event.type == pygame.K_a:

if event.key == pygame.K_a:  

В любом случае, это не решит вашу проблему, потому что * Событие 1014 * не оценивает состояние ключа и даже не имеет атрибута key. Только события KEYDOWN и KEYUP предоставляют ключ.

Вы должны использовать pygame.key.get_pressed(), чтобы оценить, удерживается ли дополнительная клавиша при нажатии кнопки мыши:

if event.type == pygame.MOUSEBUTTONDOWN:
    if self.rect(id, mousepos):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_a]:
            print("reached")
            # [...]

Если вы хотите определить, когда мышь находится на кнопке и нажата a , тогда вы должны использовать событие KEYDOWN:

if event.type == pygame.KEYDOWN:
    if self.rect(id, mousepos):
        if event.key == pygame.K_a:
            print("reached")
            # [...]

Если вы хотите определить, была ли нажата кнопка мышью, а затем вы хотите определить, нажата ли a , тогда вам необходимо сохранить состояние, если кнопка нажата:

class textBox:
    def __init__(self, surface, id, color, width, height, x, y, antialias, maxtextlen):
        # [...]
        self.pressed = False

    def draw(self):
        pygame.draw.rect(self.surface, (self.color), (self.x, self.y, self.width, self.height))
        for id in self.dict_text:
            self.surface.blit(self.font.render(f'{str(self.dict_text[id])}', self.antialias, (0, 0, 0)), (self.x, self.y))

    # [...]

    def main(self, events, mousepos, id):
        for event in events:
            if event.type == pygame.QUIT:
                exit()
            if event.type == pygame.MOUSEBUTTONDOWN:
                self.pressed = False
                if self.rect(id, mousepos):
                    self.pressed = True
            
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_a:
                    if self.pressed:
                        print("reached")
                        
                        self.dict_text[id] = []
                        self.dict_text[id].append("a")
                        self.surface.blit(self.font.render(f'{str(self.dict_text[id])}', self.antialias, (0, 0, 0)),
                                            (self.x, self.y))
                    else:
                        print("didn't")

Конечно, вы должны указать кнопку (a) перед основным приложением l oop:

a = textBox(screen, 1, (255,  255, 255), 100, 30, 100, 100, True, 20)

run = True
while run:
    # [...]

    a.draw()
    a.rect(1, mouse)

    # [...]

Полный код:

import pygame

pygame.font.init()


class textBox:
    def __init__(self, surface, id, color, width, height, x, y, antialias, maxtextlen):
        self.surface = surface
        self.id = id
        self.color = color
        self.width = width
        self.height = height
        self.x = x
        self.y = y
        self.antialias = antialias
        self.maxtextlen = maxtextlen

        self.text_list = []
        self.text_list_keys = []
        self.currentId = 0
        self.click_check = False
        self.font = pygame.font.SysFont('comicsans', 20)
        self.dict_all = {}
     # for i in self.text_list_keys:
        #     if self.id not in i:
        #         self.text_list_keys.append(self.id)
        #         self.text_list.append(tuple(self.id))
        #     else:
        #         self.nothing()
        self.dict_all[self.id] = tuple((self.x, self.y, self.width, self.height))
        self.dict_text = {}
        self.pressed = False

    def draw(self):
        pygame.draw.rect(self.surface, (self.color), (self.x, self.y, self.width, self.height))
        for id in self.dict_text:
            self.surface.blit(self.font.render(f'{str(self.dict_text[id])}', self.antialias, (0, 0, 0)), (self.x, self.y))
       

    def update(self, events, mousepos):
        for event in events:
            if event.type == pygame.QUIT:
                exit()
            if event.type == pygame.MOUSEBUTTONDOWN and ((self.x + self.width) > mousepos[0] > self.x) \
                    and ((self.y + self.height) > mousepos[1] > self.y):
                print("reached: " + mousepos)
                self.click_check = True
            else:
                self.click_check = False

            if self.click_check:
                print("1")
                if event.type == pygame.KEYDOWN:
                    print("@")
                    if event.key == pygame.K_a:
                        print("reached")
                        new_t = ""
                        for j in range(len(self.text_list)):
                            t = (self.text_list[j][0]).index(self.getId(self.currentId))
                            new_t = t
                        self.text_list[new_t].append("a")
                        self.surface.blit(self.font.render(f'{self.text_list[new_t]}', self.antialias, (0, 0, 0)),
                                          (self.x, self.y))

                    else:
                        print("this")

            else:
                pass

    def rect(self, text_id, mousepos):
        x, y, width, height = self.dict_all[text_id]
        if ((x + width) > mousepos[0] > x) and ((y + height) > mousepos[1] > y):
            print("yes")
            return True
        else:
            return False

    def getId(self, text_id):
        self.currentId = text_id

    def nothing(self):
        return False

    def main(self, events, mousepos, id):
        for event in events:
            if event.type == pygame.QUIT:
                exit()
            if event.type == pygame.MOUSEBUTTONDOWN:
                self.pressed = False
                if self.rect(id, mousepos):
                    self.pressed = True
            
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_a:
                    if self.pressed:
                        print("reached")
                        
                        self.dict_text[id] = []
                        self.dict_text[id].append("a")
                    else:
                        print("didn't")
pygame.init()

win_width = 500
win_height = 500

screen = pygame.display.set_mode((win_width, win_height))
pygame.display.set_caption("test")

a = textBox(screen, 1, (255,  255, 255), 100, 30, 100, 100, True, 20)

run = True
while run:
    mouse = pygame.mouse.get_pressed()
    screen.fill((0, 0, 0))
    events = pygame.event.get()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
            pygame.quit()
            exit()

    # a.getId(1)
    a.draw()
    a.rect(1, mouse)
    mouse_pos = pygame.mouse.get_pos()
    a.main(events, mouse_pos, 1)
    pygame.display.update()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...