Alexyoung 发表于 2020-8-2 22:15:02

上一主题 下一主题Tkinter中如何实现动态添加Entry,同时可知哪个Entry被修改

第一次发帖,不太知道规矩,自学小马甲和其他人的课程半年,目前正在用Tkinter编写一个小程序,遇到一个问题,我尽量说明的非常清楚,希望可以尽快得到大神指点。



这是一个输入多个信息然后得到计算结果的程序,通过加减按钮可以实现增加和删除行。
添加Entry实际我已经实现了,代码如下:
            def NewMetalPart():

                global num, rownum, ConfirmButton, v1, v2, v3, v4, v5, a, b, c, d, e, AddButton, BasisPrice, Weight, Utilization, Manufacturing, Profit, Update, Test
                rownum += 1

                v1 = StringVar()    #5个可变字符串,对应下面基价,重量,利用率,费率,三项费用
                v2 = StringVar()
                v3 = StringVar()
                v4 = StringVar()
                v5 = StringVar()

                NumberText = Label(self.Frame2, text=num)   #最左边的序号框
                NumberText.grid(row=rownum)

                BasisPriceText = Label(self.Frame2, text='原材料基价', width=8, height=1)      #基价框
                BasisPriceText.grid(row=rownum, column=1)
                BasisPrice = Entry(self.Frame2, textvariable=v1, width=8, validate="focusout", validatecommand=BasisPriceTest, invalidcommand=BasisPriceUpdate)
                BasisPrice.widgetName = str(rownum)
                BasisPrice.grid(row=rownum, column=2)


                WeightText = Label(self.Frame2, text='零件重量', width=8, height=1)   #重量框
                WeightText.grid(row=rownum, column=3)
                Weight = Entry(self.Frame2, textvariable=v2, width=8, validate="focusout", validatecommand=WeightTest, invalidcommand=WeightUpdate)
                Weight.widgetName = str(rownum)
                Weight.grid(row=rownum, column=4)

                UtilizationText = Label(self.Frame2, text='材料利用率', width=8, height=1)       #利用率框
                UtilizationText.grid(row=rownum, column=5)
                Utilization = Entry(self.Frame2, textvariable=v3, width=8, validate="focusout", validatecommand=UtilizationTest, invalidcommand=UtilizationUpdate)
                Utilization.grid(row=rownum, column=6)

                ManufacturingText = Label(self.Frame2, text='制造费率', width=8, height=1)      #制造费率框
                ManufacturingText.grid(row=rownum, column=7)
                Manufacturing = Entry(self.Frame2, textvariable=v4, width=8, validate="focusout", validatecommand=ManufacturingTest, invalidcommand=ManufacturingUpdate)
                Manufacturing.widgetName = str(rownum)
                Manufacturing.grid(row=rownum, column=8)

                ProfitText = Label(self.Frame2, text='三项费用', width=8, height=1)   #三项费用框
                ProfitText.grid(row=rownum, column=9)
                Profit = Entry(self.Frame2, textvariable=v5, width=8, validate="focusout", validatecommand=ProfitTest, invalidcommand=ProfitUpdate)
                Profit.widgetName = str(rownum)
                Profit.grid(row=rownum, column=10)

                AddButton = Button(self.Frame2, text='+', width=1, command=AddPart)   #加行按钮,绑定了AddPart方法
                AddButton.grid(row=rownum, column=13)

                DelButton = Button(self.Frame2, text='-', width=1, command=DelPart)   #删除按钮,绑定了DelPart方法
                DelButton.widgetName = str(rownum)
                DelButton.grid(row=rownum, column=12)
                num += 1

            NewMetalPart()
            #相当于在最顶上选择这是金属零件,就进入上面的NewMetalPart方法里面执行一遍

            ButtonRowNum = rownum + 1                                                                   #最下面的确定按钮,绑定了Total方法
            ConfirmButton = Button(self.Frame2, text='确定', width=8, height=1, command=Total)
            ConfirmButton.grid(row=ButtonRowNum, columnspan=12)

增加行的方法 AddPart的代码如下:
            def AddPart():
                global ButtonRowNum, ConfirmButton, AddButton

                Calculate()

                AddButton.destroy()
                DelButton = Button(self.Frame2, text='-', width=1, command=DelPart)
                DelButton.grid(row=rownum, column=12)

                ButtonRowNum += 1
                ConfirmButton.destroy()
                ConfirmButton = Button(self.Frame2, text='确定', width=8, height=1, command=Total)
                ConfirmButton.grid(row=ButtonRowNum, columnspan=12)

                NewMetalPart()

实际就是把最初的代码又运行一遍,添加一行新的。

如果正常运行,每一行的5个数据我都保存到对应的字典里面,用行数命名key,然后计算各自每个零件的价格和总体的价格。

我目前的问题是,假如现在我已经有了3行数据,我要更新第2行的基价,因为基价的Entry名字都叫BasisPrice,故更新后的Entry里面的数据对应不到第2个零件上。

而且由于添加的行数也是未知的,我没办法在命名上进行区分。

这个问题已经困扰我好多天了,借此想问一下各位大神有何高招,我觉得是我的添加新行的方法有问题,导致这个问题无解,如果有添加新行的方法的话也还请赐教。

十分感谢!

panchuangye 发表于 2020-8-3 00:49:40

个人觉得你添加的每一行再添加后一行数据之后前面的数据就写死了,我之前也想做一个类似于你这样的后来我想到的方法就是数据单独存储,因为我的数据不多所以我选择了json来存储,每次加载的时候读取json数量然后根据json中的数据来添加对应的行数和数据,修改的每行的时候也是先将整个json数据先赋值到一个临时变量上修改以后再重新写入的,不知道我表述是你能不能看明白,还有一种方法就是我写了django利用网页来记录数据,这样后台数据保存在了数据库当中,方便添加和修改。个人觉得django比较好实现,希望可以帮到你。

Alexyoung 发表于 2020-8-3 11:33:07

panchuangye 发表于 2020-8-3 00:49
个人觉得你添加的每一行再添加后一行数据之后前面的数据就写死了,我之前也想做一个类似于你这样的后来我想 ...

实在太感谢了!没想到真的有人能看我的问题,感谢感谢。django和json我还没有学就开始写了,那我下一步先把这两块知识学了吧,谢谢指点~

panchuangye 发表于 2020-8-3 17:09:12

Alexyoung 发表于 2020-8-3 11:33
实在太感谢了!没想到真的有人能看我的问题,感谢感谢。django和json我还没有学就开始写了,那我下一步先 ...

我也是小白一个,也是自己慢慢摸索。加油加油!
页: [1]
查看完整版本: 上一主题 下一主题Tkinter中如何实现动态添加Entry,同时可知哪个Entry被修改