Tkinter中字符串切片后Label不显示问题求助
问题分析与修复方案
首先,你代码里的核心问题出在这一行:
self.label1 = Label(root, textvariable=str(self.resultlabel1)[:5])
你把DoubleVar对象直接转成了字符串,得到的其实是类似<tkinter.DoubleVar object at 0x7f9b1c0b5d30>这样的对象描述,不是变量里存储的数值。而且textvariable参数要求传入的是Tkinter的变量类型(比如StringVar、DoubleVar),不能是普通字符串——这就是Label无法正常显示的根本原因。
另外,你需要让Label始终显示3位小数,并且随输入和选项变化自动更新,我们可以通过给DoubleVar添加追踪回调,配合字符串格式化来实现。
具体修复步骤
- 放弃直接把对象转字符串的错误写法,改用
StringVar存储格式化后的结果,或者直接更新Label的text属性 - 给
resultlabel1添加trace监听,当它的值变化时,自动格式化并更新Label的显示 - 使用
"{:.3f}".format()确保输出始终是3位小数,哪怕末尾是0也会保留
修改后的关键代码片段
这里推荐用StringVar绑定textvariable的方式,更贴合Tkinter的变量绑定逻辑:
# 初始化用于存储格式化结果的StringVar self.result_str1 = StringVar() self.result_str1.set("{:.3f}".format(self.resultlabel1.get())) # 用这个StringVar绑定Label的textvariable self.label1 = Label(root, textvariable=self.result_str1, relief='sunken') self.label1.grid(row=2, column=3, columnspan=1, sticky='WE') # 给resultlabel1添加追踪回调,值变化时自动更新格式化后的字符串 def update_label1(*args): value = self.resultlabel1.get() self.result_str1.set("{:.3f}".format(value)) self.resultlabel1.trace('w', update_label1)
完整修复后的代码
from tkinter import * from decimal import * class App(Frame): def __init__(self, root=None): Frame.__init__(self, root) self.materialPrice = {'Brick': 70, 'Rockwool': 50, 'Concrete': 20} materialvariable1 = StringVar(self, root) materialvariable1.set("Choose material") materialvariable2 = StringVar(self, root) materialvariable2.set("Choose materiale") self.w1 = OptionMenu(root, materialvariable1, *self.materialPrice, command=self.displayPrice) self.w1.grid(row=2, column=0, columnspan=1, sticky='WE') self.w2 = OptionMenu(root, materialvariable2, *self.materialPrice, command=self.displayPrice2) self.w2.grid(row=3, column=0, columnspan=1, sticky='WE') # -------------------------------------------------------------------------------------------------------------------- self.var = DoubleVar() self.var.set(Decimal("0.100")) self.var2 = DoubleVar() self.var2.set(Decimal("0.200")) self.entry1 = Entry(root, textvariable=self.var) self.entry1.grid(row=2, column=1) self.entry2 = Entry(root, textvariable=self.var2) self.entry2.grid(row=3, column=1) # -------------------------------------------------------------------------------------------------------------------- self.priceVarLabel1 = DoubleVar() self.priceVarLabel1.set(float(0.00)) self.priceVarLabel2 = DoubleVar() self.priceVarLabel2.set(float(0.00)) self.priceVarValue1 = Label(root, textvariable=self.priceVarLabel1, relief='sunken') self.priceVarValue1.grid(row=2, column=2, columnspan=1, sticky='WE') self.priceVarValue2 = Label(root, textvariable=self.priceVarLabel2, relief='sunken') self.priceVarValue2.grid(row=3, column=2, columnspan=1, sticky='WE') self.resultlabel1 = DoubleVar() self.resultlabel1.set(float(0.000)) self.resultlabel2 = DoubleVar() self.resultlabel2.set(float(0.00)) # 修复label1的显示逻辑 self.result_str1 = StringVar() self.result_str1.set("{:.3f}".format(self.resultlabel1.get())) self.label1 = Label(root, textvariable=self.result_str1, relief='sunken') self.label1.grid(row=2, column=3, columnspan=1, sticky='WE') # 追踪resultlabel1的变化,自动更新显示 def update_label1(*args): value = self.resultlabel1.get() self.result_str1.set("{:.3f}".format(value)) self.resultlabel1.trace('w', update_label1) # 如果需要label2也显示三位小数,用同样的方法处理即可 self.result_str2 = StringVar() self.result_str2.set("{:.3f}".format(self.resultlabel2.get())) self.label2 = Label(root, textvariable=self.result_str2, relief='sunken') self.label2.grid(row=3, column=3, columnspan=1, sticky='WE') def update_label2(*args): value = self.resultlabel2.get() self.result_str2.set("{:.3f}".format(value)) self.resultlabel2.trace('w', update_label2) # -------------------------------------------------------------------------------------------------------------------- self.resultSumNew = DoubleVar() self.resultSumNew.set(Decimal("0.000")) self.labelSum = Label(root, textvariable=self.resultSumNew) self.labelSum.grid(row=4, column=1, columnspan=1, sticky='WE') def set_label(name, index, mode): self.resultSumNew.set(self.var.get() + self.var2.get()) self.var.trace('w', set_label) self.var2.trace('w', set_label) # -------------------------------------------------------------------------------------------------------------------- def displayPrice(self, value): self.resultlabel1.set(self.var.get() / self.materialPrice[value]) self.priceVarLabel1.set(self.materialPrice[value]) def displayPrice2(self, value): self.resultlabel2.set(self.var2.get() / self.materialPrice[value]) self.priceVarLabel2.set(self.materialPrice[value]) root = Tk() app = App(root) root.title("help") root.mainloop()
额外说明
"{:.3f}".format()会强制保留三位小数,比如数值是0.1会显示为0.100,完全符合你的需求trace('w', callback)会在变量被写入(值变化)时自动触发回调函数,确保Label实时同步更新- 代码里我顺便给
label2也加上了三位小数的处理,如果你不需要可以删掉对应部分
内容的提问来源于stack exchange,提问作者Math
相关产品推荐
相关产品推荐

