dishan 发表于 2021-12-10 17:20:02

tkinter的StringVar() 计算的问题。

诸位:
我要做一个图面显示程序:

       一共三个Entry,前两个输入数量和价格,将总价自动显示在第三个Entery里
        要用到变量,所以三个Entry都定义了一个StringVar()
      我设计了Callback函数,只要第一个StrintVar动,就执行这个函数。开始运算。


但为什么我的程序出现TypeError: can't multiply sequence by non-int of type 'str' 报错呢?

def callback(*args):
   
    #执行这个函数后,将evar1得到的数和evar2得到得数相乘,再evar3.set设置一下。
    evar3.set(evar1.get()*evar2.get())


lab1=Label(root,text='成本').grid(row=0,column=0)
evar1=StringVar()
e1=Entry(root,textvariable=evar1,bg='lightblue')
e1.grid(row=1,column=1,padx=5,pady=5)
evar1.trace('w',callback)       #e1这个Entry有输入,就执行这个函数

lab2=Label(root,text='数量').grid(row=0,column=2)
evar2=StringVar()
e2=Entry(root,textvariable=evar2,bg='lightblue')
e2.grid(row=1,column=2,padx=5,pady=5)

lab3=Label(root,text='总价').grid(row=0,column=3)
evar3=StringVar()
e3=Entry(root,textvariable=evar3,bg='lightblue')
e3.grid(row=1,column=3,padx=5,pady=5)


root.mainloop()

dishan 发表于 2021-12-10 17:21:04

from tkinter import *
root=Tk()
root.geometry('500x200')

def callback(*args):

    #执行这个函数后,将evar1得到的数和evar2得到得数相乘,再evar3.set设置一下。
    evar3.set(int(evar1.get())*int(evar2.get()))
    #将函数部分用int转化了下,但报错变成了:ValueError: invalid literal for int() with base 10: ''


lab1=Label(root,text='成本').grid(row=0,column=0)
evar1=StringVar()
e1=Entry(root,textvariable=evar1,bg='lightblue')
e1.grid(row=1,column=1,padx=5,pady=5)
evar1.trace('w',callback)       #e1这个Entry有输入,就执行这个函数

lab2=Label(root,text='数量').grid(row=0,column=2)
evar2=StringVar()
e2=Entry(root,textvariable=evar2,bg='lightblue')
e2.grid(row=1,column=2,padx=5,pady=5)

lab3=Label(root,text='总价').grid(row=0,column=3)
evar3=StringVar()
e3=Entry(root,textvariable=evar3,bg='lightblue')
e3.grid(row=1,column=3,padx=5,pady=5)


root.mainloop()

傻眼貓咪 发表于 2021-12-10 18:31:59

为什么不加多一个按钮?

傻眼貓咪 发表于 2021-12-10 18:33:15

我帮你重新编写了:(多了个按钮功能)from tkinter import *

root = Tk()
costLabel = Label(root, text = "成本").grid(row = 0, column = 0)
qtyLabel = Label(root, text = "数量").grid(row = 0, column = 1)
totalLabel = Label(root, text = "总价").grid(row = 0, column = 2)

costBox = Entry(root, width = 30, bg = '#00ffff', borderwidth = 5)
costBox.grid(row = 1, column = 0, padx = 5, pady = 5)

qtyBox = Entry(root, width = 30, bg = '#00ffff', borderwidth = 5)
qtyBox.grid(row = 1, column = 1, padx = 5, pady = 5)

totalBox = Entry(root, width = 30, bg = '#00ffff', borderwidth = 5)
totalBox.grid(row = 1, column = 2, padx = 5, pady = 5)

def calculate():
    x = int(costBox.get())
    y = int(qtyBox.get())
    totalBox.delete(0, END)
    totalBox.insert(0, f"{x*y: .2f} 元")

buttonEnter = Button(root, text = "确定", padx = 40, pady = 20, command = lambda: calculate())
buttonEnter.grid(row = 2, column = 2, padx = 5, pady = 5)

root.mainloop()

阿奇_o 发表于 2021-12-10 19:19:24

小程序的话,也简单,循环调用自动计算就行了,如:
from tkinter import *

root = Tk()
costLabel = Label(root, text = "成本").grid(row = 0, column = 0)
qtyLabel = Label(root, text = "数量").grid(row = 0, column = 1)
totalLabel = Label(root, text = "总价").grid(row = 0, column = 2)

costBox = Entry(root, borderwidth = 2)
costBox.grid(row = 1, column = 0, padx = 5, pady = 5)

qtyBox = Entry(root, borderwidth = 2)
qtyBox.grid(row = 1, column = 1, padx = 5, pady = 5)

totalBox = Entry(root,borderwidth = 2)
totalBox.grid(row = 1, column = 2, padx = 5, pady = 5)

def auto_calculate():
    x = int(costBox.get()) if costBox.get() != '' else 0
    y = int(qtyBox.get()) if qtyBox.get() != '' else 0
    totalBox.delete(0, END)
    totalBox.insert(0, f"{x*y: .2f} 元")

    root.after(500, auto_calculate)# 每500毫秒进行自动计算
    # 注:小程序可以就这样就行了。较大程序需要另外的处理。

auto_calculate()

root.mainloop()

dishan 发表于 2021-12-10 20:36:08

阿奇_o 发表于 2021-12-10 19:19
小程序的话,也简单,循环调用自动计算就行了,如:


我要做一个21行的类似的表,要从数据库mysql中调数据,并且展示的页面也要用到运算.
这个能帮我解答一些思路吗?付-费-都可以。
我见您以前也回答过我的问题。

阿奇_o 发表于 2021-12-10 22:21:31

dishan 发表于 2021-12-10 20:36
我要做一个21行的类似的表,要从数据库mysql中调数据,并且展示的页面也要用到运算.
这个能帮我解答一 ...

可以加我Q:3130137034
页: [1]
查看完整版本: tkinter的StringVar() 计算的问题。