LKLiug 2023-03-09 21:36 采纳率: 100%
浏览 21
已结题

关于#python#的问题:用tkinter做一个解一元二次方程窗口与的问题

大家好!我结合面向对象编程和tkinter写了一个解一元二次方程的程序。现在的错误是,在windows中最后得到的变量在被引入jiee方法中时一直出现'_tkinter.tkapp' object has no attribute 'i'的错误,由于是自学,时间也不是很长,始终找不到解决办法。希望有人可以帮忙解决一下,另外,我还想在其中加入一键清除和如果输入的内容不是数字时出现报错弹窗的功能,也恳请各位解答,感激不尽!
下面是我的代码:

from tkinter import *
import tkinter as tk
from tkinter import messagebox



class jie():

    def __init__(self,name):
        self.name=name

    def windows(self):
        #创建标签
        Label(self.name,text='二次系数:').place(x=10,y=10,width=50,height=30)
        Label(self.name,text='一次系数:').place(x=210,y=10,width=50,height=30)
        Label(self.name,text='常系数:').place(x=410,y=10,width=50,height=30)

        #创建输入文本框
        l=StringVar()
        k=StringVar()
        n=StringVar()
        d=Entry(self.name,textvariable=l)
        d.place(x=80,y=10,width=50,height=30)
        e=Entry(self.name,textvariable=k)
        e.place(x=280,y=10,width=50,height=30)
        f=Entry(self.name,textvariable=n)
        f.place(x=480,y=10,width=50,height=30)
        self.i=d.get()
        self.j=e.get()
        self.k=f.get()

        

        #创建输出文本框
        txt=Text(self.name)
        txt.place(x=10,y=100,width=580,height=320)
        txt.insert(0.0,'计算结果为:')
        #创建按钮
        Button(self.name,text='计算',command=jie.jiee(self.name)).place(x=210,y=50,width=120,height=30)    
    
    def jiee(self):
        a=self.i
        b=self.j
        c=self.k

        m=b**2-4*a*c
        if m>=0:
            x1=(-b+m**(1/2))/2*a
            x2=(-b-m**(1/2))/2*a
            self.name.txt.insert(12.0,x1)
            self.name.txt.insert(15.0,x2)
        else:
            self.name.txt.insert('该方程无解')


def start():
    #创建窗口并确定窗口位置与大小
    win=tk.Tk()
            #定义窗口宽度和高度
        
    win.title('一元二次函数的解')
    win.geometry('600x300')
   
    k=jie(win)
    print(k)
    k.windows()
    #设置循环
    win.mainloop()
start()

  • 写回答

2条回答 默认 最新

  • CodeBytes 2023-03-09 22:29
    关注

    该回答引用ChatGPT

    在你的代码中,错误发生在这里:

    Button(self.name,text='计算',command=jie.jiee(self.name)).place(x=210,y=50,width=120,height=30)
    
    

    在这里,你试图通过jie.jiee(self.name)方法直接调用jiee()方法。但是,在这里你需要指定一个可调用的对象,而不是调用函数。你可以使用lambda表达式将其包装在一个可调用的对象中:

    Button(self.name,text='计算',command=lambda: k.jiee()).place(x=210,y=50,width=120,height=30)
    
    

    此外,关于一键清除和输入非数字时的报错弹窗,你可以通过添加额外的按钮和适当的逻辑实现它们。例如,对于清除按钮,你可以在windows()方法中添加:

    
    
    def windows(self):
        # 创建标签...
        # 创建输入文本框...
    
        # 创建清除按钮
        def clear():
            d.delete(0, END)
            e.delete(0, END)
            f.delete(0, END)
            txt.delete(0.0, END)
    
        Button(self.name, text='清除', command=clear).place(x=350, y=50, width=120, height=30)
    
        # 创建计算按钮...
    
    

    对于输入非数字的报错弹窗,你可以在jiee()方法中添加逻辑来检查输入的文本是否为数字,并在必要时显示弹窗。例如:

    
    def jiee(self):
        a = self.i
        b = self.j
        c = self.k
    
        # 检查输入是否为数字
        try:
            a = float(a)
            b = float(b)
            c = float(c)
        except ValueError:
            messagebox.showerror('错误', '请输入数字')
            return
    
        m = b**2-4*a*c
        if m >= 0:
            x1 = (-b+m**(1/2))/2*a
            x2 = (-b-m**(1/2))/2*a
            self.name.txt.insert(12.0,x1)
            self.name.txt.insert(15.0,x2)
        else:
            self.name.txt.insert('该方程无解')
    
    

    这样,在用户输入非数字时,你会看到一个错误弹窗。

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

报告相同问题?

问题事件

  • 系统已结题 4月7日
  • 已采纳回答 3月30日
  • 创建了问题 3月9日

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境