Python 3中Tkinter Combobox转float时数值异常问题排查
问题描述
在Python 3中使用ttkbootstrap的Combobox时,选择列表中的元组项后,尝试将元组的最后一项转换为float类型出现数值异常:比如选择对应1.0的项时结果变成0.0,选择0.8的项时结果变成8.0,选择0.2的项时结果变成2.0。
问题代码
import tkinter from tkinter import SUNKEN import ttkbootstrap as ttk from ttkbootstrap.constants import * def handle_selection(event): print("In the handle_selection method!") selected_index = ti_combobox.current() print("selected_index is: ") print(selected_index) selected_tuple = ti_combobox.get() print("selected_tuple is: ") print(selected_tuple) selected_float = float(selected_tuple[-1]) # 此处转换出现数值异常 print("selected_float is: ") print(selected_float) window = ttk.Window(themename = 'superhero') window.title('Basic Tool') window.geometry('650x350') main_frame = ttk.Frame(window, relief=SUNKEN, borderwidth=1) main_frame.grid(row=0, column=0) base_finding_frame = tkinter.LabelFrame(main_frame, text='BASE', relief=SUNKEN, borderwidth=1) base_finding_frame.grid(row=4, column=0, sticky="news", padx=10, pady=15) base_label_ti = ttk.Label(base_finding_frame, text='(TI)', font=('Helvetica', 10)) base_label_ti.grid(row=0, column=0) string_var = ttk.StringVar() ti_values = [("Crit", "C", "1.0"), ("High", "H", "0.8"), ("Medium", "M", "0.3"), ("Low", "L", "0.2"), ("None", "N", "0.0"), ("Default", "D", "0.5"), ("Unknown", "UK", "0.4"), ("Not Applicable", "NA", "1.0")] ti_combobox = ttk.Combobox(base_finding_frame, bootstyle='primary', values=ti_values, state = 'readonly', textvariable= string_var) ti_combobox.grid(row=1, column=0) ti_combobox.bind("<<ComboboxSelected>>", handle_selection) # 运行GUI window.mainloop()
程序异常输出
In the handle_selection method! selected_index is: 0 selected_tuple is: Crit C 1.0 selected_float is: 0.0 (不符合预期,1.0变成了0.0!) In the handle_selection method! selected_index is: 1 selected_tuple is: High H 0.8 selected_float is: 8.0 In the handle_selection method! selected_index is: 3 selected_tuple is: Low L 0.2 selected_float is: 2.0
问题原因与解决方法
核心问题
ti_combobox.get()返回的不是原始元组,而是元组被自动转换后的字符串(比如"Crit C 1.0")。你用selected_tuple[-1]取的是这个字符串的最后一个字符:
- 对应"Crit C 1.0",最后一个字符是"0",转float得到0.0
- 对应"High H 0.8",最后一个字符是"8",转float得到8.0
- 对应"Low L 0.2",最后一个字符是"2",转float得到2.0
这就是数值异常的根本原因。
解决方法
方法一:通过索引直接取原始元组
利用ti_combobox.current()获取选中项的索引,直接从原始的ti_values列表中取出对应元组,再取最后一项转换:
def handle_selection(event): print("In the handle_selection method!") selected_index = ti_combobox.current() print("selected_index is: ") print(selected_index) # 直接从原始列表获取元组,而非从Combobox取字符串 selected_tuple = ti_values[selected_index] print("selected_tuple is: ") print(selected_tuple) selected_float = float(selected_tuple[-1]) print("selected_float is: ") print(selected_float)
方法二:分割字符串获取目标数值
如果不想依赖原始列表,可以将Combobox返回的字符串按空格分割,取最后一部分转换:
def handle_selection(event): print("In the handle_selection method!") selected_index = ti_combobox.current() print("selected_index is: ") print(selected_index) selected_str = ti_combobox.get() print("selected_str is: ") print(selected_str) # 按空格分割字符串,取最后一个元素 selected_float = float(selected_str.split()[-1]) print("selected_float is: ") print(selected_float)
关于原型程序正常的推测
你的原型程序可能是直接通过索引获取原始元组数据,而非从Combobox返回的字符串中截取,所以没有出现这个问题。
内容的提问来源于stack exchange,提问作者James-Jesse Drinkard
相关产品推荐
相关产品推荐

