【问题标题】:How to get an input from user in Pygame and save it as a variable? [duplicate]如何在 Pygame 中获取用户的输入并将其保存为变量? [复制]
【发布时间】:2014-12-30 23:04:03
【问题描述】:

我想在游戏中获取用户的输入(例如他们的姓名),然后将其显示在屏幕上。

我尝试了模块(包括InputBox),但它们都不起作用。他们只是在屏幕上显示我的文字。

我想将该输入保存到变量。有没有办法做到这一点?

例子:

font1 = pygame.font.SysFont("None", 30)
score = 0
text = font1.render("{}".format(score), True,(255,255,255))
...
...
if sneakeattheapple:
    score += 1
    text = font1.render("{}".format(score), True,(255,255,255))
...
...
screen.blit(text,(275,6))

这会将score 变量放在屏幕上。但是score 已经定义好了,我想用用户给定的变量来做这个。

编辑:让我更清楚。在 Python 中,我们可以这样做:

x = input("Do you want to do this? (y/n): ")
if x == "y":
    #do something
if x == "n":
    #do something

这就是我想在 Pygame 中做的事情。

【问题讨论】:

  • 你试过用input()
  • @PythonMaster 说真的......我想从 pygame 屏幕而不是 Python shell 中获取输入......
  • @PythonMaster 不,不是重复的。我已经检查了 SO 中的所有问题。
  • “我尝试过 InputBox 等,但它实际上不起作用” - 什么不起作用? “不工作”不是问题陈述。您没有发布收到的任何错误或任何内容。
  • 您希望用户输入一个变量名,然后打印该变量的值吗?我很难理解您在其他方面需要什么帮助。

标签: python input pygame


【解决方案1】:

Pygame 并没有为此添加任何内容。您要么需要使用第 3 方 GUI 库,要么自己构建它。示例:如果文本框有焦点,则获取所有 keydown 事件,并附加到字符串。每一帧,画一个框,然后在上面画字符串。

构建一个简单的应该不难,但如果你想要一个功能更全的,使用库可能会更容易。

【讨论】:

  • 我使用了一些 3rd-party 模块,正如我在问题中提到的,但它们没用
  • 没有一个有效? pygame.org/wiki/gui#GUI图书馆
【解决方案2】:

我目前假设此功能与您的程序一起使用是成功的并且没有引发错误。这是您给我们的链接中的一个功能:

def ask(screen, question):
    "ask(screen, question) -> answer"
    pygame.font.init()
    current_string = []
    display_box(screen, question + ": " + string.join(current_string,""))
    while 1:
      inkey = get_key()
      if inkey == K_BACKSPACE:
        current_string = current_string[0:-1]
      elif inkey == K_RETURN:
        break
      elif inkey == K_MINUS:
        current_string.append("_")
      elif inkey <= 127:
        current_string.append(chr(inkey))
      display_box(screen, question + ": " + string.join(current_string,""))
    return string.join(current_string,"")

看起来这就是您从具有 pygame 屏幕的用户那里获取输入的方式,对吧?我们看一下这个函数的第 4 行:

current_string = []

用户键入的内容存储在此列表中。假设您知道如何获取字符串并将其放在屏幕上,您可以像这样保存字符串:

string_input = ''.join(current_string)

如果你能做一个类似的功能(如果这个不起作用),你可以做同样的事情!只需将列表中的第一项保存在变量中,如上所示。如果您有任何问题,请发表评论,以便我编辑我的答案。
现在进入下一部分。您可以随时简单地激活此功能。您可能想在发生某些事情时激活。一个例子是蛇吃苹果的时候。我相信你可能有一个功能。你可以像这样创建一个变量:

Eat = 0

然后放入那个函数。当该变量等于 0 时。没有什么能真正激活其他功能。当蛇吃掉苹果时,将变量重置为1,然后像这样激活函数:

if Eat = 0:
    someclassname.ask()

您在许多其他场合都这样做。我希望这更清晰,更有帮助!

【讨论】:

  • 看起来很有希望。我建议使用return ''.join(current_string)(很少需要再使用string 模块)。另外,在您回答的最后,string_input = current_string[0] 不会只是将一个字符放入string_input 吗?如果是这样,那么不清楚你在说什么。
  • 为什么要把字符串放在第二行?
【解决方案3】:

您是否尝试过获取关键事件,然后将它们组合在一起形成一些东西?你可以在你的主游戏循环中加入这样的东西。

input = ''
for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                playing = False
            if event.key == pygame.K_w:
                input = input + "w"
            if event.key == pygame.K_s:
                input = input + "s"
            if event.key == pygame.K_a:
                input = input + "a"

然后您可以检查用户何时完成输入(按钮/回车键),并最终确定变量。 有了这个,您可能会遇到一个问题,即按键被按住的时间更长,因此您只需按一次按钮即可获得 3 w。如果是这种情况,您可以 1. 在经过一定时间之前不允许其他输入(可能是 0.25 秒?)或 2. 使用 pygame.KEYUP 而不是 pygame.KEYDOWN 并专门检查笔画。

【讨论】:

    【解决方案4】:

    这是一个可能的解决方案,它可能对像我这样同样遭受此问题困扰的未来访问者非常有用。哪个是;

    首先制作一个文本渲染函数

    def text1(word,x,y):
        font = pygame.font.SysFont(None, 25)
        text = font.render("{}".format(word), True, RED)
        return screen.blit(text,(x,y))
    

    然后一个函数就像input;

    def inpt():
        word=""
        text1("Please enter your name: ",300,400) #example asking name
        pygame.display.flip()
        done = True
        while done:
            for event in pygame.event.get():
                if event.type==pygame.QUIT:
                    pygame.quit()
                    quit()
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_a:
                        word+=str(chr(event.key))
                    if event.key == pygame.K_b:
                        word+=chr(event.key)
                    if event.key == pygame.K_c:
                        word+=chr(event.key)
                    if event.key == pygame.K_d:
                        word+=chr(event.key)
                    if event.key == pygame.K_RETURN:
                        done=False
                    #events...
        return text1(word,700,30)
    

    如你所见,这个函数捕捉键盘事件,它也有自己的while 循环,这很重要。当按下 Enter 按钮时,我打破了循环,这是 if event.key == pygame.K_RETURN: done=False 。然后用text1 函数返回我们的单词,显示。其他事件当然可以根据意见设置,例如空格按钮等。

    然后,实际上我们必须创建一个intro 函数,我们会在其中询问用户的姓名,例如,当intro 函数完成时,姓名会在屏幕上设置,直到游戏结束。

    def game_intro():
    intro=True
    
    while intro:
        for event in pygame.event.get():
            if event.type==pygame.QUIT:
                pygame.quit()
                quit()
            if event.type==pygame.KEYDOWN:
                if event.key==pygame.K_RETURN:
                    intro=False
        inpt() #Here we are calling our function
        screen.fill(white)
    
        pygame.display.update()
        clock.tick(15)
    

    看到我们再次用Enter 按钮打破了这个循环。所以我们会在介绍中询问用户我们的问题,然后我们会将其设置在屏幕上,例如右上角。

    【讨论】:

    • 非常感谢!
    猜你喜欢
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多