【问题标题】:How to store an input value as a variable in Pygame如何在 Pygame 中将输入值存储为变量
【发布时间】:2021-04-16 11:31:59
【问题描述】:

我在 Pygame 中有一个输入框类,在其中我只输入数字,我想要的是,每次我按 ENTER 时,这个值都会存储在一个变量中,以便从另一个函数中使用。谢谢大家。 这是输入框代码:

class InputBox:

    def __init__(self, x, y, w, h, text=''):
        self.rect = pg.Rect(x, y, w, h)
        self.color = COLOR_INACTIVE
        self.text = text
        self.txt_surface = FONT.render(text, True, self.color)
        self.active = False

    def handle_event(self, event):
        if event.type == pg.MOUSEBUTTONDOWN:
            # If the user clicked on the input_box rect.
            if self.rect.collidepoint(event.pos):
                self.active = not self.active
            else:
                self.active = False
            self.color = COLOR_ACTIVE if self.active else COLOR_INACTIVE
        if event.type == pg.KEYDOWN:
            if self.active:
                if event.key == pg.K_RETURN:
                    print(self.text)
                    self.text = ''
                elif event.key == pg.K_BACKSPACE:
                    self.text = self.text[:-1]
                else:
                    self.text += event.unicode
                self.txt_surface = FONT.render(self.text, True, self.color)

    def update(self):
        width = max(200, self.txt_surface.get_width()+10)
        self.rect.w = width

    def draw(self, screen):
        screen.blit(self.txt_surface, (self.rect.x+5, self.rect.y+5))
        pg.draw.rect(screen, self.color, self.rect, 2)


def main():
    ...

    while not done:
        for event in pg.event.get():
            if event.type == pg.QUIT:
                done = True
            for box in input_boxes:
                box.handle_event(event)
                
        for box in input_boxes:
            box.update()

        screen.fill((30, 30, 30))
        for box in input_boxes:
            box.draw(screen)

        pg.display.flip()
        clock.tick(30)

【问题讨论】:

  • 使用字典

标签: variables pygame inputbox


【解决方案1】:

将列表属性添加到类InputBox 并将新输入附加到列表中:

class InputBox:

    def __init__(self, x, y, w, h, text=''):
        # [...]

        self.input_list = []

    def handle_event(self, event):
        if event.type == pg.MOUSEBUTTONDOWN:
            # If the user clicked on the input_box rect.
            if self.rect.collidepoint(event.pos):
                self.active = not self.active
            else:
                self.active = False
            self.color = COLOR_ACTIVE if self.active else COLOR_INACTIVE
        if event.type == pg.KEYDOWN:
            if self.active:
                if event.key == pg.K_RETURN:
                   
                    input_list.appned(self.text)

                    print(self.text)
                    self.text = ''

                elif event.key == pg.K_BACKSPACE:
                    self.text = self.text[:-1]
                else:
                    self.text += event.unicode
                self.txt_surface = FONT.render(self.text, True, self.color)

您可以访问每个框的输入列表:

last_inout = input_boxes[0].input_list[-1]

【讨论】:

    【解决方案2】:

    这个例子是否有助于你理解这个概念:

    user_input = {'user_input': []}
    
    
    class UserInput:
        def __init__(self):
            self.input_ = input('Input something: ')
            user_input['user_input'].append(self.input_)
    
    
    ask = UserInput()
    print(user_input)
    

    如果您想在函数中使用字典中的值,您可以像这样访问该值:

    dict_name['key_name']
    

    将访问可以是列表的值,以及整数、元组、另一个字典、字符串,基本上是上面所见的变量名称,因此在函数中可以像这样使用它:

    your_func(user_input['user_input'][0])
    

    例如,如果您的函数的第一个参数是附加到 user_input['user_input'] 列表的第一项,在这种情况下,这就是用户输入的内容

    【讨论】:

    • 你能详细说明这是如何工作的吗?您不能在应用程序循环中使用inputinput 等待输入。当系统等待输入时,应用程序循环将停止,游戏将不会响应。
    • @Rabbid76 我理解(现在),但它更像是一个例子来支持我使用字典的评论,以防 OP 询问如何从一个类中添加到字典中,显然在他的情况下会有回车键将返回输入的值等等,但这只是为了展示如何添加到字典的示例,还将添加如何使用该值
    • 我不认为新手程序员可以将这些建议应用到他的代码中。
    • @Rabbid76 好吧,至少我试过了,如果有不清楚的地方随时准备回答问题,对于其他人来说,如果他们查看问题,一个概念比直接回答更容易应用,因为有只有很小的机会有人会遇到同样的问题,但显然一个概念也可以直接回答
    • 你不明白我的意思。我担心新手程序员会复制您的代码并在应用程序循环中调用input。根据我的经验,他们只是复制代码而不阅读答案。
    猜你喜欢
    • 2017-04-21
    • 1970-01-01
    • 2021-02-01
    • 2018-09-18
    • 2019-04-04
    • 2020-01-24
    相关资源
    最近更新 更多