目录
准备工作
- 安装wxpython库:pip install wxpython
- 使用WxPython可视化编辑器设计计算页面
- 在“设计窗口”拖动组件设置属性后可保存*.pyec文件以便后期继续改进
- “代码界面”则为“设计窗口”的可视化布局代码
- 为方便调试可在“设置”-“调试目录”选择“WxPython可视化编辑器”解压后的文件夹路径,“解释器”选择python.exe的文件路径,然后在“设计窗口”直接右击“调试”看可视化效果
编码实现
# -*- coding:utf-8 -*-
import wx
class Frame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, title='Python计算器 By Johnny', size=(450, 385), name='frame', style=541071360)
# icon = wx.Icon(r'C:\Users\izhan\Desktop\calc\logo.jpg')
# self.SetIcon(icon)
self.qdck = wx.Panel(self)
self.Centre()
# 用于存储计算过程
self.expression = ""
self.bjk1 = wx.TextCtrl(self.qdck, size=(415, 50), pos=(10, 10), value='', name='text', style=wx.TE_RIGHT)
bjk1_字体 = wx.Font(11, 74, 90, 400, False, 'Microsoft YaHei UI', 28)
self.bjk1.SetFont(bjk1_字体)
self.an1 = wx.Button(self.qdck, size=(100, 50), pos=(10, 65), label='回退', name='button')
an1_字体 = wx.Font(10, 74, 90, 400, False, 'Microsoft YaHei UI', 28)
self.an1.SetFont(an1_字体)
self.an1.Bind(wx.EVT_BUTTON, self.an1_anbdj)
self.an2 = wx.Button(self.qdck, size=(100, 50), pos=(115, 65), label='清空', name='button')
an2_字体 = wx.Font(10, 74, 90, 400, False, 'Microsoft YaHei UI', 28)
self.an2.SetFont(an2_字体)
self.an2.Bind(wx.EVT_BUTTON, self.an2_anbdj)
self.an3 = wx.Button(self.qdck, size=(100, 50), pos=(220, 65), label='退出', name='button')
an3_字体 = wx.Font(10, 74, 90, 400, False, 'Microsoft YaHei UI', 28)
self.an3.SetFont(an3_字体)
self.an3.Bind(wx.EVT_BUTTON, self.an3_anbdj)
self.an4 = wx.Button(self.qdck, size=(100, 50), pos=(325, 65), label='+', name='button')
an4_字体 = wx.Font(10, 74, 90, 400, False, 'Microsoft YaHei UI', 28)
self.an4.SetFont(an4_字体)
self.an4.Bind(wx.EVT_BUTTON, self.an4_anbdj)
self.an5 = wx.Button(self.qdck, size=(100, 50), pos=(10, 120), label='7', name='button')
an5_字体 = wx.Font(10, 74, 90, 400, False, 'Microsoft YaHei UI', 28)
self.an5.SetFont(an5_字体)
self.an5.Bind(wx.EVT_BUTTON, self.an5_anbdj)
self.an6 = wx.Button(self.qdck, size=(100, 50), pos=(115, 120), label='8', name='button')
an6_字体 = wx.Font(10, 74, 90, 400, False, 'Microsoft YaHei UI', 28)
self.an6.SetFont(an6_字体)
self.an6.Bind(wx.EVT_BUTTON, self.an6_anbdj)
self.an7 = wx.Button(self.qdck, size=(100, 50), pos=(220, 120), label='9', name='button')
an7_字体 = wx.Font(10, 74, 90, 400, False, 'Microsoft YaHei UI', 28)
self.an7.SetFont(an7_字体)
self.an7.Bind(wx.EVT_BUTTON, self.an7_anbdj)
self.an8 = wx.Button(self.qdck, size=(100, 50), pos=(325, 120), label='-', name='button')
an8_字体 = wx.Font(10, 74, 90, 400, False, 'Microsoft YaHei UI', 28)
self.an8.SetFont(an8_字体)
self.an8.Bind(wx.EVT_BUTTON, self.an8_anbdj)
self.an9 = wx.Button(self.qdck, size=(100, 50), pos=(10, 175), label='4', name='button')
an9_字体 = wx.Font(10, 74, 90, 400, False, 'Microsoft YaHei UI', 28)
self.an9.SetFont(an9_字体)
self.an9.Bind(wx.EVT_BUTTON, self.an9_anbdj)
self.an10 = wx.Button(self.qdck, size=(100, 50), pos=(115, 175), label='5', name='button')
an10_字体 = wx.Font(10, 74, 90, 400, False, 'Microsoft YaHei UI', 28)
self.an10.SetFont(an10_字体)
self.an10.Bind(wx.EVT_BUTTON, self.an10_anbdj)
self.an11 = wx.Button(self.qdck, size=(100, 50), pos=(220, 175), label='6', name='button')
an11_字体 = wx.Font(10, 74, 90, 400, False, 'Microsoft YaHei UI', 28)
self.an11.SetFont(an11_字体)
self.an11.Bind(wx.EVT_BUTTON, self.an11_anbdj)
self.an12 = wx.Button(self.qdck, size=(100, 50), pos=(325, 175), label='×', name='button')
an12_字体 = wx.Font(10, 74, 90, 400, False, 'Microsoft YaHei UI', 28)
self.an12.SetFont(an12_字体)
self.an12.Bind(wx.EVT_BUTTON, self.an12_anbdj)
self.an13 = wx.Button(self.qdck, size=(100, 50), pos=(10, 230), label='1', name='button')
an13_字体 = wx.Font(10, 74, 90, 400, False, 'Microsoft YaHei UI', 28)
self.an13.SetFont(an13_字体)
self.an13.Bind(wx.EVT_BUTTON, self.an13_anbdj)
self.an14 = wx.Button(self.qdck, size=(100, 50), pos=(115, 230), label='2', name='button')
an14_字体 = wx.Font(10, 74, 90, 400, False, 'Microsoft YaHei UI', 28)
self.an14.SetFont(an14_字体)
self.an14.Bind(wx.EVT_BUTTON, self.an14_anbdj)
self.an15 = wx.Button(self.qdck, size=(100, 50), pos=(220, 230), label='3', name='button')
an15_字体 = wx.Font(10, 74, 90, 400, False, 'Microsoft YaHei UI', 28)
self.an15.SetFont(an15_字体)
self.an15.Bind(wx.EVT_BUTTON, self.an15_anbdj)
self.an16 = wx.Button(self.qdck, size=(100, 50), pos=(325, 230), label='÷', name='button')
an16_字体 = wx.Font(10, 74, 90, 400, False, 'Microsoft YaHei UI', 28)
self.an16.SetFont(an16_字体)
self.an16.Bind(wx.EVT_BUTTON, self.an16_anbdj)
self.an17 = wx.Button(self.qdck, size=(100, 50), pos=(10, 285), label='0', name='button')
an17_字体 = wx.Font(10, 74, 90, 400, False, 'Microsoft YaHei UI', 28)
self.an17.SetFont(an17_字体)
self.an17.Bind(wx.EVT_BUTTON, self.an17_anbdj)
self.an18 = wx.Button(self.qdck, size=(100, 50), pos=(115, 285), label='.', name='button')
an18_字体 = wx.Font(10, 74, 90, 400, False, 'Microsoft YaHei UI', 28)
self.an18.SetFont(an18_字体)
self.an18.Bind(wx.EVT_BUTTON, self.an18_anbdj)
self.an19 = wx.Button(self.qdck, size=(100, 50), pos=(220, 285), label='+/-', name='button')
an19_字体 = wx.Font(10, 74, 90, 400, False, 'Microsoft YaHei UI', 28)
self.an19.SetFont(an19_字体)
self.an19.Bind(wx.EVT_BUTTON, self.an19_anbdj)
self.an20 = wx.Button(self.qdck, size=(100, 50), pos=(325, 285), label='=', name='button')
an20_字体 = wx.Font(10, 74, 90, 400, False, 'Microsoft YaHei UI', 28)
self.an20.SetFont(an20_字体)
self.an20.Bind(wx.EVT_BUTTON, self.an20_anbdj)
def an1_anbdj(self, event):
if self.expression:
self.expression = self.expression[: - 1]
self.bjk1.SetValue(self.expression)
def an2_anbdj(self, event):
self.expression = ""
self.bjk1.SetValue(self.expression)
def an3_anbdj(self, event):
self.Close()
def an4_anbdj(self, event):
self.expression += "+"
self.bjk1.SetValue(self.expression)
def an5_anbdj(self, event):
self.expression += "7"
self.bjk1.SetValue(self.expression)
def an6_anbdj(self, event):
self.expression += "8"
self.bjk1.SetValue(self.expression)
def an7_anbdj(self, event):
self.expression += "9"
self.bjk1.SetValue(self.expression)
def an8_anbdj(self, event):
self.expression += "-"
self.bjk1.SetValue(self.expression)
def an9_anbdj(self, event):
self.expression += "4"
self.bjk1.SetValue(self.expression)
def an10_anbdj(self, event):
self.expression += "5"
self.bjk1.SetValue(self.expression)
def an11_anbdj(self, event):
self.expression += "6"
self.bjk1.SetValue(self.expression)
def an12_anbdj(self, event):
self.expression += "×"
self.bjk1.SetValue(self.expression)
def an13_anbdj(self, event):
self.expression += "1"
self.bjk1.SetValue(self.expression)
def an14_anbdj(self, event):
self.expression += "2"
self.bjk1.SetValue(self.expression)
def an15_anbdj(self, event):
self.expression += "3"
self.bjk1.SetValue(self.expression)
def an16_anbdj(self, event):
self.expression += "÷"
self.bjk1.SetValue(self.expression)
def an17_anbdj(self, event):
self.expression += "0"
self.bjk1.SetValue(self.expression)
def an18_anbdj(self, event):
self.expression += "."
self.bjk1.SetValue(self.expression)
def an19_anbdj(self, event):
if self.expression and self.expression[0] == '-':
self.expression = self.expression[1:]
else:
self.expression = '-' + self.expression
self.bjk1.SetValue(self.expression)
def an20_anbdj(self, event):
import re
# 将乘除运算先进行计算
while re.search(r'(\d+(\.\d+)?)([×÷])(\d+(\.\d+)?)', self.expression):
temp_expression = re.search(r'(\d+(\.\d+)?)([×÷])(\d+(\.\d+)?)', self.expression).group()
if '×' in temp_expression:
num1, num2 = map(float, temp_expression.split('×'))
result = num1 * num2
else:
num1, num2 = map(float, temp_expression.split('÷'))
result = num1 / num2
self.expression = self.expression.replace(temp_expression, str(result))
# 再进行加减运算
while re.search(r'(\d+(\.\d+)?)([+-])(\d+(\.\d+)?)', self.expression):
temp_expression = re.search(r'(\d+(\.\d+)?)([+-])(\d+(\.\d+)?)', self.expression).group()
if '+' in temp_expression:
num1, num2 = map(float, temp_expression.split('+'))
result = num1 + num2
else:
num1, num2 = map(float, temp_expression.split('-'))
result = num1 - num2
self.expression = self.expression.replace(temp_expression, str(result))
self.bjk1.SetValue(self.expression)
class myApp(wx.App):
def OnInit(self):
self.frame = Frame()
self.frame.Show(True)
return True
if __name__ == '__main__':
app = myApp()
app.MainLoop()