python-3.x _tkinter. Tcl错误:应为浮点数,但得到的是“08”(看起来像无效的八进制数)

x7yiwoj4  于 2023-01-10  发布在  Python
关注(0)|答案(2)|浏览(217)

我是一名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))

是不是和我的数据类型有关?我不知道该怎么解决。

smtd7mpg

smtd7mpg1#

这是你的IntVar。我不知道这是一个bug还是为了向后兼容,但是IntVar.get()为你做了类型转换。在Python 2中,以0为前缀的数字将被解释为八进制(即010等于8)。你设置的值很好,但是当它尝试get()"08"时,它会崩溃。
搜索整个代码,问题源于实际的Tcl解释器,因为get()方法被作为globalgetvar()发送到Tcl解释器,并且从那里它甚至没有被Python解释。实际上,它甚至不是一个bug- Tcl应该将0###识别为八进制,并且这被认为是gotcha's of the language中的一个。
解决这个问题的正确方法是使用一个好的数据访问对象--使用它来向sqlite发送数据和从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
2g32fytz

2g32fytz2#

取代:

variable_start = IntVar(root)

用途:

variable_start = StringVar(root)

这样就没有问题了,因为事先就很清楚它是字符串而不是整数。
然后,当您想要使用数字数据时,使用标准的字符串到整数转换函数-int将该字符串转换为整数。
例如:

hour1 = int(variable_start.get())

相关问题