关于封装后tkink界面不显示的问题

问题背景:

尝试建一个GUI计算器,所以尝试了封装.封装之前,实现了t_in - t_out 为结论。封装之后,直接tk界面不显示了。
以下为run.py

from tkinter import *
from tkinter import ttk 
from settings import Settings
from value import calc
root = Tk()
cal_settings = Settings()
root.title(cal_settings.title)
root.geometry(cal_settings.geometry)
root.configure(bg="#484848")

runner = calc(root)

root.mainloop()

value.py

from tkinter import *

class calc(object):
    def __init__(self, root):
         super(calc, self).__init__()
         self.root = root
         self.inEntry = Entry(self.root,width=5,relief="groove")
         self.inEntry.grid(row=0,column=0,padx=20,pady=20)
         self.outEntry = Entry(self.root,width=5,relief="groove")
         self.outEntry.grid(row=1,column=0,padx=20,pady=20)
         self.res_calc()

    def delta_t_calc(self):    
        self.t_in = float(self.inEntry.get())    
        self.t_out = float(self.outEntry.get())
        self.delta_t = self.t_in - self.t_out
        return print(self.delta_t)

    def res_calc(self):
        self.res = Button(self.root,text='calculate \n now',
            command=self.delta_t_calc(),relief="groove",bg="#393939",fg="white")
        self.res.grid(row=2,column=0) 

运行结果及报错
Traceback (most recent call last):
  File "/home/sharon/Heat Loss Calculator/run.py", line 12, in 
    runner = calc(root)
  File "/home/sharon/Heat Loss Calculator/value.py", line 11, in __init__
    self.res_calc()
  File "/home/sharon/Heat Loss Calculator/value.py", line 21, in res_calc
    command=self.delta_t_calc(),relief="groove",bg="#393939",fg="white")
  File "/home/sharon/Heat Loss Calculator/value.py", line 14, in delta_t_calc
    self.t_in = float(self.inEntry.get())    
ValueError: could not convert string to float: ''
[Finished in 294ms]
我的尝试方法

把导致运算运行的button单独拿出来,具体不知道

我想达到的结果

请问如何才能达到封装之前一样的效果呢?

在res_calc()函数中,您将函数delta_t_calc()作为参数传递给Button对象的command属性。但是,在实际上调用delta_t_calc()函数时,您需要在它后面加上括号,例如:

command=self.delta_t_calc

改为

command=self.delta_t_calc()

这样做会立即调用delta_t_calc函数,并将其返回值传递给command属性,而不是函数本身。

为了解决这个问题,您可以将delta_t_calc函数更改为一个闭包或lambda函数,例如:

self.res = Button(self.root,text='calculate \n now',
            command=lambda: self.delta_t_calc(),relief="groove",bg="#393939",fg="white")


这样按钮就能在点击时调用delta_t_calc函数了

跟封装没多大关系~错误原因是你试图将空字符串转换成小数
先对float 括号里的值 self.t_in = float(self.inEntry.get()) 进行空值处理

根据你提供的错误日志中的信息,提示你的代码存在问题,具体位置为delta_t_cal方法里面的self.t_in=float....这里以及下面这行,这两行应该做一个空值判断,因为float方法里面的参数不能为空字符串,否则就会抱你这个错误,你可以在这两行每行之前加判断:

if(self.inEntry.get()):
    self.t_in=float(self.inEntry.get())
.......下面这行也要判断,你自己写下

您的错误不是因为封装,是因为尝试将空字符串化成浮点型
代码修改如下 (简单省事版):

def delta_t_calc(self):    
        try:
            self.t_in = float(self.inEntry.get())    
            self.t_out = float(self.outEntry.get())
        except:
            return 0
        self.delta_t = self.t_in - self.t_out
        return print(self.delta_t)
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632