鱼C论坛

 找回密码
 立即注册
查看: 882|回复: 6

[已解决]tinter实现计算器自动清空功能不能实现!

[复制链接]
发表于 2019-9-28 16:41:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 dequantianhe 于 2019-9-28 18:00 编辑

各位大神,小弟刚刚看到tinter部分,想写个简单的计算器练练手,拓展个功能就是第一次计算完毕后,通过点击按钮实现清空输入框和输出框中的内容,然后支持二次计算,但代码写完,点击清空后总是没反应,不清楚具体问题在哪里,请大神指点,不胜感激!

补充一下:
已有大神给了回复,把clear()函数部分改写:
def clear():
        v1.set("")
        v2.set("")
        v3.set("")
        v4.set("")

这个方式我试了一下,的确可以把输入框清空,但再次输入时输入内容不再受初始限制条件限制(随便输什么都行,字符串之类的),所以这个结果还不是预想的。
再有,我看小甲鱼在课堂上是可以通过delete语句进行清空的,为什么这里就不行了呢?希望有了解的大神指点一下,谢谢!

具体代码如下:

#coding:utf-8
from tkinter import *


root = Tk()

def calc():
        if v2.get()=='+':
                res=int(v1.get())+int(v3.get())
        elif v2.get()=='-':
                res=int(v1.get())-int(v3.get())
        elif v2.get()=='*':
                res=int(v1.get())*int(v3.get())
        elif v2.get()=='/':
                res=int(v1.get())/int(v3.get())
        v4.set(str(res))
       
def test(con):
        return con.isdigit()

def tast(con):
        if con in ['+','-','*','/']:
                return True
        else:
                return False

def clear():
        x1.delete(0,END)
        xx.delete(0,END)
        x2.delete(0,END)
        x3.delete(0,END)
        return False

testcmd=root.register(test)
tastcmd=root.register(tast)

v1=StringVar()
v2=StringVar()
v3=StringVar()
v4=StringVar()

frame=Frame(root)
frame.pack(padx=10,pady=10)

x1=Entry(frame,width=10,textvariable=v1,validate='key',\
        validatecommand=(testcmd,'%P'))
x1.pack(padx=10,pady=5)

xx=Entry(frame,width=5,textvariable=v2,validate='key',\
        validatecommand=(tastcmd,'%P'))
xx.pack(padx=25,pady=5)

x2=Entry(frame,width=10,textvariable=v3,validate='key',\
        validatecommand=(testcmd,'%P'))
x2.pack(padx=40,pady=5)

fuhao=Label(frame,text="=",width=1)
fuhao.pack(padx=55,pady=5)

x3=Entry(frame,width=10,textvariable=v4,state='readonly')
x3.pack(padx=60,pady=5)

begin=Button(frame,text='开始计算',width=10,command=calc)
begin.pack(padx=10,pady=10)

qingkong=Button(frame,text='清空',width=10,command=clear)
qingkong.pack(padx=30,pady=10)

tuichu=Button(frame,text='退出',width=5,command=root.quit)
tuichu.pack(padx=50,pady=10)

mainloop()
最佳答案
2019-9-28 16:52:24
帮你改了一下:
# coding:utf-8
from tkinter import *

root = Tk()


def calc():
    if v2.get() == '+':
        res = int(v1.get()) + int(v3.get())
    elif v2.get() == '-':
        res = int(v1.get()) - int(v3.get())
    elif v2.get() == '*':
        res = int(v1.get()) * int(v3.get())
    elif v2.get() == '/':
        res = int(v1.get()) / int(v3.get())
    v4.set(str(res))


def test(con):
    return con.isdigit()


def tast(con):
    if con in ['+', '-', '*', '/']:
        return True
    else:
        return False


def clear():
    v1.set("")
    v2.set("")
    v3.set("")
    v4.set("")


testcmd = root.register(test)
tastcmd = root.register(tast)

v1 = StringVar()
v2 = StringVar()
v3 = StringVar()
v4 = StringVar()

frame = Frame(root)
frame.pack(padx=10, pady=10)

x1 = Entry(frame, width=10, textvariable=v1, validate='key', \
           validatecommand=(testcmd, '%P'))
x1.pack(padx=10, pady=5)

xx = Entry(frame, width=5, textvariable=v2, validate='key', \
           validatecommand=(tastcmd, '%P'))
xx.pack(padx=25, pady=5)

x2 = Entry(frame, width=10, textvariable=v3, validate='key', \
           validatecommand=(testcmd, '%P'))
x2.pack(padx=40, pady=5)

fuhao = Label(frame, text="=", width=1)
fuhao.pack(padx=55, pady=5)

x3 = Entry(frame, width=10, textvariable=v4, state='readonly')
x3.pack(padx=60, pady=5)

begin = Button(frame, text='开始计算', width=10, command=calc)
begin.pack(padx=10, pady=10)

qingkong = Button(frame, text='清空', width=10, command=clear)
qingkong.pack(padx=30, pady=10)

tuichu = Button(frame, text='退出', width=5, command=root.quit)
tuichu.pack(padx=50, pady=10)

mainloop()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-28 16:52:24 | 显示全部楼层    本楼为最佳答案   
帮你改了一下:
# coding:utf-8
from tkinter import *

root = Tk()


def calc():
    if v2.get() == '+':
        res = int(v1.get()) + int(v3.get())
    elif v2.get() == '-':
        res = int(v1.get()) - int(v3.get())
    elif v2.get() == '*':
        res = int(v1.get()) * int(v3.get())
    elif v2.get() == '/':
        res = int(v1.get()) / int(v3.get())
    v4.set(str(res))


def test(con):
    return con.isdigit()


def tast(con):
    if con in ['+', '-', '*', '/']:
        return True
    else:
        return False


def clear():
    v1.set("")
    v2.set("")
    v3.set("")
    v4.set("")


testcmd = root.register(test)
tastcmd = root.register(tast)

v1 = StringVar()
v2 = StringVar()
v3 = StringVar()
v4 = StringVar()

frame = Frame(root)
frame.pack(padx=10, pady=10)

x1 = Entry(frame, width=10, textvariable=v1, validate='key', \
           validatecommand=(testcmd, '%P'))
x1.pack(padx=10, pady=5)

xx = Entry(frame, width=5, textvariable=v2, validate='key', \
           validatecommand=(tastcmd, '%P'))
xx.pack(padx=25, pady=5)

x2 = Entry(frame, width=10, textvariable=v3, validate='key', \
           validatecommand=(testcmd, '%P'))
x2.pack(padx=40, pady=5)

fuhao = Label(frame, text="=", width=1)
fuhao.pack(padx=55, pady=5)

x3 = Entry(frame, width=10, textvariable=v4, state='readonly')
x3.pack(padx=60, pady=5)

begin = Button(frame, text='开始计算', width=10, command=calc)
begin.pack(padx=10, pady=10)

qingkong = Button(frame, text='清空', width=10, command=clear)
qingkong.pack(padx=30, pady=10)

tuichu = Button(frame, text='退出', width=5, command=root.quit)
tuichu.pack(padx=50, pady=10)

mainloop()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-28 17:04:02 | 显示全部楼层
zltzlt 发表于 2019-9-28 16:52
帮你改了一下:

我刚想出来,发现你已经发了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-28 17:24:35 | 显示全部楼层
永恒的蓝色梦想 发表于 2019-9-28 17:04
我刚想出来,发现你已经发了

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-28 17:42:29 | 显示全部楼层
zltzlt 发表于 2019-9-28 16:52
帮你改了一下:

多谢大神,不过我还是不大明白,小甲鱼在课程上可以通过delete语句删除值,为啥这里就不行了呢?
刚才我尝试了一下您的答案,的确可以起到清空的作用,不过还存在一个问题就是清空后再次输入值的时候,数据框的内容不再受到初始设置的类型限制,这个情况很奇怪。
大神能给大概解释下么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-28 17:43:22 | 显示全部楼层
dequantianhe 发表于 2019-9-28 17:42
多谢大神,不过我还是不大明白,小甲鱼在课程上可以通过delete语句删除值,为啥这里就不行了呢?
刚才我 ...

这我就不知道了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-28 17:53:51 | 显示全部楼层
你得想你要把数字放进去计算,int('')会是什么鬼,为了确保你能输入整数,我就给你清空置0了,又因为你符号不好随便设置一个,就把空给写上去了
# coding:utf-8
from tkinter import *

root = Tk()


def calc():
    if v2.get() == '+':
        res = int(v1.get()) + int(v3.get())
    elif v2.get() == '-':
        res = int(v1.get()) - int(v3.get())
    elif v2.get() == '*':
        res = int(v1.get()) * int(v3.get())
    elif v2.get() == '/':
        res = int(v1.get()) / int(v3.get())
    v4.set(str(res))


def test(con):
    return con.isdigit()


def tast(con):
    if con in ['+', '-', '*', '/','']:
        return True
    else:
        return False


def clear():
    v1.set("0")
    v2.set("")
    v3.set("0")
    v4.set("0")


testcmd = root.register(test)
tastcmd = root.register(tast)

v1 = StringVar()
v2 = StringVar()
v3 = StringVar()
v4 = StringVar()

frame = Frame(root)
frame.pack(padx=10, pady=10)

x1 = Entry(frame, width=10, textvariable=v1, validate='key', \
           validatecommand=(testcmd, '%P'))
x1.pack(padx=10, pady=5)

xx = Entry(frame, width=5, textvariable=v2, validate='key', \
           validatecommand=(tastcmd, '%P'))
xx.pack(padx=25, pady=5)

x2 = Entry(frame, width=10, textvariable=v3, validate='key', \
           validatecommand=(testcmd, '%P'))
x2.pack(padx=40, pady=5)

fuhao = Label(frame, text="=", width=1)
fuhao.pack(padx=55, pady=5)

x3 = Entry(frame, width=10, textvariable=v4, state='readonly')
x3.pack(padx=60, pady=5)

begin = Button(frame, text='开始计算', width=10, command=calc)
begin.pack(padx=10, pady=10)

qingkong = Button(frame, text='清空', width=10, command=clear)
qingkong.pack(padx=30, pady=10)

tuichu = Button(frame, text='退出', width=5, command=root.quit)
tuichu.pack(padx=50, pady=10)

mainloop()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-15 11:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表