用类和函数tkin连接多个条目

2024-09-30 05:31:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我用Python(tkinter)做了一个程序。当您单击“添加任务”按钮时,将创建新行。用户需要在“尺寸[m2]”和“总成本”条目中输入值,当他/她单击“求和值”按钮时,应在成本/m2下的输入框中插入值“总成本”/“尺寸[m2]”,以及成本/m2下所有值的总和(总和应在“answare”中)

我这样做是为了让它可以把输入框中输入的值加起来,但我不能做“总成本”/“尺寸[m2]”,并在成本/m2下插入答案,然后求和。我总是得到这样的错误:

CostSize=float(CostEntry.get())/float(SizeEntry.get())
NameError: name 'CostEntry' is not defined

我想要这个:

enter image description here

科斯蒂应该怎么做? 代码如下:

^{pr2}$

Tags: 用户程序gettkinter尺寸条目float按钮
2条回答

您应该将self属性与在本地范围外使用的变量一起使用。试试这个:

from tkinter import *
from tkinter import ttk

myApp = Tk()
myApp.title("APP")                         
myApp.geometry("1000x650")

frame1=LabelFrame(myApp,text=" Activities ")
frame1.grid(row=0,column=0,padx=5)

i=Label(frame1, text=" i ")
i.grid(row=0,column=1)

ProjectName=Label(frame1, text=" Project name ")
ProjectName.grid(row=0,column=2)

SizeLabel=Label(frame1, text="Size [m2]")
SizeLabel.grid(row=0,column=3)

TotalCostLabel=Label(frame1, text="Total Cost")
TotalCostLabel.grid(row=0,column=4)

CostSizeLabel=Label(frame1, text="Cost/m2")
CostSizeLabel.grid(row=0,column=5)

newrow=1
class AddNewTask(object):
    rowlist=[]

    def update_row_values(self):

        for i,entry in enumerate(self.rowlist):
            entry.delete(0, 'end')
            entry.insert(0,i+1)

    def addTask(self):

        def delete():
            try:
                sum = int(answerE.get())
                entry_value = int(prodEntry.get())
                new_sum = sum - entry_value
                answerE.delete(0, 'end')
                answerE.insert(0, sum)
            except ValueError:
                pass

            bdelete.destroy()
            iEntry.destroy()
            ProjectEntry.destroy()
            self.SizeEntry.destroy()   
            self.CostEntry.destroy()
            self.CostSizeEntry.destroy()

            self.rowlist.remove(iEntry)
            self.update_row_values()
            self.entrylist.remove(CostSizeEntry)


        global newrow
        newrow=newrow+1

        bdelete=Button(frame1,text="-",command=delete)
        bdelete.grid(row=newrow,column=0,sticky="E",padx=4)

        iEntry=Entry(frame1,width=3)
        self.rowlist.append(iEntry)     
        iEntry.grid(row=newrow,column=1,padx=1)
        n = len(self.rowlist)
        iEntry.insert(0,n)

        ProjectEntry=Entry(frame1,width=75)
        ProjectEntry.grid(row=newrow,column=2,padx=1)

        self.SizeEntry=Entry(frame1,width=10)
        self.SizeEntry.grid(row=newrow,column=3,padx=1)

        self.CostEntry=Entry(frame1,width=10)
        self.CostEntry.grid(row=newrow,column=4,padx=1)

        self.CostSizeEntry=Entry(frame1,width=10)
        self.CostSizeEntry.grid(row=newrow,column=5,padx=1)

        self.entrylist.append(self.CostSizeEntry)


    def __init__(self):

        buttonadd=Button(frame1,text="Add Task",command=self.addTask)
        buttonadd.grid(row=0,column=0,padx=3,pady=5)
        self.entrylist = []

        self.sumButton = Button(frame1, text="Sum Values", command=self.sumValues)
        self.sumButton.grid(row=0, column=7)


    def sumValues(self):

        try:                                
            CostSize=float(self.CostEntry.get())/float(self.SizeEntry.get())
            self.CostSizeEntry.insert(0,CostSize)
        except ValueError:
            pass

        sum = 0        
        for entry in AddNewTask.entrylist:
            try:
                sum += float(entry.get())
            except ValueError:
                pass

            answerE.delete(0, 'end')
            answerE.insert(0, sum)



AddNewTask=AddNewTask()


frame2=LabelFrame(myApp,text=" Answer")
frame2.grid(row=0,column=1,padx=5,sticky="N")

answerL=Label(frame2, text="Answer:  ")
answerL.grid(row=0,column=0)

answerE=Entry(frame2,width=10)
answerE.grid(row=0, column=1)

myApp.mainloop()

CostEntry变量是在类方法中创建的。但是,它是用局部作用域创建的。这意味着当方法结束时,对CostEntry的引用也会结束。下次调用该方法(销毁对象)时,它不存在。在

解决方案:使用self属性创建变量的实例。在

self.CostEntry=Entry(frame1,width=10)
self.CostEntry.grid(row=newrow,column=4,padx=1)

当你要删除它时:

^{pr2}$

相关问题 更多 >

    热门问题