在满足第一个循环条件后,循环没有等待,是否有其他while循环



这是我的代码:

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!")

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

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!

关于如何解决这个问题或更好地实现我正在努力实现的目标,有什么想法吗?

我认为问题的发生是因为keyboard.is_pressed('enter')返回True。我建议你重新阅读keyboard图书馆的文档,这将提高你的自学能力。但我认为你做错了,你可以在论坛上搜索一些你感兴趣的问题,如何以最佳方式实现X?(这会提高你的编程技能,我相信你对编程的理解(,所以我为你搜索了捕捉回车键的最佳方式(问题(,正如我所看到的,最好的选择是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

你可能会发现,当你慢得像人一样的手指仍在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: ")

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

  • 减少重复代码,从而更容易修复或增强内容;以及
  • 通过删除不必要的细节,提高主线代码的可读性

最新更新