【问题标题】:Additional while loops not waiting after first loop condition is met?满足第一个循环条件后,其他 while 循环不等待?
【发布时间】:2020-10-31 18:14:39
【问题描述】:

这是我的代码:

import random
import keyboard

print("First, press enter to randomize your first mastery:")
while True:
    if keyboard.is_pressed("enter"):
        with open("masteries.txt", "r") as f:
            masteries = f.read().splitlines()
            random_mastery1 = random.choice(masteries)
            break

file_name = random_mastery1.lower() + "_skills.txt"

print(f"Next, press enter to randomize your primary active skill for your first randomized mastery:")
while True:
    if keyboard.is_pressed("enter"):
        with open(file_name, "r") as skill_file:
            skills = skill_file.read().splitlines()
            random_skill = random.choice(skills)
            break

print(f"Finally, press enter to randomize your second mastery:")
while True:
    if keyboard.is_pressed("enter"):
        with open("masteries.txt", "r") as f:
            masteries = f.read().splitlines()
            random_mastery2 = random.choice(masteries)
            break

print(f"You'll be starting as {random_mastery1} with a primary active skill of {random_skill}." + 
f" Your second mastery will be {random_mastery2}. Have fun!")

该程序在核心功能方面完全符合我的要求,但是在第一次按 Enter 以随机化第一个掌握之后,它不会中断并等待接下来的两个输入输入,它只是运行并在之后完成按回车一次。示例:

First, press enter to randomize your first mastery:
**I press enter here**

Next, press enter to randomize your primary active skill for your first randomized mastery:
Finally, press enter to randomize your second mastery:
You'll be starting as Shaman with a primary active skill of Grasping Vines. Your second mastery will be Nightblade. Have fun!

关于如何解决这个问题或更好地实现我想要完成的任何想法?

【问题讨论】:

    标签: python while-loop break


    【解决方案1】:

    我相信问题正在发生,因为keyboard.is_pressed('enter') 返回True。我建议你再读一遍keyboard library 的文档,它会提高你的自学能力。 但我认为你做错了,你可以在论坛上搜索一些你感兴趣的问题,如何以最佳方式实现 X? (它会提高你的编程技能,我相信对编程的理解),所以我搜索你什么是捕捉输入按键的最佳方法(The question),我认为最好的选择是input(),还有getch(),但它会接受键盘上的所有键,您可以创建getch() 的循环并检查键是否为Enter(并在捕获时打破循环)。

    示例代码:

    import msvcrt as m # I don't recommend to use one-letter import, just copied from the question.
    
    def wait_for_enter():
        key = m.getch()
    
        if key == b'\r': # Enter pressed.
            print('enter pressed')
            break
    

    【讨论】:

      【解决方案2】:

      您实际上可能会发现,您的超快计算机已经完成了整个段代码的执行,而您的慢速手指仍在enter 键上:-)

      如果是这样的话,你只需要在下一次检查之前等待密钥的释放,例如:

      import time
      :
      while keyboard.is_pressed("enter"):
          time.sleep(0.01)
      

      每次通过循环打开和读取这些文本文件也非常效率低下(除非它们在磁盘上可能发生很大变化,这是不寻常的)。您最好在循环开始之前读取文件一次,然后使用随机性来选择一个元素。

      另外请记住,除非程序的当前运行时间或当前时间对random.choice() 有影响(我不相信是这种情况),否则您所做的与此无关- 无论您是否等待按下enter 键,您都将获得相同的值。

      假设您想要将用户用作熵源,您可以使用如下函数:

      import keyboard, time, random
      
      def userRand(seq, prompt = None):
          # Wait until ENTER key up then prompt if desired.
      
          while keyboard.is_pressed("enter"):
              time.sleep(0.01)
          if prompt is not None:
              print(prompt, end = "")
      
          # Get random choice from sequence, until ENTER key down.
      
          retVal = random.choice(seq)
          while not keyboard.is_pressed("enter"):
              time.sleep(0.01)
              retVal = random.choice(seq)
      

      然后用更简洁的方式称呼它:

      with open("masteries.txt", "r") as f:
          masteries = f.read().splitlines()
      random_mastery1 = userRand(masteries, "Press ENTER for first mastery: ")
      
      with open(f"{random_mastery1.lower()}_skills.txt", "r") as f:
          skills = f.read().splitlines()
      random_skill = userRand(skills, "Press ENTER for primary skill: ")
      
      random_mastery2 = userRand(masteries, "Press ENTER for second mastery: ")
      

      这种重构(将常见的东西移动到函数中)有几个优点,其中包括:

      • 减少重复代码,从而更容易修复或增强事物;和
      • 通过删除不必要的细节使您的主线代码更具可读性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-18
        • 1970-01-01
        • 2018-12-22
        • 1970-01-01
        • 1970-01-01
        • 2017-03-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多