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日

悬赏问题

  • ¥20 西门子S7-Graph,S7-300
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改