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()
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()
为什么不加多一个按钮? 我帮你重新编写了:(多了个按钮功能)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() 小程序的话,也简单,循环调用自动计算就行了,如:
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() 阿奇_o 发表于 2021-12-10 19:19
小程序的话,也简单,循环调用自动计算就行了,如:
我要做一个21行的类似的表,要从数据库mysql中调数据,并且展示的页面也要用到运算.
这个能帮我解答一些思路吗?付-费-都可以。
我见您以前也回答过我的问题。 dishan 发表于 2021-12-10 20:36
我要做一个21行的类似的表,要从数据库mysql中调数据,并且展示的页面也要用到运算.
这个能帮我解答一 ...
可以加我Q:3130137034
页:
[1]