试图用Python创建一个打印计算器程序,程序无限输出0

时间:2014-11-14 01:24:49

标签: python windows python-2.7 calculator msvcrt

我正在尝试在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

2 个答案:

答案 0 :(得分:2)

您的问题是,由于某种原因,您没有控制台。

Python的msvcrt.getch是围绕MSVCRT函数_getch的瘦包装器。虽然那里的文档说“没有错误返回”,但事实并非如此。如果应用程序没有控制台,这些函数会立即返回,返回-1(转换为相应的类型,这意味着'\xff'获得getchu'\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,那么这是一个学习的好时机。


*嗯,您可以通过ctypeswin32api调用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出现相同的症状,并且通常会导致同样有趣的问题。