这个简单的程序在从命令行输入时有效,但不在IDLE中。
#
import msvcrt
while not msvcrt.kbhit():
print('.', end='')
print("kbhit!")
我曾希望这个问题会在Python 3中消失。
有些问题:
提前致谢。
答案 0 :(得分:1)
我将用户3666197的上一个答案反馈回0并将添加更多。空闲本身在一个过程中运行。除非以-n开头,否则Idle会运行您的代码,无论是在shell中输入的语句是&gt;&gt;&gt;或编辑器中的整个模块。键盘仍然连接到空闲进程,并且“.... 6 ............... 6 ...”中的回显键来自空闲代码,而不是您的代码。< / p>
出于好奇,我开始使用-n进行空闲,并且tk主循环仍然首先抓取关键事件,并且您的程序仍然无限期地运行。
[edit]我还在问题中运行了测试程序,保存为tem.py,其中包含以下内容
>>> import subprocess as sb
>>> sb.Popen("python c:/programs/python34/tem.py")
这与从控制台运行程序的工作方式相同。打一键打印'kbhit!'并关上了窗户。从第二个编辑器窗口运行时,这也适用。
我正在考虑将这个想法添加到Idle doc作为运行程序的一般方法,就像这个程序一样,与Idle的运行环境交互得很糟糕。 (这不是第一个。)或者也许应该有一个新的运行菜单项。我不知道该怎么称呼它。运行批处理?在控制台中运行?
在测试程序结束时添加input()
会在键输入后保持窗口打开。
在循环中添加time.sleep(.5)会导致'。'打印要在缓冲区中收集,直到按下键才会显示。与Idle无关,如果程序在控制台中执行,则与
一样C:\Programs\Python34>python tem.py
答案 1 :(得分:0)
您可能想知道,IDLE是一个分层应用程序,它使用基于Tcl / Tk的Tkinter控制器部分,它还可以扫描和评估 .mainloop()
中与键盘相关的事件。这与你想要检测 .kbhit()
没有
是的,Notepad.exe除了许多其他编辑器。如果坚持使用IDE, PyScripter 可能是这样的候选者,因为它不依赖于Tcl / Tk Tkinter框架并且有许多智能选项(内部/外部python解释器,intellisense,object-introspection,help on导入模块&#39;通过各自的.__doc__
- 字符串和许多其他字符串
了解两个并发控制器的不可避免的冲突(.mainloop()
+ .kbdhit()
)
Btw 。,IDLE&#39; .mainloop()
在您的示例中获胜:o)
N.b。:您的博客在哪里发布了?