我试图用Python 2.7.8来制作这个打印计算器程序,但是每当我运行它时,它都会输出:
0 0 0 0
等等。 它无限地做到这一点,永不止步。 我真的很感激任何帮助。 这是我的代码。 谢谢!
import msvcrt # Windows only! def getch(): return msvcrt.getch() def putch(ch): msvcrt.putch(ch) total = 0 pendingOp = 0 print "*** Calculator ***" while True: ch = getch() if ch == "q": break # quit if ch == "c": # clear the display total = 0 pendingOp = 0 elif ch == "a" or "s" or "m" or "d": # add, subtract, multiply, divide pendingOp = ch elif (ch >= "0" and ch <= "9"): newNumber = int(ch) if pendingOp == 0: total = newNumber else: if pendingOp == "a": total = total + newNumber elif pendingOp == "s": total = total - newNumber elif pendingOp == "m": total = total * newNumber elif pendingOp == "d": total = total / newNumber pendingOp = 0 print total
你的问题是,由于某种原因,你没有一个控制台。
Python的msvcrt.getch
是MSVCRT函数_getch
一个简单的包装器。 虽然那里的文件说“没有错误的回报”,但这不是真的。 如果没有应用程序的控制台,这些函数立即返回,返回-1(转换为适当的类型,这意味着你得到'\xff'
为getch
和u'\uffff'
为getwch
– 这正是你看到)。
那么,为什么没有控制台呢?
最常见的原因是你在一些GUI IDE(如IDLE或PyWin)中运行应用程序,而不是从cmd shell(又名“DOS提示符”)运行应用程序。 你不能在IDLE中使用msvcrt
。*
还有其他的可能性,比如明确的关闭或者从控制台上分离出来,但是我怀疑这些在这里是相关的。
那么,你能做什么?
那么,如果你使用IDLE,它实际上是模拟Tkinter GUI上的命令行输入。 这种模拟不能提供任何方式来一次输入一个字符,一次只能输入一个字符。 所以,你可以在这里使用raw_input
而不是msvcrt.getch
。
理论上你可以挂钩IDLE模拟输入,但是这比为你的应用程序构建你自己的Tkinter GUI(或者Qt或者Win32或者其他GUI)要少得多。
或者,也可以停止在IDLE中运行程序。 打开一个cmd窗口,用python myscript.py
(或C:\Python27\python D:\mystuff\myscript.py
或其他)运行程序。 如果你不知道如何在Windows上使用shell,那么现在是学习的好时机。
*嗯,你可以通过ctypes
或win32api
调用Windows API函数来明确地分配一个控制台。 但是如果你这样做的话,它会弹出一个单独的cmd shell窗口让你输入,它仍然不会影响IDLE的输入。
欢迎来到不同字符串编码之间转换的奇妙世界。 该特定的API返回一个不同于Python的普通字符串UTF编码的字节字符串,两者不会进行比较。 尝试例如, if ch == b'q'
。
另一个解决方案是直接获取宽字符:
def getch(): return msvcrt.getwch()
对我来说,一个问题是Ctrl-C返回(显然是在Windows上),即使我的Python的API文档说不应该。
更新:
abarnert的答案似乎是根本原因。 我离开这个答案,因为字符串编码问题导致在控制台上运行的Python 3相同的症状,并在一般情况下是一个类似的有趣的头痛的原因。