我是一名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))
是否与我的数据类型有关?我不确定如何解决它。
答案 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