【发布时间】:2020-06-19 17:19:01
【问题描述】:
我对整个编程非常陌生。对 C++ 和 HTML 有一些基本经验,比如简单的计算器和其他非常基本的东西(几个月前我开始自学),因此我什至不确定我是否正确地发布了这个问题。也许不言而喻,但我也是stackoverflow的新手(我的第一篇文章!),所以我可能在这里做错了一些事情,恳请您理解。任何建设性的批评都非常受欢迎!
所以这是我的问题:我正在尝试在 Python 3 中制作一个简单的聊天程序,但有一个问题:我想使用 python 的异步功能来允许用户在任何给定时间通过 esc 终止程序键被按下。我已经研究过一些库,例如 pynput、asyncio、tornado 和 getch()。但无论我如何更改我的代码,我似乎都无法在这里达到我的目标。
我创建了一个名为runalways() 的异步函数,它应该在程序的整个持续时间内运行,与其他函数并行。但它没有,我不知道为什么......
如果我不能正确解释我的问题,我很抱歉。有些术语和概念对我来说仍然相当模糊,但希望不会太久。我将留下到目前为止的代码,它可以很好地实现聊天功能,但仅此而已。此时异步位基本上不存在。
如果有人能解释我所缺少的,将不胜感激:
import time, asyncio
from msvcrt import getch
# Creates a chat-like effect
def typing(text):
for i in text:
print(i, end=" ")
time.sleep(0.1)
time.sleep(1.0)
# Terminates the program
def termination():
print("Program terminated")
time.sleep(0.5)
SystemExit
# Defines async function to read pressed keys and terminate if Esc is pressed
# (Not working)
async def runalways():
while True:
print(ord(getch()))
key = ord(getch())
if key == 27: # Esc
termination()
# Initialize chatting
def startChat():
typing("\nHello!\n")
typing("How are you?\n\n")
typing("Answer:\t")
x = input()
typing("\nAnyways, that isn't relevant right now.\n")
time.sleep(0.5)
typing("Can we get started?\n\n")
typing("Answer(Y/N):\t")
x = input()
# validates input
while (x != "Y") & (x != "N"):
typing("\nHey, don't go fooling around now. Keep it real! Try again.\n\n")
typing("Answer(Y/N):\t")
x = input()
if (x == "Y") | (x == "y"):
typing("\nThere you go! Now, let's go through the basics...\n\n")
termination()
elif (x == "N") | (x == "n"):
typing("\nSorry to hear that... See you next time, then!")
termination()
# Defines starter point for the program
def main():
runalways()
startChat()
main()
我会尽力澄清任何可能有助于理解我的问题的问题。提前致谢!
【问题讨论】:
-
嘿!欢迎来到堆栈溢出!您提供了一个非常好的第一个问题,做得好!我做了一个小编辑,根据pep8 格式化代码并澄清这是特定于 Windows 的。
msvcrt模块在 Linux 上不可用,所以我无法直接帮助您。有一件事,你导入了asyncio,但从未使用它,你是不是忘了从你的代码sn-p中删除它? -
您好!并感谢您的更正!我实际上在代码中使用过一次 asyncio,正确的是定义了
runalways()函数。这个想法是让这个函数作为一个并行进程运行,这样如果用户在任何时候敲击键盘,该函数就会检查击键是否是 Esc,如果是,则终止程序。但老实说,我几乎不知道我在这里做什么,这对我来说是全新的,甚至可能有点太多了,但我还是决定去看看我能不能做到xD -
啊,是的,我很抱歉!我认为@Prune 会让你度过这个难关 :) 我只想留给你这个,非常相关的question。
标签: python python-3.x windows asynchronous python-asyncio