<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python定做個(gè)屬于自己的計(jì)算器

          共 3503字,需瀏覽 8分鐘

           ·

          2019-12-08 23:31

          本文一起來(lái)用Python實(shí)現(xiàn)一個(gè)屬于自己的計(jì)算器,小而美哈!

          1 ui設(shè)計(jì)

          使用qt designer ,按裝anaconda后,在如下路徑找到:

          conda3.05\Library\bin

          designer.exe文件,雙擊啟動(dòng):

          8dc729cf360629736056279ff9b1f9b1.webp


          創(chuàng)建窗體,命名為XiaoDing,整個(gè)的界面如下所示:

          ce737eb22c31fac910dba85cb22b7c64.webp


          qt 設(shè)計(jì)器提供的常用控件基本都能滿足開發(fā)需求,通過(guò)拖動(dòng)左側(cè)的控件,很便捷的就能搭建出如下的UI界面,比傳統(tǒng)的手寫控件代碼要方便很多。

          最終設(shè)計(jì)的計(jì)算器XiaoDing界面如下,

          1c5f0b688610ad3a37ac6c61d662a103.webp


          比如,其中一個(gè)用于計(jì)算器顯示的對(duì)象:lcdNumber,對(duì)象的類型為:LCD Number。右側(cè)為計(jì)算器中用到的所有對(duì)象。

          23afda0c3357967d22b24d6c5e4061c8.webp


          18a6d23184a8cab397eb8c7b9d83234f.webp


          2 轉(zhuǎn)py文件

          使用如下命令,將設(shè)計(jì)好的ui文件轉(zhuǎn)為py文件

          pyuic5 -o ./calculator/MainWindow.py ./calculator/mainwindow.ui

          3 計(jì)算器實(shí)現(xiàn)邏輯

          導(dǎo)入庫(kù):

          from?PyQt5.QtGui?import?*
          from?PyQt5.QtWidgets?import?*
          from?PyQt5.QtCore?import?*

          import?operator

          from?MainWindow?import?Ui_MainWindow

          主題代碼邏輯很精簡(jiǎn):

          #?Calculator?state.
          READY?=?0
          INPUT?=?1


          class?MainWindow(QMainWindow,?Ui_MainWindow):
          ????def?__init__(self,?*args,?**kwargs):
          ????????super(MainWindow,?self).__init__(*args,?**kwargs)
          ????????self.setupUi(self)

          ????????#?Setup?numbers.
          ????????for?n?in?range(0,?10):
          ????????????getattr(self,?'pushButton_n%s'?%?n).pressed.connect(lambda?v=n:?self.input_number(v))

          ????????#?Setup?operations.
          ????????self.pushButton_add.pressed.connect(lambda:?self.operation(operator.add))
          ????????self.pushButton_sub.pressed.connect(lambda:?self.operation(operator.sub))
          ????????self.pushButton_mul.pressed.connect(lambda:?self.operation(operator.mul))
          ????????self.pushButton_div.pressed.connect(lambda:?self.operation(operator.truediv))??#?operator.div?for?Python2.7

          ????????self.pushButton_pc.pressed.connect(self.operation_pc)
          ????????self.pushButton_eq.pressed.connect(self.equals)

          ????????#?Setup?actions
          ????????self.actionReset.triggered.connect(self.reset)
          ????????self.pushButton_ac.pressed.connect(self.reset)

          ????????self.actionExit.triggered.connect(self.close)

          ????????self.pushButton_m.pressed.connect(self.memory_store)
          ????????self.pushButton_mr.pressed.connect(self.memory_recall)

          ????????self.memory?=?0
          ????????self.reset()

          ????????self.show()

          基礎(chǔ)方法:
          ????def?input_number(self,?v):
          ????????if?self.state?==?READY:
          ????????????self.state?=?INPUT
          ????????????self.stack[-1]?=?v
          ????????else:
          ????????????self.stack[-1]?=?self.stack[-1]?*?10?+?v

          ????????self.display()

          ????def?display(self):
          ????????self.lcdNumber.display(self.stack[-1])

          按鈕RE,M, RE對(duì)應(yīng)的實(shí)現(xiàn)邏輯:

          ????def?reset(self):
          ????????self.state?=?READY
          ????????self.stack?=?[0]
          ????????self.last_operation?=?None
          ????????self.current_op?=?None
          ????????self.display()

          ????def?memory_store(self):
          ????????self.memory?=?self.lcdNumber.value()

          ????def?memory_recall(self):
          ????????self.state?=?INPUT
          ????????self.stack[-1]?=?self.memory
          ????????self.display()

          +,-,x,/,/100對(duì)應(yīng)實(shí)現(xiàn)方法:

          def?operation(self,?op):
          ????????if?self.current_op:??#?Complete?the?current?operation
          ????????????self.equals()

          ????????self.stack.append(0)
          ????????self.state?=?INPUT
          ????????self.current_op?=?op

          ????def?operation_pc(self):
          ????????self.state?=?INPUT
          ????????self.stack[-1]?*=?0.01
          ????????self.display()

          =號(hào)對(duì)應(yīng)的方法實(shí)現(xiàn):

          ?def?equals(self):
          ????????if?self.state?==?READY?and?self.last_operation:
          ????????????s,?self.current_op?=?self.last_operation
          ????????????self.stack.append(s)

          ????????if?self.current_op:
          ????????????self.last_operation?=?self.stack[-1],?self.current_op

          ????????????try:
          ????????????????self.stack?=?[self.current_op(*self.stack)]
          ????????????except?Exception:
          ????????????????self.lcdNumber.display('Err')
          ????????????????self.stack?=?[0]
          ????????????else:
          ????????????????self.current_op?=?None
          ????????????????self.state?=?READY
          ????????????????self.display()

          main函數(shù):

          if?__name__?==?'__main__':
          ????app?=?QApplication([])
          ????app.setApplicationName("XiaoDing")

          ????window?=?MainWindow()
          ????app.exec_()

          如果需要完整代碼,直接在公眾號(hào)"程序IT圈",后臺(tái)聊天框回復(fù)【計(jì)算器】,就可以獲取!啟動(dòng)后的界面如下:

          f874e1667d2ca6721a448ffb173f2461.webp

          關(guān)注小猿公眾號(hào),每天學(xué)習(xí)一道Python題


          瀏覽 88
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  操国产嫩逼美女 | 色综合加勒比 | 天天干天天操天天 | 国产一级婬乱片AV片AAA毛片 | 午夜成人网在线 |