使用Python编写简易计算器
环境:Python3.8 + wxpython4.1.0
所有综合代码在最后面,效果图:
1、创建界面
wxpython补充知识:
1、wx.frame是一个基类,包含许多的wx.frame(窗口)构件,class MyFrame(wx.Frame)表示MyFrame这个类继承与wx.Frame类;
2、wx.frame.__init__构造方法确定容器的大小以及标题、id等各个属性;
3、wx.TextCtrl创建文本框,也就是计算器的输入框,后面的参数style这只文本框里面的位置,这里设置的wx.TE_RIGHT为居右;
4、wx.Button为创建按钮,后面需要为每一个组件赋予唯一id值
****lable=‘name’,这里的name是需要显示在按钮上的文字
****pos=(10,30),这里是设置此按钮(组件)的位置,size则是设置按钮(组件)的大小
5、捆绑事件:
将按钮和方法绑定:点击按钮的时候触发所绑定的方法
按钮名.Bind(wx.EVT_BUTTON, self.方法名, 按钮名)
# 计算器界面
class MyFrame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent, id=100, title='计算器', size=(250, 350))
panel = wx.Panel(self)
# 创建文本框
self.entry = wx.TextCtrl(panel, id=15, pos=(10, 0), size=(195, 28), style=wx.TE_RIGHT)
#创建按钮
self.btn_clear = wx.Button(parent=panel, id=10, label='C', pos=(10, 30), size=(45, 45))
self.btn_divide = wx.Button(parent=panel, id=11, label='/', pos=(60, 30), size=(45, 45))
self.btn_multiply = wx.Button(parent=panel, id=12, label='*', pos=(110, 30), size=(45, 45))
self.btn_backspace = wx.Button(parent=panel, id=13, label='←', pos=(160, 30), size=(45, 45))
self.btn_sub = wx.Button(parent=panel, id=14, label='-', pos=(160, 80), size=(45, 45))
self.btn_add = wx.Button(parent=panel, id=15, label='+', pos=(160, 130), size=(45, 45))
self.btn_point = wx.Button(parent=panel, id=16, label='.', pos=(110, 230), size=(45, 45))
self.btn_equal = wx.Button(parent=panel, id=17, label='=', pos=(160, 180), size=(45, 95))
self.btn_zero = wx.Button(parent=panel, id=0, label='0', pos=(10, 230), size=(95, 45))
self.btn_seven = wx.Button(parent=panel, id=7, label='7', pos=(10, 80), size=(45, 45))
self.btn_eight = wx.Button(parent=panel, id=8, label='8', pos=(60, 80), size=(45, 45))
self.btn_nine = wx.Button(parent=panel, id=9, label='9', pos=(110, 80), size=(45, 45))
self.btn_six = wx.Button(parent=panel, id=6, label='6', pos=(110, 130), size=(45, 45))
self.btn_five = wx.Button(parent=panel, id=5, label='5', pos=(60, 130), size=(45, 45))
self.btn_four = wx.Button(parent=panel, id=4, label='4', pos=(10, 130), size=(45, 45))
self.btn_three = wx.Button(parent=panel, id=3, label='3', pos=(110, 180), size=(45, 45))
self.btn_two = wx.Button(parent=panel, id=2, label='2', pos=(60, 180), size=(45, 45))
self.btn_one = wx.Button(parent=panel, id=1, label='1', pos=(10, 180), size=(45, 45))
#创建捆绑事件
self.btn_one.Bind(wx.EVT_BUTTON, self.On_Btn_one, self.btn_one)
self.btn_two.Bind(wx.EVT_BUTTON, self.On_Btn_two, self.btn_two)
self.btn_three.Bind(wx.EVT_BUTTON, self.On_Btn_three, self.btn_three)
self.btn_four.Bind(wx.EVT_BUTTON, self.On_Btn_four, self.btn_four)
self.btn_five.Bind(wx.EVT_BUTTON, self.On_Btn_five, self.btn_five)
self.btn_six.Bind(wx.EVT_BUTTON, self.On_Btn_six, self.btn_six)
self.btn_seven.Bind(wx.EVT_BUTTON, self.On_Btn_seven, self.btn_seven)
self.btn_eight.Bind(wx.EVT_BUTTON, self.On_Btn_eight, self.btn_eight)
self.btn_nine.Bind(wx.EVT_BUTTON, self.On_Btn_nine, self.btn_nine)
self.btn_zero.Bind(wx.EVT_BUTTON, self.On_Btn_zero, self.btn_zero)
self.btn_divide.Bind(wx.EVT_BUTTON, self.On_Btn_divide, self.btn_divide)
self.btn_clear.Bind(wx.EVT_BUTTON, self.On_Btn_clear, self.btn_clear)
self.btn_multiply.Bind(wx.EVT_BUTTON, self.On_Btn_multiply, self.btn_multiply)
self.btn_backspace.Bind(wx.EVT_BUTTON, self.On_Btn_backspace, self.btn_backspace)
self.btn_sub.Bind(wx.EVT_BUTTON, self.On_Btn_sub, self.btn_sub)
self.btn_add.Bind(wx.EVT_BUTTON, self.On_Btn_add, self.btn_add)
self.btn_equal.Bind(wx.EVT_BUTTON, self.On_Btn_equal, self.btn_equal)
self.btn_point.Bind(wx.EVT_BUTTON, self.On_Btn_point, self.btn_point)
2、创建按钮点击事件
补充知识:
1、self.entry.AppendText(“1”)
这里的self.entry是前面定义的文本框,.AppendText方法是往前面的文本框里面添加字符串,也就是后面括号里面的;
2、同理,Remove方法就是删除字符,这个方法在退格这个按钮里面会用到。退格按钮的基本思想是:
****(1)获取文本框里面的字符串长度;
input_len = len(self.entry.GetValue())
****(2)根据下标移除最后一个字符即可(self.entry是前面定义的文本框)
self.entry.Remove(input_len - 1, input_len)
3、计算的基本思想:
****(1)获取文本框字符串
pre_result = str(self.entry.GetValue())
****(2)通过eval()函数对其进行计算,eval()函数用来执行字符串表达式,并返回该字符串的值
result = eval(pre_result)
****(3)将计算都的值添加到文本框里面
self.entry.SetValue(str(result))
#创建按钮点击事件
def On_Btn_one(self,event):
self.entry.AppendText("1")
def On_Btn_two(self, event):
self.entry.AppendText("2")
def On_Btn_three(self, event):
self.entry.AppendText("3")
def On_Btn_four(self, event):
self.entry.AppendText("4")
def On_Btn_five(self, event):
self.entry.AppendText("5")
def On_Btn_six(self, event):
self.entry.AppendText("6")
def On_Btn_seven(self, event):
self.entry.AppendText("7")
def On_Btn_eight(self, event):
self.entry.AppendText("8")
def On_Btn_nine(self, event):
self.entry.AppendText("9")
def On_Btn_zero(self, event):
self.entry.AppendText("0")
def On_Btn_point(self, event):
self.entry.AppendText(".")
def On_Btn_add(self, event):
self.entry.AppendText("+")
def On_Btn_sub(self, event):
self.entry.AppendText("-")
def On_Btn_multiply(self, event):
self.entry.AppendText("*")
def On_Btn_divide(self, event):
self.entry.AppendText("/")
def On_Btn_clear(self, event):
self.entry.Clear()
def On_Btn_backspace(self, event):
input_len = len(self.entry.GetValue())
self.entry.Remove(input_len - 1, input_len)
def On_Btn_equal(self,event):
try:
pre_result = str(self.entry.GetValue())
result = eval(pre_result)
self.entry.SetValue(str(result))
except:
self.entry.SetValue("Error")
3、主函数运行
补充知识:
1、使用wx.App()将应用程序初始化
app = wx.App()
2、将我们所创建的应用程序界面展示出来
MyFrame(None).Show()
3、与第一点相对应,使用MainLoop()形成消息循环,否则该程序将直接退出
app.MainLoop()
if __name__ == '__main__':
app = wx.App()
MyFrame(None).Show()
app.MainLoop()
综合代码
import wx
# 计算器界面
class MyFrame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent, id=100, title='计算器', size=(250, 350))
panel = wx.Panel(self)
# 创建文本框
self.entry = wx.TextCtrl(panel, id=15, pos=(10, 0), size=(195, 28), style=wx.TE_RIGHT)
#创建按钮
self.btn_clear = wx.Button(parent=panel, id=10, label='C', pos=(10, 30), size=(45, 45))
self.btn_divide = wx.Button(parent=panel, id=11, label='/', pos=(60, 30), size=(45, 45))
self.btn_multiply = wx.Button(parent=panel, id=12, label='*', pos=(110, 30), size=(45, 45))
self.btn_backspace = wx.Button(parent=panel, id=13, label='←', pos=(160, 30), size=(45, 45))
self.btn_sub = wx.Button(parent=panel, id=14, label='-', pos=(160, 80), size=(45, 45))
self.btn_add = wx.Button(parent=panel, id=15, label='+', pos=(160, 130), size=(45, 45))
self.btn_point = wx.Button(parent=panel, id=16, label='.', pos=(110, 230), size=(45, 45))
self.btn_equal = wx.Button(parent=panel, id=17, label='=', pos=(160, 180), size=(45, 95))
self.btn_zero = wx.Button(parent=panel, id=0, label='0', pos=(10, 230), size=(95, 45))
self.btn_seven = wx.Button(parent=panel, id=7, label='7', pos=(10, 80), size=(45, 45))
self.btn_eight = wx.Button(parent=panel, id=8, label='8', pos=(60, 80), size=(45, 45))
self.btn_nine = wx.Button(parent=panel, id=9, label='9', pos=(110, 80), size=(45, 45))
self.btn_six = wx.Button(parent=panel, id=6, label='6', pos=(110, 130), size=(45, 45))
self.btn_five = wx.Button(parent=panel, id=5, label='5', pos=(60, 130), size=(45, 45))
self.btn_four = wx.Button(parent=panel, id=4, label='4', pos=(10, 130), size=(45, 45))
self.btn_three = wx.Button(parent=panel, id=3, label='3', pos=(110, 180), size=(45, 45))
self.btn_two = wx.Button(parent=panel, id=2, label='2', pos=(60, 180), size=(45, 45))
self.btn_one = wx.Button(parent=panel, id=1, label='1', pos=(10, 180), size=(45, 45))
#创建捆绑事件
self.btn_one.Bind(wx.EVT_BUTTON, self.On_Btn_one, self.btn_one)
self.btn_two.Bind(wx.EVT_BUTTON, self.On_Btn_two, self.btn_two)
self.btn_three.Bind(wx.EVT_BUTTON, self.On_Btn_three, self.btn_three)
self.btn_four.Bind(wx.EVT_BUTTON, self.On_Btn_four, self.btn_four)
self.btn_five.Bind(wx.EVT_BUTTON, self.On_Btn_five, self.btn_five)
self.btn_six.Bind(wx.EVT_BUTTON, self.On_Btn_six, self.btn_six)
self.btn_seven.Bind(wx.EVT_BUTTON, self.On_Btn_seven, self.btn_seven)
self.btn_eight.Bind(wx.EVT_BUTTON, self.On_Btn_eight, self.btn_eight)
self.btn_nine.Bind(wx.EVT_BUTTON, self.On_Btn_nine, self.btn_nine)
self.btn_zero.Bind(wx.EVT_BUTTON, self.On_Btn_zero, self.btn_zero)
self.btn_divide.Bind(wx.EVT_BUTTON, self.On_Btn_divide, self.btn_divide)
self.btn_clear.Bind(wx.EVT_BUTTON, self.On_Btn_clear, self.btn_clear)
self.btn_multiply.Bind(wx.EVT_BUTTON, self.On_Btn_multiply, self.btn_multiply)
self.btn_backspace.Bind(wx.EVT_BUTTON, self.On_Btn_backspace, self.btn_backspace)
self.btn_sub.Bind(wx.EVT_BUTTON, self.On_Btn_sub, self.btn_sub)
self.btn_add.Bind(wx.EVT_BUTTON, self.On_Btn_add, self.btn_add)
self.btn_equal.Bind(wx.EVT_BUTTON, self.On_Btn_equal, self.btn_equal)
self.btn_point.Bind(wx.EVT_BUTTON, self.On_Btn_point, self.btn_point)
#创建按钮点击事件
def On_Btn_one(self,event):
self.entry.AppendText("1")
def On_Btn_two(self, event):
self.entry.AppendText("2")
def On_Btn_three(self, event):
self.entry.AppendText("3")
def On_Btn_four(self, event):
self.entry.AppendText("4")
def On_Btn_five(self, event):
self.entry.AppendText("5")
def On_Btn_six(self, event):
self.entry.AppendText("6")
def On_Btn_seven(self, event):
self.entry.AppendText("7")
def On_Btn_eight(self, event):
self.entry.AppendText("8")
def On_Btn_nine(self, event):
self.entry.AppendText("9")
def On_Btn_zero(self, event):
self.entry.AppendText("0")
def On_Btn_point(self, event):
self.entry.AppendText(".")
def On_Btn_add(self, event):
self.entry.AppendText("+")
def On_Btn_sub(self, event):
self.entry.AppendText("-")
def On_Btn_multiply(self, event):
self.entry.AppendText("*")
def On_Btn_divide(self, event):
self.entry.AppendText("/")
def On_Btn_clear(self, event):
self.entry.Clear()
def On_Btn_backspace(self, event):
input_len = len(self.entry.GetValue())
self.entry.Remove(input_len - 1, input_len)
def On_Btn_equal(self,event):
try:
pre_result = str(self.entry.GetValue())
result = eval(pre_result)
self.entry.SetValue(str(result))
except:
self.entry.SetValue("Error")
if __name__ == '__main__':
app = wx.App()
MyFrame(None).Show()
app.MainLoop()