python的十进制模块中的文字无效

时间:2013-07-11 11:04:09

标签: python floating-point tk

这一切都始于臭名昭着的浮点怪异。我正在制作一个简单的国际象棋时钟,因为在国际象棋中经常变得很重要,我想每0.01秒更新一次时钟。这就是我不使用int变量的原因。我尝试使用浮点变量,但是对于玩家看31.2899999999999999而不仅仅是31.29来说真的很烦人。然后谷歌搜索这个问题带我到十进制模块,看起来很酷,似乎是一个解决方案,但现在我收到以下错误:

Exception in Tkinter callback
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/tkinter/__init__.py", line 1475, in __call__
return self.func(*args)
File "/Users/maciek/Documents/chessclock/chessclock2.py", line 8, in player1move
x=float(player2.get())
File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/tkinter/__init__.py", line 313, in get
return getint(self._tk.globalgetvar(self._name))
ValueError: invalid literal for int() with base 10: '29.21'

我认为值得注意的是,当两位球员都有30秒的时候,第一步动作效果很好。我没有包含player2move函数的代码,因为它的类比。除了修复我的十进制使用之外,我还对任何其他想法如何使浮动值正确显示(对于人眼来说,也就是说,我猜计算机31.2899999999999999 正确值) )。 这是我的代码:

from decimal import *
from tkinter import *
from tkinter import ttk
import time

def player1move(*args):
    getcontext().prec = 6
    x=float(player2.get())
    x=Decimal(x)
    while x>0:
        time.sleep(0.01)
        x=x-Decimal('0.01')
        player1.set(Decimal(x))
        root.update()

root = Tk()
root.title("Python Chessclock 2.0")

mainframe = ttk.Frame(root, padding="3 3 12 12")
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
mainframe.columnconfigure(0, weight=1)
mainframe.rowconfigure(0, weight=1)

player1 = IntVar()
player1.set(Decimal(30))
ttk.Label(mainframe, textvariable=player1).grid(column=1, row=1, sticky=(W))
ttk.Label(mainframe, textvariable=player2).grid(column=3, row=1, sticky=(E))

root.bind('p', player1move)
root.mainloop()

谢谢你的时间!

1 个答案:

答案 0 :(得分:0)

如果您更仔细地阅读回溯,您会注意到该异常与decimal模块无关,但在getint中调用了tkinter

另外,如果你想要的只是一个漂亮的字符串表示,你根本不需要使用decimal - 只需使用Python的字符串格式化功能。