用Python写一个简单的计算器

这个博客展示了如何使用wxPython库构建一个基本的计算器。代码定义了一个MyFrame类,继承自wx.Frame,包含了数字按钮、运算符按钮以及清空和等于按钮。每个按钮都绑定了相应的事件处理函数,用于在文本框中显示输入和执行计算操作。当按下等号按钮时,程序会解析用户的输入并计算结果。
摘要由CSDN通过智能技术生成
import wx


class MyFrame(wx.Frame):
	def __init__(self):
		wx.Frame.__init__(self, parent=None, id=-1, title="计算器", size=(384, 378))
		panel = wx.Panel(self)
		self.text_res = wx.TextCtrl(panel, -1, size=(310, 35), pos=(37,33), style=wx.TE_READONLY|wx.TE_MULTILINE)
		self.btn_1 = wx.Button(panel, -1, "1", size=(58, 38), pos=(37, 106))
		self.btn_2 = wx.Button(panel, -1, "2", size=(58, 38), pos=(121, 106))
		self.btn_3 = wx.Button(panel, -1, "3", size=(58, 38), pos=(205, 106))
		self.btn_4 = wx.Button(panel, -1, "4", size=(58, 38), pos=(37, 170))
		self.btn_5 = wx.Button(panel, -1, "5", size=(58, 38), pos=(121, 170))
		self.btn_6 = wx.Button(panel, -1, "6", size=(58, 38), pos=(205, 170))
		self.btn_7 = wx.Button(panel, -1, "7", size=(58, 38), pos=(37, 234))
		self.btn_8 = wx.Button(panel, -1, "8", size=(58, 38), pos=(121, 234))
		self.btn_9 = wx.Button(panel, -1, "9", size=(58, 38), pos=(205, 234))
		self.btn_0 = wx.Button(panel, -1, "0", size=(58, 38), pos=(37, 298))

		self.btn_clear = wx.Button(panel, -1, "Clear", size=(58, 38), pos=(121, 298))
		self.btn_add = wx.Button(panel, -1, "+", size=(58, 38), pos=(289, 106))
		self.btn_sub = wx.Button(panel, -1, "-", size=(58, 38), pos=(289, 170))
		self.btn_mul = wx.Button(panel, -1, "x", size=(58, 38), pos=(289, 234))
		self.btn_dev = wx.Button(panel, -1, "/", size=(58, 38), pos=(205, 298))
		self.btn_equal = wx.Button(panel, -1, "=", size=(58, 38), pos=(289, 298))

		self.Bind(wx.EVT_BUTTON, self.num_1, self.btn_1)
		self.Bind(wx.EVT_BUTTON, self.num_2, self.btn_2)
		self.Bind(wx.EVT_BUTTON, self.num_3, self.btn_3)
		self.Bind(wx.EVT_BUTTON, self.num_5, self.btn_5)
		self.Bind(wx.EVT_BUTTON, self.num_4, self.btn_4)
		self.Bind(wx.EVT_BUTTON, self.num_6, self.btn_6)
		self.Bind(wx.EVT_BUTTON, self.num_7, self.btn_7)
		self.Bind(wx.EVT_BUTTON, self.num_8, self.btn_8)
		self.Bind(wx.EVT_BUTTON, self.num_9, self.btn_9)
		self.Bind(wx.EVT_BUTTON, self.num_0, self.btn_0)

		self.Bind(wx.EVT_BUTTON, self.clear, self.btn_clear)
		self.Bind(wx.EVT_BUTTON, self.add, self.btn_add)
		self.Bind(wx.EVT_BUTTON, self.sub, self.btn_sub)
		self.Bind(wx.EVT_BUTTON, self.dev, self.btn_dev)
		self.Bind(wx.EVT_BUTTON, self.mul, self.btn_mul)
		self.Bind(wx.EVT_BUTTON, self.equal, self.btn_equal)

	def num_1(self, event):
		user_input = self.text_res.GetValue()
		if '=' in user_input:
			self.text_res.Clear()
		self.text_res.AppendText('1')
	def num_2(self, event):
		user_input = self.text_res.GetValue()
		if '=' in user_input:
			self.text_res.Clear()
		self.text_res.AppendText('2')
	def num_3(self, event):
		user_input = self.text_res.GetValue()
		if '=' in user_input:
			self.text_res.Clear()
		self.text_res.AppendText('3')
	def num_4(self, event):
		user_input = self.text_res.GetValue()
		if '=' in user_input:
			self.text_res.Clear()
		self.text_res.AppendText('4')
	def num_5(self, event):
		user_input = self.text_res.GetValue()
		if '=' in user_input:
			self.text_res.Clear()
		self.text_res.AppendText('5')
	def num_6(self, event):
		user_input = self.text_res.GetValue()
		if '=' in user_input:
			self.text_res.Clear()
		self.text_res.AppendText('6')
	def num_7(self, event):
		user_input = self.text_res.GetValue()
		if '=' in user_input:
			self.text_res.Clear()
		self.text_res.AppendText('7')
	def num_8(self, event):
		user_input = self.text_res.GetValue()
		if '=' in user_input:
			self.text_res.Clear()
		self.text_res.AppendText('8')
	def num_9(self, event):
		user_input = self.text_res.GetValue()
		if '=' in user_input:
			self.text_res.Clear()
		self.text_res.AppendText('9')
	def num_0(self, event):
		user_input = self.text_res.GetValue()
		if '=' in user_input:
			self.text_res.Clear()
		self.text_res.AppendText('0')
	def add(self, event):
		user_input = self.text_res.GetValue()
		if '=' in user_input:
			self.text_res.Clear()
		self.text_res.AppendText('+')
	def sub(self, event):
		user_input = self.text_res.GetValue()
		if '=' in user_input:
			self.text_res.Clear()
		self.text_res.AppendText('-')
	def mul(self, event):
		user_input = self.text_res.GetValue()
		if '=' in user_input:
			self.text_res.Clear()
		self.text_res.AppendText('x')
	def dev(self, event):
		user_input = self.text_res.GetValue()
		if '=' in user_input:
			self.text_res.Clear()
		self.text_res.AppendText('/')
	def equal(self, event):
		user_input = self.text_res.GetValue()
		if '=' in user_input:
			return -1
		num = []
		syn = []
		s = ''
		for each in user_input:
			if each not in ('+', '-', 'x', '/'):
				s += each
			else:
				if len(s) == 0 and each in ('+','-'):
					syn.append(each)
					num.append(0)
					continue
				if len(s) == 0 and each not in ('+','-'):
					dlg = wx.MessageDialog(None, message="开头的数字缺失!", caption="警告",style=wx.OK)
					dlg.ShowModal()
					dlg.Destroy()
					return -1

				num.append(int(s))
				if (len(syn) == 0) or (each in ('x', '/') and syn[-1] in ('+','-')):
					syn.append(each)
				else:
					fu = syn[-1]
					num1 = num[-2]
					num2 = num[-1]
					num.pop()
					num.pop()
					if fu == '+':
						num.append(num1+num2)
					elif fu == '-':
						num.append(num1 - num2)
					elif fu == 'x':
						num.append(num1 * num2)
					elif fu == '/':
						num.append(num1 / num2)
					else:
						return -1
					syn.pop()
					syn.append(each)
				s = ''
		num.append(int(s))
		res = 0
		if syn[-1] in ('x', '/'):
			num1 = num[-2]
			num2 = num[-1]
			num.pop()
			num.pop()
			if syn[-1] == 'x':
				num.append(num1 * num2)
			else:
				num.append(num1 / num2)
			syn.pop()
		if len(num) == 1:
			res = num[0]
		for i in range(0, len(syn)):
			if syn[i] == '+':
				res += num[i] + num[i + 1]
			elif syn[i] == '-':
				res += num[i] - num[i + 1]
			elif syn[i] == 'x':
				res += num[i] * num[i + 1]
			elif syn[i] == '/':
				res += num[i] / num[i + 1]
			else:
				return -1
		self.text_res.AppendText(' = {}'.format(res))
	def clear(self, event):
		self.text_res.Clear()


if __name__ == '__main__':
	app = wx.App()
	frame = MyFrame()
	frame.Show()
	app.MainLoop()

123

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值