0
点赞
收藏
分享

微信扫一扫

GUI 图形用户界面编程(十)-简单计算器页面

双井暮色 2022-02-09 阅读 66

前言 

 

代码实例 

from tkinter import *
from tkinter import messagebox
import random

class Application(Frame):

    def __init__(self, master=None):
        super().__init__(master)       
        self.master = master
        self.pack()
        self.createWidget()

    def createWidget(self):
        """通过grid布局实现计算器的界面"""
        btnText = (("MC","M+","M-","MR"),
                   ("C","±","/","✖️"),
                   (7,8,9,"-"),
                   (4,5,6,"+"),
                   (1,2,3,"="),
                   (0,"."))

        Entry(self).grid(row=0,column=0,columnspan=4,pady=10)

        for rindex,r in enumerate(btnText):
            for cindex,c in enumerate(r):
                if c == "=":
                    Button(self,text=c,width=2)\
                    .grid(row=rindex+1,column=cindex,rowspan=2,sticky=NSEW)
                elif c == 0:
                    Button(self,text=c,width=2)\
                    .grid(row=rindex+1,column=cindex,columnspan=2,sticky=NSEW)

                elif c == ".":
                    Button(self,text=c,width=2)\
                    .grid(row=rindex+1,column=cindex+1,sticky=NSEW)
                else:
                    Button(self,text=c,width=2)\
                    .grid(row=rindex+1,column=cindex,sticky=NSEW)

if __name__ == '__main__':
    root = Tk()
    root.geometry("200x200+200+300")
    app = Application(master=root)
    root.mainloop()

运行结果: 

 上述的只是一个框架,若要实现功能

计算器页面 

import tkinter
import tkinter.messagebox
import re

operators=('+','-','*','/','**','//')

def buttonClick(btn):
    val=contentVar.get()
    if val.startswith('.'):
        val='0'+val
    if btn in '0123456789':
        val+=btn
    elif btn=='.':
        t=re.split(r'[\+|-|\*|/]',val)[-1]
        if t in '.':
            tkinter.messagebox.showerror('Error', 'Digits format error!') 
            return
        else:
            val+=btn
    elif btn=='C':
        val=''
    elif btn=='=':
        try:
            val=str(eval(val))      #计算字符串表达式值
        except:
            tkinter.messagebox.showerror('Error','Expression error!')    
            return
    elif btn in operators:
        if val.endswith(operators):
            tkinter.messagebox.showerror('Error', 'Format error!')
            return
        val+=btn
    elif btn=='sqrt':
        n=val.split('.')
        if all(map(lambda x:x.isdigit(),n)):
            val=eval(val)**0.5
        else:
            tkinter.messagebox.showerror('Error','Expression error!')
            return
    contentVar.set(val)
    
root=tkinter.Tk()
root.geometry('300x300+500+100')
root.resizable(False, False)    
root.title('Calculator')

contentVar=tkinter.StringVar(root,'')
contentEntry=tkinter.Entry(root,textvariable=contentVar,bg='red')
contentEntry['state']='readonly'
contentEntry.place(x=10,y=10,width=280,height=50)

grids=['//','**','sqrt','C']+list('789+456-123*0./=')
t=0
for i in range(5):
    for j in range(4):
        btn=tkinter.Button(root,text=grids[t],command=lambda x=grids[t]:buttonClick(x))
        btn.place(x=20+j*64,y=80+i*40,width=63,height=36)
        t+=1

root.mainloop()

结果如下: 

 

 

  🚀往期回顾

📣GUI 图形用户界面编程(一): (278条消息) GUI 图形用户界面编程(一)_am_student的博客-CSDN博客

📣GUI 图形用户界面编程(二):

(278条消息) GUI 图形用户界面编程(二)经典案例_am_student的博客-CSDN博客

📣GUI 图形用户界面编程(三):

(278条消息) GUI 图形用户界面编程(三)基本框架与Label的使用_am_student的博客-CSDN博客

📣GUI 图形用户界面编程(四):

 (278条消息) GUI 图形用户界面编程(四)-Button组件_am_student的博客-CSDN博客

📣GUI 图形用户界面编程(五):

(357条消息) GUI 图形用户界面编程(五)-登录页面_am_student的博客-CSDN博客

 

举报

相关推荐

0 条评论