_tkinter.TclError:预期的浮点数,但得到了" 08" (看起来像无效的八进制数)

时间:2017-04-14 10:31:25

标签: python-3.x tkinter

我是一名A级学生,正在编写计算课程。我的代码的一小部分接受输入将它们变成一个时间。早上8点钟的时间显示如下:08,因为这就是SQLite喜欢它的方式。但是,当将其转换为日期时,我会在标题中收到错误消息:

_tkinter.TclError: expected floating-point number but got "08" (looks like invalid octal number)

09也会发生这种情况,但06或07不会发生。

代码:

variable_start = IntVar(root)
variable_start.set("Select Start Time")

option_add_start =  ttk.Combobox(window1, textvariable = variable_start,width = 20, state = 'readonly')
option_add_start['values'] = ("06", "07", "08", "09", "10", "11", "12", "13", "14", "15",
"16", "17", "18","19", "20")

hour1 = variable_start.get()
min1 = variable_start_min.get()
starttimehour = str(datetime.time(hour1,min1,second))

是否与我的数据类型有关?我不确定如何解决它。

1 个答案:

答案 0 :(得分:1)

这是你的IntVar。我不知道它是错误还是向后兼容,但IntVar.get()会为您输入转换类型。在Python 2中,以0为前缀的数字将以八进制解释(即010等于8)。您可以正确设置该值,但在尝试get() "08"时它会爆炸。

通过代码搜索,问题源于实际的Tcl解释器,因为get()方法被发送到Tcl解释器globalgetvar(),并且从那里它甚至不被解释为蟒蛇。实际上,它甚至不是一个错误--Tcl应该将0###识别为八进制,这被认为是gotcha's of the language之一。

此问题的正确解决方法是使用一个好的数据访问对象 - 使用它来发送和从sqlite检索数据。这样,您可以封装代码以将整数8转换为sqlite想要的08。稍微晦涩的方式是在将数据发送到sqlite之前调用单个函数,这看起来像是:

anInt = variable_start.get()
serialInt = serialize(anInt)
send_to_sqlite(serialInt) // I've not worked with SQLite, so this line is pseudocode.

serialize(int):
    new = str(int)
    if(new < 10):
        new = "0" + new
    return new