关于#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()

该回答引用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('该方程无解')

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

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^