tkinter--计算器

news/2024/7/5 7:00:51

刚开始学习tkinter,试着做了个计算器,记录一些常用的函数和使用方法。

from tkinter import * #导入tkinter库
import re

root =Tk() #给窗体
root.title('calculator') #设置窗体名字
root.geometry('290x427')
root.resizable(width=False, height=False) ###固定窗体大小

c_width=9
c_height=3

frm=Frame(root,bg='white') #新建框架
frm.pack(expand = YES,fill = BOTH) #放置框架
display=StringVar()
e=Entry(frm,textvariable=display,font=("宋体",30,"normal"),width=9) #添加输入框
e.grid(row=0,column=0,rowspan=2,columnspan=4,sticky=W+N+E) #放置输入框位置

def insert_plus():
    e.insert(INSERT, '+')
def insert_minus():
    e.insert(INSERT, '-')
def insert_multiply():
    str_value = display.get()
    if str_value != "":
        e.insert(INSERT, '*')
def insert_divide():
    str_value = display.get()
    if str_value != "":
        e.insert(INSERT, '/')
def insert_equal():
    e.insert(INSERT,'=')

Button(frm,text='CE',width=c_width,height=c_height,bg='white',command= lambda :del_one_str(display)).grid(row=2,column=0,sticky=W) #设置按钮,lambda为匿名函数
Button(frm,text='C ',width=c_width,height=c_height,bg='white',command= lambda :display.set('')).grid(row=2,column=1)
Button(frm,text='<-',width=c_width,height=c_height,command= lambda :del_one_chr(display)).grid(row=2,column=2)

Button(frm,text='%',width=c_width,height=c_height,bg='white',command= lambda :calc_percent(display)).grid(row=3,column=0,sticky=W)
Button(frm,text='(',width=c_width,height=c_height,bg='white',command= lambda :e.insert(INSERT,'(')).grid(row=3,column=1)
Button(frm,text=')',width=c_width,height=c_height,bg='white',command= lambda :e.insert(INSERT,')')).grid(row=3,column=2)

Button(frm,text='1',width=c_width,height=c_height,bg='yellow',command= lambda :e.insert(INSERT,'1')).grid(row=4,column=0,sticky=W)
Button(frm,text='2',width=c_width,height=c_height,bg='yellow',command= lambda :e.insert(INSERT,'2')).grid(row=4,column=1)
Button(frm,text='3',width=c_width,height=c_height,bg='yellow',command= lambda :e.insert(INSERT,'3')).grid(row=4,column=2)

Button(frm,text='4',width=c_width,height=c_height,bg='yellow',command= lambda :e.insert(INSERT,'4')).grid(row=5,column=0,sticky=W)
Button(frm,text='5',width=c_width,height=c_height,bg='yellow',command= lambda :e.insert(INSERT,'5')).grid(row=5,column=1)
Button(frm,text='6',width=c_width,height=c_height,bg='yellow',command= lambda :e.insert(INSERT,'6')).grid(row=5,column=2)

Button(frm,text='7',width=c_width,height=c_height,bg='yellow',command= lambda :e.insert(INSERT,'7')).grid(row=6,column=0,sticky=W)
Button(frm,text='8',width=c_width,height=c_height,bg='yellow',command= lambda :e.insert(INSERT,'8')).grid(row=6,column=1)
Button(frm,text='9',width=c_width,height=c_height,bg='yellow',command= lambda :e.insert(INSERT,'9')).grid(row=6,column=2)

Button(frm,text='±',width=c_width,height=c_height,bg='yellow',command= lambda :negative(display)).grid(row=7,column=0,sticky=W)
Button(frm,text='0 ',width=c_width,height=c_height,bg='yellow',command= lambda :e.insert(INSERT,'0')).grid(row=7,column=2)
Button(frm,text='. ',width=c_width,height=c_height,bg='yellow',command= lambda :e.insert(INSERT,'.')).grid(row=7,column=1)

Button(frm,text='+',width=c_width,height=c_height,bg='white',command=insert_plus).grid(row=2,column=3,sticky=E)
Button(frm,text='-',width=c_width,height=c_height,bg='white',command=insert_minus).grid(row=3,column=3,sticky=E)
Button(frm,text='*',width=c_width,height=c_height,bg='white',command=insert_multiply).grid(row=4,column=3,sticky=E)
Button(frm,text='/',width=c_width,height=c_height,bg='white',command=insert_divide).grid(row=5,column=3,sticky=E)
Button(frm,text='=',width=c_width,height=c_height,bg='white',command= lambda :cal(display)).grid(row=6,column=3,sticky=N+S,rowspan=2)

def cal(display):
    str_value = display.get()
    if str_value != "":
        try:
            if "%" in str_value:
                str_value_change=str_value.replace("%","/100")
                value_tmp = eval(str_value_change)
                value=value_tmp
                if len(str(value_tmp)) > 16:
                    value="%e" % value_tmp
            else:
                value_tmp = eval(str_value) #eval:计算字符串表达式
                value = value_tmp
                if len(str(value_tmp)) > 16:
                    value = "%e" % value_tmp
            display.set("")
            e.insert(INSERT, value)
        except:
            display.set('')
            e.insert(INSERT, "para error")

def negative(display):
    str_value=display.get()
    if str_value != "" and ('-' not in str_value) and ('+' not in str_value) and ('*' not in str_value) and ('/' not in str_value):
        value = eval(display.get()) * (-1)
        display.set('')
        e.insert(INSERT,str(value))
    elif str_value != "" and "-" == str_value[0] and ('-' not in str_value[1:-1]) and ('+' not in str_value[1:-1]) and ('*' not in str_value[1:-1]) and ('/' not in str_value[1:-1]):
        value = eval(display.get()) * (-1)
        display.set('')
        e.insert(INSERT, str(value))
    else:
        e.insert(INSERT, '-')

def calc_percent(display):
    str_value=display.get()
    if str_value != "" and ('-' not in str_value) and ('+' not in str_value) and ('*' not in str_value) and ('/' not in str_value):
        value = eval(display.get()) / (100)
        display.set('')
        e.insert(INSERT,str(value))
    elif str_value != "" and "-" == str_value[0] and ('-' not in str_value[1:-1]) and ('+' not in str_value[1:-1]) and ('*' not in str_value[1:-1]) and ('/' not in str_value[1:-1]):
        value = eval(display.get()) / (100)
        display.set('')
        e.insert(INSERT, str(value))
    else:
        e.insert(INSERT, '%')

def del_one_chr(display):
    str_value = display.get()
    if str_value != "":
        display.set('')
        if "para error" == str_value or "para error" in str_value:
            display.set('')
        else:
            value = str_value[0:-1]
            e.insert(INSERT, str(value))

def del_one_str(display):
    str_value = display.get()
    value = ""
    if str_value != "":
        str_value_arr = re.split(r"[\+\-\*\/]+", str_value)
        value=str_value[0:len(str_value) - len(str_value_arr[-1])]
    display.set('')
    e.insert(INSERT, str(value))

root.mainloop() #让程序一直循环

运行效果:



http://www.niftyadmin.cn/n/1774057.html

相关文章

no matching function for call to 'ListNode::ListNode()'

刷leedcode时编译报错 error: no matching function for call to ListNode:ListNode()错误原因为结构体ListNode的变量在使用前没有进行初始化操作 另外&#xff0c;结构体变量的指针在使用之前也需要初始化或赋值操作&#xff0c;将原来代码中的ListNode A&#xff0c;改为Li…

来,了解一下Java内存模型(JMM)

网上有很多关于Java内存模型的文章&#xff0c;在《深入理解Java虚拟机》和《Java并发编程的艺术》等书中也都有关于这个知识点的介绍。但是&#xff0c;很多人读完之后还是搞不清楚&#xff0c;甚至有的人说自己更懵了。本文&#xff0c;就来整体的介绍一下Java内存模型&#…

python_爬取【搜狗图片】

1.利用python抓取网站上的图片&#xff0c;对于学习python及对网页数据分析处理很有帮助&#xff0c;也可以学习一些web方面的知识&#xff0c;我尝试使用【搜狗图片】搜索到的图片作为抓取对象&#xff0c;抓取【搜狗图片】主页各个标题栏的图片&#xff0c;以及【其他】输入图…

[CQOI2005]三角形面积并

[CQOI2005]三角形面积并 题目大意&#xff1a; 求\(n(n\le100)\)个三角形的面积并。 思路&#xff1a; 自适应辛普森法&#xff0c;玄学卡精度可过。 源代码&#xff1a; #include<cmath> #include<cstdio> #include<cctype> #include<vector> #includ…

12月自我考核

.执行一条命令&#xff0c;直接添加用户zsh1-zsh20 for s in{1..20};do useradd zsh$s;done转载于:https://blog.51cto.com/13803911/2335807

怎样才能学好Python?

Python是一门简单优雅的计算机程序设计语言&#xff0c;相比于C语言、Java编程&#xff0c;Python无论是从语法结构&#xff0c;还是学习难易程度&#xff0c;更适合0基础人员学习&#xff0c;Python应用领域广阔&#xff0c;从云计算、大数据到人工智能&#xff0c;Python无处…

python_爬取【安居客房源信息】

最近在看房子&#xff0c;试着抓取了安居客上房源信息&#xff0c;供大家学习参考。 #-*- encodingUTF-8 -*- from urllib.request import urlopen from bs4 import BeautifulSoup import xlrd import xlwtcity"sz" ###城市缩写 html_sheet5 ###页面数 url&qu…

readwrite(输入输出流)【模板】

为什么会快 C中getchar的速度是比scanf快很多的 fread其实是输入中最快的 只不过不会用 然后输出自然也是putchar更胜一筹 fwrite也是输出中最快 只不过也不会用 Code&#xff1a; 注释版&#xff1a; #include<cstdio> #include<iostream> #include<algor…