Python实现简易版计算器:基于wxPython与wxGlade的GUI开发实战
本文总结Python自学心得,介绍利用wxPython库和wxGlade工具开发图形界面计算器的过程。通过Python 2.7环境,结合wx.TextCtrl控件处理输入输出,演示了从界面布局到逻辑代码的完整实现,旨在为初学者提供Python GUI开发的实用参考。
经过一周的Python学习,本文作为这段时间自学成果的总结。
一、Python简介
Python是一种设计优雅的脚本语言,对于熟悉Java或C++的开发者而言,入门Python相对容易。Python拥有丰富且强大的类库资源,常被业界称为“胶水语言”,因为它能够轻松地将其他语言(尤其是C/C++)编写的模块连接起来。常见的应用场景包括使用Python快速生成程序原型(有时甚至直接作为最终界面),随后对特定部分使用更合适的语言进行重写。
二、Python版计算器的实现
所需工具准备:
1. Python 2.7 2. wxPython 3. wxGlade界面编辑工具 4. PyCharm
具体的配置步骤此处省略,网上已有大量相关教程。Python的GUI开发库众多,本文选用wxPython。界面设计采用wxGlade,这是一款优秀的GUI编辑工具,其最大优势在于能够自动生成图形界面的代码。
以下主要介绍几个关键点:
wx.TextCtrl(文本输入控件)用作计算器的显示屏。点击数字时,使用AppendText方法将数字追加到文本末尾;获取数字时使用GetValue方法。点击运算符时,需先清空文本框(使用Clear方法),同时保存操作符。点击等号后,存储第二个操作数,利用int方法将字符串转换为数字,计算完成后通过SetValue方法将结果显示在文本框中。具体代码如下:
import wx
# begin wxGlade: extracode
# end wxGlade
class MyFrame(wx.Frame):
def __init__(self, *args, **kwds):
# begin wxGlade: MyFrame.__init__
kwds["style"] = wx.DEFAULT_FRAME_STYLE
wx.Frame.__init__(self, *args, **kwds)
self.text_ctrl_1 = wx.TextCtrl(self, -1, "",style=wx.TE_READONLY)
self.button_37 = wx.Button(self, -1, "1")
self.button_38 = wx.Button(self, -1, "2")
self.button_39 = wx.Button(self, -1, "3")
self.button_40 = wx.Button(self, -1, "+")
self.button_41 = wx.Button(self, -1, "4")
self.button_42 = wx.Button(self, -1, "5")
self.button_43 = wx.Button(self, -1, "6")
self.button_44 = wx.Button(self, -1, "-")
self.button_46 = wx.Button(self, -1, "7")
self.button_45 = wx.Button(self, -1, "8")
self.button_47 = wx.Button(self, -1, "9")
self.button_48 = wx.Button(self, -1, "x")
self.button_49 = wx.Button(self, -1, "C")
self.button_50 = wx.Button(self, -1, "0")
self.button_51 = wx.Button(self, -1, "=")
self.button_52 = wx.Button(self, -1, "/")
self.__set_properties()
self.__do_layout()
self.Bind(wx.EVT_BUTTON, self.bu1, self.button_37)
self.Bind(wx.EVT_BUTTON, self.bu2, self.button_38)
self.Bind(wx.EVT_BUTTON, self.bu3, self.button_39)
self.Bind(wx.EVT_BUTTON, self.bu_plus, self.button_40)
self.Bind(wx.EVT_BUTTON, self.bu4, self.button_41)
self.Bind(wx.EVT_BUTTON, self.bu5, self.button_42)
self.Bind(wx.EVT_BUTTON, self.bu6, self.button_43)
self.Bind(wx.EVT_BUTTON, self.bu_min, self.button_44)
self.Bind(wx.EVT_BUTTON, self.bu7, self.button_46)
self.Bind(wx.EVT_BUTTON, self.bu8, self.button_45)
self.Bind(wx.EVT_BUTTON, self.bu9, self.button_47)
self.Bind(wx.EVT_BUTTON, self.bu_mul, self.button_48)
self.Bind(wx.EVT_BUTTON, self.bu_clear, self.button_49)
self.Bind(wx.EVT_BUTTON, self.bu0, self.button_50)
self.Bind(wx.EVT_BUTTON, self.bu_result, self.button_51)
self.Bind(wx.EVT_BUTTON, self.bu_chu, self.button_52)
# end wxGlade
self.Show(True)
def __set_properties(self):
# begin wxGlade: MyFrame.__set_properties
self.SetTitle("Python Calculater by CYG")
self.text_ctrl_1.SetMinSize((400, 50))
self.button_37.SetMinSize((100, 50))
self.button_38.SetMinSize((100, 50))
self.button_39.SetMinSize((100, 50))
self.button_40.SetMinSize((100, 50))
self.button_41.SetMinSize((100, 50))
self.button_42.SetMinSize((100, 50))
self.button_43.SetMinSize((100, 50))
self.button_44.SetMinSize((100, 50))
self.button_46.SetMinSize((100, 50))
self.button_45.SetMinSize((100, 50))
self.button_47.SetMinSize((100, 50))
self.button_48.SetMinSize((100, 50))
self.button_49.SetMinSize((100, 50))
self.button_50.SetMinSize((100, 50))
self.button_51.SetMinSize((100, 50))
self.button_52.SetMinSize((100, 50))
# end wxGlade
def __do_layout(self):
# begin wxGlade: MyFrame.__do_layout
sizer_2 = wx.BoxSizer(wx.VERTICAL)
sizer_3 = wx.BoxSizer(wx.VERTICAL)
grid_sizer_1 = wx.GridSizer(4, 4, 0, 0)
sizer_3.Add(self.text_ctrl_1, 0, 0, 0)
grid_sizer_1.Add(self.button_37, 0, 0, 0)
grid_sizer_1.Add(self.button_38, 0, 0, 0)
grid_sizer_1.Add(self.button_39, 0, 0, 0)
grid_sizer_1.Add(self.button_40, 0, 0, 0)
grid_sizer_1.Add(self.button_41, 0, 0, 0)
grid_sizer_1.Add(self.button_42, 0, 0, 0)
grid_sizer_1.Add(self.button_43, 0, 0, 0)
grid_sizer_1.Add(self.button_44, 0, 0, 0)
grid_sizer_1.Add(self.button_46, 0, 0, 0)
grid_sizer_1.Add(self.button_45, 0, 0, 0)
grid_sizer_1.Add(self.button_47, 0, 0, 0)
grid_sizer_1.Add(self.button_48, 0, 0, 0)
grid_sizer_1.Add(self.button_49, 0, 0, 0)
grid_sizer_1.Add(self.button_50, 0, 0, 0)
grid_sizer_1.Add(self.button_51, 0, 0, 0)
grid_sizer_1.Add(self.button_52, 0, 0, 0)
sizer_3.Add(grid_sizer_1, 1, wx.EXPAND, 0)
sizer_2.Add(sizer_3, 1, wx.EXPAND, 0)
self.SetSizer(sizer_2)
sizer_2.Fit(self)
self.Layout()
# end wxGlade
def bu1(self, event): # wxGlade: MyFrame.<event_handler>
self.text_ctrl_1.AppendText("1")
event.Skip()
def bu2(self, event): # wxGlade: MyFrame.<event_handler>
self.text_ctrl_1.AppendText("2")
event.Skip()
def bu3(self, event): # wxGlade: MyFrame.<event_handler>
self.text_ctrl_1.AppendText("3")
event.Skip()
def bu_plus(self, event): # wxGlade: MyFrame.<event_handler>
self.num1=self.text_ctrl_1.GetValue()
self.op="+"
self.text_ctrl_1.Clear()
event.Skip()
def bu4(self, event): # wxGlade: MyFrame.<event_handler>
self.text_ctrl_1.AppendText("4")
event.Skip()
def bu5(self, event): # wxGlade: MyFrame.<event_handler>
self.text_ctrl_1.AppendText("5")
event.Skip()
def bu6(self, event): # wxGlade: MyFrame.<event_handler>
self.text_ctrl_1.AppendText("6")
event.Skip()
def bu_min(self, event): # wxGlade: MyFrame.<event_handler>
self.num1=self.text_ctrl_1.GetValue()
self.op="-"
self.text_ctrl_1.Clear()
event.Skip()
def bu7(self, event): # wxGlade: MyFrame.<event_handler>
self.text_ctrl_1.AppendText("7")
event.Skip()
def bu8(self, event): # wxGlade: MyFrame.<event_handler>
self.text_ctrl_1.AppendText("8")
event.Skip()
def bu9(self, event): # wxGlade: MyFrame.<event_handler>
self.text_ctrl_1.AppendText("9")
event.Skip()
def bu_mul(self, event): # wxGlade: MyFrame.<event_handler>
self.num1=self.text_ctrl_1.GetValue()
self.op="x"
self.text_ctrl_1.Clear()
event.Skip()
def bu_clear(self, event): # wxGlade: MyFrame.<event_handler>
self.text_ctrl_1.Clear()
event.Skip()
def bu0(self, event): # wxGlade: MyFrame.<event_handler>
self.text_ctrl_1.AppendText("0")
event.Skip()
def bu_chu(self, event): # wxGlade: MyFrame.<event_handler>
self.num1=self.text_ctrl_1.GetValue()
self.op="/"
self.text_ctrl_1.Clear()
event.Skip()
def bu_result(self, event): # wxGlade: MyFrame.<event_handler>
self.num2=self.text_ctrl_1.GetValue()
num1=int(self.num1)
num2=int(self.num2)
if self.op=="+":
self.text_ctrl_1.SetValue(str(num1+num2))
elif self.op=="-":
self.text_ctrl_1.SetValue(str(num1-num2))
elif self.op=="x":
self.text_ctrl_1.SetValue(str(num1*num2))
elif self.op=="/":
self.text_ctrl_1.SetValue(str(num1/num2))
event.Skip()
# end of class MyFrame
if __name__ == "__main__":
app=wx.App(False)
myframe=MyFrame(None)
app.MainLoop()
按钮的ID和名称主要依赖wxGlade自动生成。界面未做过多美化,仅用于练习,效果如图所示:

以上就是本文的全部内容,希望对读者的学习有所帮助,也欢迎大家支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













