Python 如何允许用户仅在pygame中的特定条件下键入?

Python 如何允许用户仅在pygame中的特定条件下键入?,python,text,pygame,drawing,Python,Text,Pygame,Drawing,单击文本框时,我希望用户能够通过将self.active设置为True来键入字母。当你点击文本框时,我希望玩家通过将self.active设置为False而失去该能力。但是,当我单击文本框时,self.active会在一瞬间变为true,然后再次变为False。我该如何解决这个问题 from pygame import * init() screen = display.set_mode((800, 600)) name_font = font.Font(None, 32) name_tex

单击文本框时,我希望用户能够通过将self.active设置为True来键入字母。当你点击文本框时,我希望玩家通过将self.active设置为False而失去该能力。但是,当我单击文本框时,self.active会在一瞬间变为true,然后再次变为False。我该如何解决这个问题

from pygame import *

init()
screen = display.set_mode((800, 600))

name_font = font.Font(None, 32)
name_text = ''


class Rectangle:

    def __init__(self, x, y):
        self.active = False
        self.x = x
        self.y = y
        self.text_surface = name_font.render(name_text, True, (255, 255, 255))
        self.rect_width = max(140, 10 + self.text_surface.get_width())
        self.input_rect = Rect(x, y, self.rect_width, 32)
        draw.rect(screen, (0, 0, 0), self.input_rect, 0)
        draw.rect(screen, (255, 255, 255), self.input_rect, 2)
        self.input_rect.w = self.text_surface.get_width() + 10
        screen.blit(self.text_surface, (self.input_rect.x + 5, self.input_rect.y + 5))

    def naming(self):
        global rect_1
        global name_text

        if events.type == MOUSEBUTTONDOWN:
            if self.input_rect.x + 150 >= mx >= self.input_rect.x - 10:
                if self.input_rect.y + 40 >= my >= self.input_rect.y - 10:
                    self.active = True
            if not self.input_rect.x + 150 >= mx >= self.input_rect.x - 10:
                if not self.input_rect.y + 40 >= my >= self.input_rect.y - 10:
                    self.active = False

        if self.active:
            if events.type == KEYDOWN:
                if keys[K_BACKSPACE]:
                    name_text = name_text[:-1]
                    screen.fill((0, 0, 0))
                    rect_1 = Rectangle(200, 200)
                else:
                    name_text += events.unicode


while True:
    rect_1 = Rectangle(200, 200)
    mx, my = mouse.get_pos()
    for events in event.get():
        keys = key.get_pressed()
        rect_1.naming()
        if events.type == QUIT:
            quit()

    display.update()
    time.delay(1)

在我看来,您需要将第47行“rect_1=Rectangle(200200)”从while循环中删除,因为您一直在重新创建长方体,并且它实例化了一个活动值等于false的新长方体

您正在获取鼠标位置,但没有对其执行任何操作,例如将其与框的位置进行比较。如果以self.active=True开头,则无论光标在何处,都可以在框中键入


在应用程序循环之前创建
Rectangle
的实例,但必须将事件列表传递给方法
naming
,并处理方法中的所有相关事件。 将
draw
方法添加到类中,并在每个帧中绘制对象:

类矩形:
# [...]
def命名(自我、事件):
# [...]
evetnts活动:
如果e.type==KEYDOWN:
# [...]
如果e.type==#[…]
def提取(自身,屏幕):
# [...]
rect_1=矩形(200200)
运行=真
运行时:
events=event.get()
对于事件中的e:
如果e.type==退出:
运行=错误
rect_1.命名(事件)
# [...]
矩形1.绘制(屏幕)

完整示例:

导入pygame
从pygame导入*
init()
屏幕=显示。设置_模式((800600))
name\u font=font.font(无,32)
名称\文本=“”
类矩形:
定义初始化(self,x,y):
self.active=False
self.x=x
self.y=y
self.text\u surface=name\u font.render(name\u text,True,(255,255))
self.rect_width=max(140,10+self.text_surface.get_width())
self.input_rect=rect(x,y,self.rect_宽度,32)
draw.rect(屏幕,(0,0,0),self.input_rect,0)
draw.rect(屏幕,(255,255,255),self.input_rect,2)
self.input_rect.w=self.text_surface.get_width()+10
blit(self.text_surface,(self.input_rect.x+5,self.input_rect.y+5))
def命名(自我、事件):
全局rect_1
全局名称\u文本
对于事件中的e:
如果e.type==MOUSEBUTTONDOWN:
mx,my=e.pos
如果self.input_rect.x+150>=mx>=self.input_rect.x-10:
如果self.input_rect.y+40>=my>=self.input_rect.y-10:
self.active=True
如果不是self.input_rect.x+150>=mx>=self.input_rect.x-10:
如果不是self.input_rect.y+40>=my>=self.input_rect.y-10:
self.active=False
如果e.type==KEYDOWN:
如果自我激活:
如果e.key==K_退格:
name_text=name_text[:-1]
其他:
name_text+=e.unicode
self.text\u surface=name\u font.render(name\u text,True,(255,255))
def提取(自身,屏幕):
draw.rect(屏幕,(0,0,0),self.input_rect,0)
draw.rect(屏幕,(255,255,255),self.input_rect,2)
self.input_rect.w=self.text_surface.get_width()+10
blit(self.text_surface,(self.input_rect.x+5,self.input_rect.y+5))
rect_1=矩形(200200)
运行=真
运行时:
events=event.get()
对于事件中的e:
如果e.type==退出:
运行=错误
rect_1.命名(事件)
屏幕填充(0)
矩形1.绘制(屏幕)
display.update()
时间延迟(1)

@Python2019搞错了,当点击鼠标时,mx和my会被更新和比较,但他没有用global获得它们,但他仍然使用它们。我已经运行了代码,当你改变我之前说的内容时,当点击框时激活,当点击框外的另一个按钮时停用。