考虑以下程序:
from time import sleep
from threading import Thread
def speaker():
while True:
sleep(3)
print("[*]I'm speaking........")
if __name__ == "__main__":
my_speaker = Thread(target=speaker)
my_speaker.start()
while True:
msg = input("[Your message]>> ")
print("Your message: " + msg)
如果我在输入中没有键入任何内容,则输出('_'是光标的位置(:
[Your message]>> [*]I'm speaking........
[*]I'm speaking........
[*]I'm speaking........
[*]I'm speaking........
[*]I'm speaking........
[*]I'm speaking........
[*]I'm speaking........
_
我想展示的输出:
[*]I'm speaking........
[*]I'm speaking........
[*]I'm speaking........
[*]I'm speaking........
[*]I'm speaking........
[*]I'm speaking........
[*]I'm speaking........
[Your message]>> _
当"扬声器"功能执行打印功能时,应执行以下步骤:
将当前行的文本移动到下一行
返回到前一行的开头
执行打印
返回到下一行的末尾
我看了一下这里:https://learn.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences我发现了一些有用的东西,比如可以用">\r"回到当前行的开头,但我不想覆盖文本,而是将其移到下一行。
有什么想法吗?
试试这个:
from time import sleep
from threading import Thread
def speaker():
while True:
sleep(3)
print("r[*]I'm speaking........n[Your message]>> ", end="")
if __name__ == "__main__":
my_speaker = Thread(target=speaker)
my_speaker.start()
while True:
msg = input("[Your message]>> ")
print("Your message: " + msg)
我发现的问题是,睡眠的地方(3(让你的输入在你想要的之前出现,因为你想要等待的是输入本身。
下一个问题是,如果你这样做,你的输入将在最后,但它也会向你显示类似"[你的消息]>[*]我在说话……"的内容。我认为这是因为你几乎同时执行输入和循环,它有点"疯了",所以我添加了一个简单的选择触发器,以防止打印工作,并最终将输入到下半部分,而不会出现任何奇怪的结果。
这是一个简单粗暴的解决你问题的办法。
我不认为这是完美的,我很确定有更好的选择来解决这个问题。我自己也是一个编码新手,但我希望我的解决方案能派上用场!
from time import sleep
from threading import Thread
def speaker():
while True:
if opt is not None:
print ("[*]I'm speaking........")
global opt
opt = 1
if __name__ == "__main__":
my_speaker = Thread(target=speaker)
my_speaker.start()
while True:
sleep(3)
opt = None
msg = input("[Your message]>> ")
print("Your message: " + msg)