我正在尝试在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
答案 0 :(得分:2)
您的问题是,由于某种原因,您没有控制台。
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)要多得多,效果要好得多。< / p>
或者,您可以停止在IDLE中运行程序。打开cmd窗口并使用python myscript.py
(或C:\Python27\python D:\mystuff\myscript.py
或其他)运行程序。如果您不知道如何在Windows上使用shell,那么这是一个学习的好时机。
*嗯,您可以通过ctypes
或win32api
调用Windows API函数来显式分配控制台。但是如果你这样做,它会弹出一个单独的cmd shell窗口供你输入,它仍然不会影响IDLE的输入。
答案 1 :(得分:1)
欢迎来到不同字符串编码之间转换的精彩世界。该特定API返回的字节字符串与Python的普通字符串UTF编码不同,并且两者不会进行比较。请尝试if ch == b'q'
。
另一个解决方案是直接获取宽字符:
def getch():
return msvcrt.getwch()
对我来说有些问题是返回了Ctrl-C(显然是在Windows上),即使我的python的API文档说它不应该是。
更新
abarnert的答案似乎是根本原因。我留下这个答案是因为字符串编码问题会导致在控制台中运行的Python 3出现相同的症状,并且通常会导致同样有趣的问题。