翟小麦 2023-01-22 01:18 采纳率: 75%
浏览 36
已结题

关于封装后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 <module>
    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单独拿出来,具体不知道

我想达到的结果

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

  • 写回答

5条回答 默认 最新

  • heart_6662 2023-01-22 12:00
    关注

    在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函数了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 1月30日
  • 已采纳回答 1月22日
  • 创建了问题 1月22日

悬赏问题

  • ¥15 乌班图ip地址配置及远程SSH
  • ¥15 怎么让点阵屏显示静态爱心,用keiluVision5写出让点阵屏显示静态爱心的代码,越快越好
  • ¥15 PSPICE制作一个加法器
  • ¥15 javaweb项目无法正常跳转
  • ¥15 VMBox虚拟机无法访问
  • ¥15 skd显示找不到头文件
  • ¥15 机器视觉中图片中长度与真实长度的关系
  • ¥15 fastreport table 怎么只让每页的最下面和最顶部有横线
  • ¥15 java 的protected权限 ,问题在注释里
  • ¥15 这个是哪里有问题啊?