2017-04-14 153 views
0

我是一名A級學生,他正在寫計算機課程。我的代碼中的一小部分需要輸入將它們變成一個時間。早上8點如此顯示:08,因爲這就是SQLite喜歡它的原因。它轉換成一個日期然而,當我在標題中得到錯誤信息:_tkinter.TclError:預期的浮點數,但得到了「08」(看起來像無效的八進制數)

_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

能否請您發表您的完整代碼,包括如何定義的變量'hour1','min1'等等。? – pkqxdd

+0

@pkqxdd hour1和min1都沒有明確定義爲某種數據類型,所以我猜測它們是字符。我的代碼不是很整齊,而這正是導致我認爲的問題的原因。這只是我的程序的一部分,其他模塊不會影響到這一點,但如果你想要我的完整代碼,那麼它就會提供一個很長的鏈接。 – simons21

+0

你是否100%確定你在Python 3.x中工作? Python 2以'0'作爲表示八進制數的前綴(參見[這裏](http://stackoverflow.com/questions/11620151/what-do-numbers-starting-with-0-mean-in-python)),但3.x不會將此表單識別爲有效(它將使用'0o'作爲八進制)。 – Delioth

回答

1

這是你的IntVar。我不知道這是一個錯誤還是向後兼容,但IntVar.get()會爲您進行類型轉換。在Python 2中,前綴爲0的數字將以八進制解釋(即010等於8)。你設定的值很好,但當它試圖get()"08"時會爆炸。

通過代碼搜索,問題源於實際的Tcl解釋器,因爲get()方法作爲globalgetvar()被髮送到Tcl解釋器,並且從那裏它甚至不被Python解釋。實際上,它甚至不是一個bug,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 
+0

感謝您的解釋,它真的幫助。我修改了一些代碼,使其更易於理解,但並未改變它的工作方式。我也遇到了一些錯誤,所以將str(int)更改爲2個不同的命令,因爲在將它與一個整數比較之前將其設置爲一個字符串不起作用,所以如果它滿足條件,我將它轉換爲一個字符串,謝謝! – simons21

相關問題