通货膨胀要涨价 发表于 2019-6-29 08:55:57

tkinter——一个加减乘除的计算器

**** Hidden Message *****
刚学习tkinter ,写了一个加减乘除的计算器。还不够完美,需要加油鸭!!

通货膨胀要涨价 发表于 2019-6-29 09:01:39

不能连续除{:9_230:},我去

zhucongtao 发表于 2019-7-8 12:51:40

看看哟,感谢分享

水滴石穿 发表于 2019-7-24 11:28:06

6666

水滴石穿 发表于 2019-7-30 12:40:19

有漏洞,看看我的
# -*- coding:utf-8 -*-
"""
此代码使用UTF-8编码
在Windows7上测试通过
作者ZiHeng
QQ:3318448676
微信:b3318448676
"""

from tkinter import *
from tkinter import messagebox
from tkinter import ttk
import re
import pyperclip

JieGuo = ''
root = Tk()
root.title('计算器')# 设置窗口名字
root.iconbitmap(r'calc.ico')# 设置窗口图标


# 开始定义输入函数

def input1(*args): inputbox.insert(INSERT, '1')


def input2(*args): inputbox.insert(INSERT, '2')


def input3(*args): inputbox.insert(INSERT, '3')


def input4(*args): inputbox.insert(INSERT, '4')


def input5(*args): inputbox.insert(INSERT, '5')


def input6(*args): inputbox.insert(INSERT, '6')


def input7(*args): inputbox.insert(INSERT, '7')


def input8(*args): inputbox.insert(INSERT, '8')


def input9(*args): inputbox.insert(INSERT, '9')


def input0(*args): inputbox.insert(INSERT, '0')


def inputplus(*args): inputbox.insert(INSERT, '+')


def inputminus(*args): inputbox.insert(INSERT, '-')


def inputtimes(*args): inputbox.insert(INSERT, '*')


def inputdiv(*args): inputbox.insert(INSERT, '/')


def inputleft(*args): inputbox.insert(INSERT, '(')


def inputright(*args): inputbox.insert(INSERT, ')')


def inputdian(*args): inputbox.insert(INSERT, '.')


def inputc(*args): inputbox.delete(1.0, 'end')


def inputdel(*args):
    beifen = inputbox.get(1.0, 'end')
    beifen = beifen
    inputbox.delete(1.0, 'end')
    inputbox.insert(END, beifen)
    del beifen


def inputok(*args):
    number = inputbox.get('1.0', 'end')
    inputbox.delete('1.0', 'end')
    qukuohao(number)
    inputbox.insert(END, JieGuo)


# 输入函数定义结束

# 定义菜单函数

def copy(*args):
    pyperclip.copy(inputbox.get(1.0, 'end'))
    messagebox.showinfo('提示', '复制成功!')


def pasta(*args):
    messagebox.showinfo('提示', '粘贴成功!')
    inputbox.insert(END, pyperclip.paste())


def settings():
    settingsbox = Toplevel(root)
    settingsbox.title('设置')
    settingsbox.resizable(width=False, height=False)

    group0 = LabelFrame(settingsbox, text='帮助', padx=5, pady=5)
    group0.pack(pady=10, padx=10, side=LEFT)
    label0 = Label(group0, text='这是一个功能待完善的计算器\n它还有许多功能没有添加'
                              '\n也有许多Bug没有修复\n欢迎反馈漏洞(联系方式见关于)', jus=LEFT)
    label0.pack()

    def helpbtbox():
      helpForBt = Toplevel(settingsbox)
      helpForBt.title('快捷键操作帮助')
      # 帮助文字
      ttk.Label(helpForBt, text='<----0---->,输入0   | ', jus=LEFT).grid(row=0, column=0)
      ttk.Label(helpForBt, text='<----1---->,输入1   | ', jus=LEFT).grid(row=1, column=0)
      ttk.Label(helpForBt, text='<----2---->,输入2   | ', jus=LEFT).grid(row=2, column=0)
      ttk.Label(helpForBt, text='<----3---->,输入3   | ', jus=LEFT).grid(row=3, column=0)
      ttk.Label(helpForBt, text='<----4---->,输入4   | ', jus=LEFT).grid(row=4, column=0)
      ttk.Label(helpForBt, text='<----5---->,输入5   | ', jus=LEFT).grid(row=5, column=0)
      ttk.Label(helpForBt, text='<----6---->,输入6   | ', jus=LEFT).grid(row=6, column=0)
      ttk.Label(helpForBt, text='<----7---->,输入7   | ', jus=LEFT).grid(row=7, column=0)
      ttk.Label(helpForBt, text='<----8---->,输入8', jus=LEFT).grid(row=0, column=1)
      ttk.Label(helpForBt, text='<----9---->,输入9', jus=LEFT).grid(row=1, column=1)
      ttk.Label(helpForBt, text='<-退格键->,退格', jus=LEFT).grid(row=2, column=1)
      ttk.Label(helpForBt, text='<-Delete->,清空 ', jus=LEFT).grid(row=3, column=1)
      ttk.Label(helpForBt, text='<Ctrl + C>,复制', jus=LEFT).grid(row=4, column=1)
      ttk.Label(helpForBt, text='<Ctrl + V>,粘贴', jus=LEFT).grid(row=5, column=1)
      ttk.Label(helpForBt, text='<--回车-->,运算', jus=LEFT).grid(row=6, column=1)
      ttk.Label(helpForBt, text='<Alt + F4>,退出', jus=LEFT).grid(row=7, column=1)
      # 帮助文字结束
      # 禁止调整窗口大小
      helpForBt.resizable(width=False, height=False)
      # 完成

    ttk.Button(group0, text='快捷键操作帮助', command=helpbtbox).pack()

    group1 = LabelFrame(settingsbox, text='捐赠和关于', padx=5, pady=5)
    group1.pack(pady=10, padx=10)
    label1 = Label(group1, text='支付宝:Chinese.he.amber@gmail.com\n'
                              '微信:b3318448676\nQQ:3318448676\n作者:ZiHeng', jus=LEFT)
    label1.grid(row=0, column=0, sticky='W')

    def about():
      aboutbox = Toplevel(settingsbox)
      aboutbox.title('关于')
      aboutphoto = PhotoImage(file='calc.gif')
      aboutbox.resizable(width=False, height=False)

      l1 = ttk.Label(aboutbox, image=aboutphoto)
      l1.bm = aboutphoto
      l1.pack()
      ttk.Label(aboutbox, text='S计算器,一个S级轻量的计算器\n', font=('微软雅黑', 8)).pack()

      ttk.Label(aboutbox,
                  text='版本号:2.40\n' + '=' * 30 + '\n更新日志:\n'
                  'a.优化整体UI,使用Windows7风格\n'
                  'b.允许使用括号运算符\n'
                  'c.在使用面板输入时,将在光标位置插入字符,而不是末尾'
                  '\n' + '=' * 30 + '\n作者:ZiHeng',
                  just=LEFT,
                  font=('微软雅黑', 12)).pack(side=LEFT)

    bt1 = ttk.Button(group1, text='关于', command=about)
    bt1.grid(row=1, column=0, sticky='S')


def esc(*args): root.quit()


def sb3(event): menu.post(event.x_root, event.y_root)


# 菜单函数定义结束

# 定义运算函数

def operation(a):
    # 切片输入内容、去除末尾\n

    global JieGuo
    list1 = re.split(r'([*/+-])', a)
    list2 = list1[-1].split('\n')
    list1[-1] = list2

    # 乘除法函数
    try:

      while '/' in list1:
            for index0, i in enumerate(list1):
                if i == '/':
                  list1 = '*'
                  list1 = 1 / float(list1)

      while '*' in list1:
            for index0, i in enumerate(list1):
                if i == '*':
                  list1 = float(list1) * float(list1)
                  del list1, list1

      # 加减法函数

      while '+' in list1:
            list1.remove('+')
      while '-' in list1:
            for index0, i in enumerate(list1):
                if i == '-':
                  list1 = str(list1) + str(list1)
                  del list1
      while len(list1) > 1:
            list1 = float(list1) + float(list1)
            del list1

    except (ValueError, IndexError):
      messagebox.showerror('错误', '输入字符无效')
      inputc()
    return str(list1)


def qukuohao(a):
    global JieGuo
    list1 = re.split(r'([()])', a)
    if list1.count('(') != list1.count(')'):
      messagebox.showerror('错误', '反括号数量不等于正括号数量')
      error = 1
    while "(" in list1:
      if error == 1:
            return
      count = 0
      # 找到第一个反括号),向前找第一个(
      for index, i in enumerate(list1):
            if i == ')':
                count = index
                for m in range(count, -1, -1):
                  if list1 == '(':
                        # 将两个括号里面的元素赋值给一个新的列表,传入计算函数
                        list2 = list1
                        # 计算函数(list)返回值赋值给新的数插入到原列表
                        kuohao = ''.join(list2)
                        new_str = operation(kuohao)
                        # 删除count,和m之间的元素
                        list1.insert(m, new_str)
                        for j in range(count-m+1):
                            list1.pop(m+1)
                        break
    print(list1)
    JieGuo = operation(''.join(list1))


# 定义结束

# 定义菜单

menu = Menu(root, tearoff=False)

Cmenu = Menu(menu, tearoff=False)# 新建菜单,删除顶部虚线
Cmenu.add_command(label='日志', command=lambda: messagebox.showinfo('请谅解', '功能制作中'))# 将内容添加至下拉菜单
Cmenu.add_separator()# 新建分割线
Cmenu.add_command(label='设置', command=settings)# 将内容添加至菜单
menu.add_cascade(label='菜单', menu=Cmenu)# 实例化菜单

Kmenu = Menu(menu, tearoff=False)# 新建菜单,删除顶部虚线
Kmenu.add_command(label='复制(Ctrl + C)', command=copy)# 将内容添加至菜单
Kmenu.add_command(label='粘贴(Ctrl + V)', command=pasta)# 将内容添加至菜单
Kmenu.add_separator()# 新建分割线
Kmenu.add_command(label='退出(Alt + F4)', command=esc)# 将内容添加至菜单
menu.add_cascade(label='快捷操作', menu=Kmenu)# 实例化新建下单

root.config(menu=menu)# 实例化菜单

root.bind('<Button-3>', sb3)# 允许右键打开菜单

# 菜单定义结束

# 按钮定义区

inputbox = Text(root, height=3, width=48, padx=5, pady=5)
inputbox.grid(row=0, column=0, columnspan=4)

eleft = ttk.Button(root,
                   text='(',
                   command=inputleft).grid(row=1, column=0)

eright = ttk.Button(root,
                  text=')',
                  command=inputright).grid(row=1, column=1)

ec = ttk.Button(root,
                text='C',
                command=inputc).grid(row=1, column=2)

edel = ttk.Button(root,
                  text='<--',
                  command=inputdel).grid(row=1, column=3)

e7 = ttk.Button(root,
                text='7',
                command=input7).grid(row=2, column=0)

e8 = ttk.Button(root,
                text='8',
                command=input8).grid(row=2, column=1)

e9 = ttk.Button(root,
                text='9',
                command=input9).grid(row=2, column=2)

ediv = ttk.Button(root,
                  text='/',
                  command=inputdiv).grid(row=2, column=3)

e4 = ttk.Button(root,
                text='4',
                command=input4).grid(row=3, column=0)

e5 = ttk.Button(root,
                text='5',
                command=input5).grid(row=3, column=1)

e6 = ttk.Button(root,
                text='6',
                command=input6).grid(row=3, column=2)

etimes = ttk.Button(root,
                  text='*',
                  command=inputtimes).grid(row=3, column=3)

e1 = ttk.Button(root,
                text='1',
                command=input1).grid(row=4, column=0)

e2 = ttk.Button(root,
                text='2',
                command=input2).grid(row=4, column=1)

e3 = ttk.Button(root,
                text='3',
                command=input3).grid(row=4, column=2)

eminus = ttk.Button(root,
                  text='-',
                  command=inputminus).grid(row=4, column=3)

edian = ttk.Button(root,
                   text='.',
                   command=inputdian).grid(row=5, column=0)

e0 = ttk.Button(root,
                text='0',
                command=input0).grid(row=5, column=1)

eok = ttk.Button(root,
               text='=',
               command=inputok).grid(row=5, column=2)

eplus = ttk.Button(root,
                   text='+',
                   command=inputplus).grid(row=5, column=3)

# 键盘操作————

root.bind('<Return>', inputok)# 回车键
root.bind('<KeyPress-1>', input1)
root.bind('<KeyPress-2>', input2)
root.bind('<KeyPress-3>', input3)
root.bind('<KeyPress-4>', input4)
root.bind('<KeyPress-5>', input5)
root.bind('<KeyPress-6>', input6)
root.bind('<KeyPress-7>', input7)
root.bind('<KeyPress-8>', input8)
root.bind('<KeyPress-9>', input9)
root.bind('<KeyPress-0>', input0)
root.bind('<Delete>', inputc)# DEL键
root.bind('<BackSpace>', inputdel)# 退格键
root.bind('<Control-KeyPress-c>', copy)
root.bind('<Control-KeyPress-C>', copy)
root.bind('<Control-KeyPress-v>', pasta)
root.bind('<Control-KeyPress-V>', pasta)

# 禁止调整窗口大小

root.resizable(width=False, height=False)

# 进入窗口主事件循环

mainloop()

2434849827 发表于 2019-7-30 16:25:46

支持楼主

四点好 发表于 2019-12-4 20:57:04

水滴石穿 发表于 2019-7-30 12:40
有漏洞,看看我的

老有激情阿,400行代码写个计算器

XiaoPaiShen 发表于 2019-12-4 23:52:44

本帖最后由 XiaoPaiShen 于 2019-12-4 23:58 编辑

take a look
第一次按数字键不能输入?

lqsj2018 发表于 2019-12-8 06:21:31

123

flyflytoyou 发表于 2019-12-8 12:30:46

这么长啊。。。你写了多久啊 大佬

ericwanglei 发表于 2019-12-9 08:26:12

厉害了

kinkon 发表于 2019-12-10 16:31:04

学习下

FANVER 发表于 2019-12-19 14:28:35

规划v记忆体

shiyi_1 发表于 2019-12-25 14:38:39

{:10_257:}

流羽星 发表于 2019-12-26 11:26:53

看看哈

淡淡凉 发表于 2020-1-6 10:41:48

tkinter用法都全忘了

tanyong1819 发表于 2020-2-3 21:02:32

1111111111111

w129542435 发表于 2020-2-3 21:14:18

看看

oncegone 发表于 2020-2-4 16:48:29

pyperclip

414605520 发表于 2020-2-13 00:19:10

看看
页: [1] 2
查看完整版本: tkinter——一个加减乘除的计算器