Я создаю класс, который позволяет пользователям создавать текстовые поля для игр 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()