PyQt是基于跨平台的图形界面C++开发工具Qt加Python包装的一个GPL软件(GPL是GNU General Public License的缩写,是GNU通用公共授权非正式的中文翻译),Qt基于Qt Designer提供了图形设计界面,通过绘制的图形界面使用PyUIC可以将图形界面转成Python代码文件(具体步骤请参考《第15.6节 PyQt5安装与配置》),这样图形界面设计和处理逻辑分离,可以快速实现应用。

本文解释的计算器由Qt Designer完成界面设计,并将鼠标点击事件与槽函数关联以响应界面输入,最后使用Python动态编译的eval函数实现表达式结果的计算,除了图形界面转换的代码外,其他处理代码只有36行,但计算器的功能还比较齐全。详细步骤如下:

一、设计计算器界面

在Qt Designer中设计计算器的图形界面,如下:



界面文件保存到Ui_Calculator.ui文件中。

二、定义按键与响应函数的关联

在Qt Designer中通过F4进入事件与槽函数的编辑界面,将按键与槽函数建立映射关系,以使得按键后调用对应槽函数进行响应,本次在主程序中设计了三个槽函数,分别为:

1、CalObjPressed响应所有数字、括号、计算符的鼠标点击;

2、ClearInput响应Clear按键的鼠标点击;

3、ExecuteCalculate:响应等号按键的鼠标点击。

三、将UI转换成Py代码

调用《第15.6节 PyQt5安装与配置》介绍的PyUIC,将UI图形界面代码转换成py代码(这部分不含在36行代码内)。如图:



转换后的文件为Ui_Calculator.py。

四、建立主程序calculator.py

在PyCharm中新建工程calculator,同时新建一个工程名同名的calculator.py作为应用主程序。在主程序中实现如下内容:

1、导入PyQt相关库和sys库

  1. import sys
  2. from PyQt5 import QtWidgets
  3. from PyQt5.QtWidgets import QPushButton

2、导入Ui界面生成的py模块

  1. from ui_Calculator import Ui_CaculatorWin

3、从Ui自动生成类派生出应用程序主窗口类w_Calculator并在构造函数中完成初始化

  1. class w_Calculator(QtWidgets.QWidget, Ui_CaculatorWin):
  2. def __init__(self):
  3. super(w_Calculator, self).__init__()
  4. self.setupUi(self)
  5. self.expr = ''
  6. self.resultfinished = False

注意:上面的构造函数前2行代码是标准代码,是所有Ui类派生类都要有的。后面初始化了两个实例变量,其中expr 保存输入表达式,resultfinished 表示表达式计算完成。

4、在w_Calculator实习三个槽函数代码

1>、CalObjPressed

该函数响应等号按键,当按下等号键时,对显示界面的表达式调用动态编译函数eval进行计算,代码如下:

  1. def CalObjPressed(self):
  2. if self.resultfinished:self.ClearInput()
  3. pButton = self.sender()
  4. char = pButton.text()
  5. self.CalculatorDisplay.insertPlainText(char)
  6. self.expr += char

2>、ClearInput(self)

该函数响应界面上的Clear按键,清除输入的表达式,代码如下:

  1. def ClearInput(self):
  2. self.CalculatorDisplay.clear()
  3. self.expr = ''
  4. self.resultfinished = False

3>ExecuteCalculate

响应等号按键进行表达式计算,代码如下:

  1. def ExecuteCalculate(self):
  2. self.CalculatorDisplay.append("=")
  3. globalArea = {}
  4. try: result = eval(self.expr, globalArea)
  5. except Exception as e:
  6. self.CalculatorDisplay.append(f"计算结果错误,错误原因:\n{e}")
  7. else: self.CalculatorDisplay.append(str(result))
  8. self.resultfinished = True

5、完成主程序的应用代码

  1. if __name__ == '__main__':
  2. app = QtWidgets.QApplication(sys.argv)
  3. # mainwin = MediaPlayerWin()
  4. # mainwin.show()
  5. W = w_Calculator()
  6. W.show()
  7. sys.exit(app.exec_())

这样一个完整的计算器程序就完成了,真正需要自己完成的代码就36行。

下面是运行效果截图:

附件1、完整主程序代码

  1. import sys
  2. from PyQt5 import QtWidgets
  3. from PyQt5.QtWidgets import QPushButton
  4. from ui_Calculator import Ui_CaculatorWin
  5. class w_Calculator(QtWidgets.QWidget, Ui_CaculatorWin):
  6. def __init__(self):
  7. super(w_Calculator, self).__init__()
  8. self.setupUi(self)
  9. self.expr = ''
  10. self.resultfinished = False
  11. def CalObjPressed(self):
  12. if self.resultfinished:self.ClearInput()
  13. pButton = self.sender()
  14. char = pButton.text()
  15. self.CalculatorDisplay.insertPlainText(char)
  16. self.expr += char
  17. def ExecuteCalculate(self):
  18. self.CalculatorDisplay.append("=")
  19. globalArea = {}
  20. try: result = eval(self.expr, globalArea)
  21. except Exception as e:
  22. self.CalculatorDisplay.append(f"计算结果错误,错误原因:\n{e}")
  23. else: self.CalculatorDisplay.append(str(result))
  24. self.resultfinished = True
  25. def ClearInput(self):
  26. self.CalculatorDisplay.clear()
  27. self.expr = ''
  28. self.resultfinished = False
  29. if __name__ == '__main__':
  30. app = QtWidgets.QApplication(sys.argv)
  31. # mainwin = MediaPlayerWin()
  32. # mainwin.show()
  33. W = w_Calculator()
  34. W.show()
  35. sys.exit(app.exec_())

2、UI文件ui_Calculator.ui的内容

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <ui version="4.0">
  3. <class>CaculatorWin</class>
  4. <widget class="QWidget" name="CaculatorWin">
  5. <property name="geometry">
  6. <rect>
  7. <x>0</x>
  8. <y>0</y>
  9. <width>339</width>
  10. <height>314</height>
  11. </rect>
  12. </property>
  13. <property name="windowTitle">
  14. <string>计算器</string>
  15. </property>
  16. <property name="windowIcon">
  17. <iconset>
  18. <normaloff>C:/Users/jwp/资源/cal.jpg</normaloff>C:/Users/jwp/资源/cal.jpg</iconset>
  19. </property>
  20. <widget class="QWidget" name="gridLayoutWidget">
  21. <property name="geometry">
  22. <rect>
  23. <x>10</x>
  24. <y>140</y>
  25. <width>320</width>
  26. <height>170</height>
  27. </rect>
  28. </property>
  29. <layout class="QGridLayout" name="gridLayout_2">
  30. <item row="2" column="3">
  31. <widget class="QPushButton" name="pushButton_dot">
  32. <property name="text">
  33. <string>.</string>
  34. </property>
  35. </widget>
  36. </item>
  37. <item row="0" column="2">
  38. <widget class="QPushButton" name="pushButton_Multiply">
  39. <property name="text">
  40. <string>*</string>
  41. </property>
  42. </widget>
  43. </item>
  44. <item row="6" column="0">
  45. <widget class="QPushButton" name="pushButton0">
  46. <property name="text">
  47. <string>0</string>
  48. </property>
  49. </widget>
  50. </item>
  51. <item row="0" column="3">
  52. <widget class="QPushButton" name="pushButton_div">
  53. <property name="text">
  54. <string>/</string>
  55. </property>
  56. </widget>
  57. </item>
  58. <item row="6" column="1">
  59. <widget class="QPushButton" name="pushButton_leftbrackets">
  60. <property name="text">
  61. <string>(</string>
  62. </property>
  63. </widget>
  64. </item>
  65. <item row="3" column="1">
  66. <widget class="QPushButton" name="pushButton5">
  67. <property name="text">
  68. <string>5</string>
  69. </property>
  70. </widget>
  71. </item>
  72. <item row="3" column="3">
  73. <widget class="QPushButton" name="pushButton_mod">
  74. <property name="text">
  75. <string>%</string>
  76. </property>
  77. </widget>
  78. </item>
  79. <item row="2" column="2">
  80. <widget class="QPushButton" name="pushButton3">
  81. <property name="text">
  82. <string>3</string>
  83. </property>
  84. </widget>
  85. </item>
  86. <item row="0" column="0">
  87. <widget class="QPushButton" name="pushButton_Add">
  88. <property name="text">
  89. <string>+</string>
  90. </property>
  91. </widget>
  92. </item>
  93. <item row="2" column="0">
  94. <widget class="QPushButton" name="pushButton1">
  95. <property name="text">
  96. <string>1</string>
  97. </property>
  98. </widget>
  99. </item>
  100. <item row="4" column="2">
  101. <widget class="QPushButton" name="pushButton9">
  102. <property name="text">
  103. <string>9</string>
  104. </property>
  105. </widget>
  106. </item>
  107. <item row="4" column="1">
  108. <widget class="QPushButton" name="pushButton8">
  109. <property name="text">
  110. <string>8</string>
  111. </property>
  112. </widget>
  113. </item>
  114. <item row="6" column="2">
  115. <widget class="QPushButton" name="pushButton_rightbrackets">
  116. <property name="text">
  117. <string>)</string>
  118. </property>
  119. </widget>
  120. </item>
  121. <item row="3" column="2">
  122. <widget class="QPushButton" name="pushButton6">
  123. <property name="text">
  124. <string>6</string>
  125. </property>
  126. </widget>
  127. </item>
  128. <item row="3" column="0">
  129. <widget class="QPushButton" name="pushButton4">
  130. <property name="text">
  131. <string>4</string>
  132. </property>
  133. </widget>
  134. </item>
  135. <item row="2" column="1">
  136. <widget class="QPushButton" name="pushButton2">
  137. <property name="text">
  138. <string>2</string>
  139. </property>
  140. </widget>
  141. </item>
  142. <item row="0" column="1">
  143. <widget class="QPushButton" name="pushButton_Minus">
  144. <property name="text">
  145. <string>-</string>
  146. </property>
  147. </widget>
  148. </item>
  149. <item row="4" column="0">
  150. <widget class="QPushButton" name="pushButton7">
  151. <property name="text">
  152. <string>7</string>
  153. </property>
  154. </widget>
  155. </item>
  156. <item row="6" column="3">
  157. <widget class="QPushButton" name="pushButton_Cal">
  158. <property name="text">
  159. <string>=</string>
  160. </property>
  161. </widget>
  162. </item>
  163. <item row="4" column="3">
  164. <widget class="QPushButton" name="pushButton_Clear">
  165. <property name="text">
  166. <string>Clear</string>
  167. </property>
  168. </widget>
  169. </item>
  170. </layout>
  171. </widget>
  172. <widget class="QTextBrowser" name="CalculatorDisplay">
  173. <property name="geometry">
  174. <rect>
  175. <x>10</x>
  176. <y>10</y>
  177. <width>321</width>
  178. <height>121</height>
  179. </rect>
  180. </property>
  181. </widget>
  182. </widget>
  183. <resources/>
  184. <connections>
  185. <connection>
  186. <sender>pushButton_Add</sender>
  187. <signal>clicked()</signal>
  188. <receiver>CaculatorWin</receiver>
  189. <slot>CalObjPressed()</slot>
  190. <hints>
  191. <hint type="sourcelabel">
  192. <x>55</x>
  193. <y>160</y>
  194. </hint>
  195. <hint type="destinationlabel">
  196. <x>3</x>
  197. <y>113</y>
  198. </hint>
  199. </hints>
  200. </connection>
  201. <connection>
  202. <sender>pushButton_Minus</sender>
  203. <signal>clicked()</signal>
  204. <receiver>CaculatorWin</receiver>
  205. <slot>CalObjPressed()</slot>
  206. <hints>
  207. <hint type="sourcelabel">
  208. <x>115</x>
  209. <y>159</y>
  210. </hint>
  211. <hint type="destinationlabel">
  212. <x>3</x>
  213. <y>139</y>
  214. </hint>
  215. </hints>
  216. </connection>
  217. <connection>
  218. <sender>pushButton_Multiply</sender>
  219. <signal>clicked()</signal>
  220. <receiver>CaculatorWin</receiver>
  221. <slot>CalObjPressed()</slot>
  222. <hints>
  223. <hint type="sourcelabel">
  224. <x>204</x>
  225. <y>156</y>
  226. </hint>
  227. <hint type="destinationlabel">
  228. <x>336</x>
  229. <y>128</y>
  230. </hint>
  231. </hints>
  232. </connection>
  233. <connection>
  234. <sender>pushButton_div</sender>
  235. <signal>clicked()</signal>
  236. <receiver>CaculatorWin</receiver>
  237. <slot>CalObjPressed()</slot>
  238. <hints>
  239. <hint type="sourcelabel">
  240. <x>277</x>
  241. <y>155</y>
  242. </hint>
  243. <hint type="destinationlabel">
  244. <x>336</x>
  245. <y>98</y>
  246. </hint>
  247. </hints>
  248. </connection>
  249. <connection>
  250. <sender>pushButton1</sender>
  251. <signal>clicked()</signal>
  252. <receiver>CaculatorWin</receiver>
  253. <slot>CalObjPressed()</slot>
  254. <hints>
  255. <hint type="sourcelabel">
  256. <x>72</x>
  257. <y>189</y>
  258. </hint>
  259. <hint type="destinationlabel">
  260. <x>336</x>
  261. <y>157</y>
  262. </hint>
  263. </hints>
  264. </connection>
  265. <connection>
  266. <sender>pushButton2</sender>
  267. <signal>clicked()</signal>
  268. <receiver>CaculatorWin</receiver>
  269. <slot>CalObjPressed()</slot>
  270. <hints>
  271. <hint type="sourcelabel">
  272. <x>137</x>
  273. <y>187</y>
  274. </hint>
  275. <hint type="destinationlabel">
  276. <x>336</x>
  277. <y>163</y>
  278. </hint>
  279. </hints>
  280. </connection>
  281. <connection>
  282. <sender>pushButton3</sender>
  283. <signal>clicked()</signal>
  284. <receiver>CaculatorWin</receiver>
  285. <slot>CalObjPressed()</slot>
  286. <hints>
  287. <hint type="sourcelabel">
  288. <x>222</x>
  289. <y>184</y>
  290. </hint>
  291. <hint type="destinationlabel">
  292. <x>336</x>
  293. <y>84</y>
  294. </hint>
  295. </hints>
  296. </connection>
  297. <connection>
  298. <sender>pushButton_dot</sender>
  299. <signal>clicked()</signal>
  300. <receiver>CaculatorWin</receiver>
  301. <slot>CalObjPressed()</slot>
  302. <hints>
  303. <hint type="sourcelabel">
  304. <x>301</x>
  305. <y>184</y>
  306. </hint>
  307. <hint type="destinationlabel">
  308. <x>336</x>
  309. <y>57</y>
  310. </hint>
  311. </hints>
  312. </connection>
  313. <connection>
  314. <sender>pushButton4</sender>
  315. <signal>clicked()</signal>
  316. <receiver>CaculatorWin</receiver>
  317. <slot>CalObjPressed()</slot>
  318. <hints>
  319. <hint type="sourcelabel">
  320. <x>38</x>
  321. <y>219</y>
  322. </hint>
  323. <hint type="destinationlabel">
  324. <x>336</x>
  325. <y>40</y>
  326. </hint>
  327. </hints>
  328. </connection>
  329. <connection>
  330. <sender>pushButton5</sender>
  331. <signal>clicked()</signal>
  332. <receiver>CaculatorWin</receiver>
  333. <slot>CalObjPressed()</slot>
  334. <hints>
  335. <hint type="sourcelabel">
  336. <x>110</x>
  337. <y>221</y>
  338. </hint>
  339. <hint type="destinationlabel">
  340. <x>336</x>
  341. <y>29</y>
  342. </hint>
  343. </hints>
  344. </connection>
  345. <connection>
  346. <sender>pushButton6</sender>
  347. <signal>clicked()</signal>
  348. <receiver>CaculatorWin</receiver>
  349. <slot>CalObjPressed()</slot>
  350. <hints>
  351. <hint type="sourcelabel">
  352. <x>194</x>
  353. <y>221</y>
  354. </hint>
  355. <hint type="destinationlabel">
  356. <x>336</x>
  357. <y>22</y>
  358. </hint>
  359. </hints>
  360. </connection>
  361. <connection>
  362. <sender>pushButton_mod</sender>
  363. <signal>clicked()</signal>
  364. <receiver>CaculatorWin</receiver>
  365. <slot>CalObjPressed()</slot>
  366. <hints>
  367. <hint type="sourcelabel">
  368. <x>269</x>
  369. <y>223</y>
  370. </hint>
  371. <hint type="destinationlabel">
  372. <x>336</x>
  373. <y>8</y>
  374. </hint>
  375. </hints>
  376. </connection>
  377. <connection>
  378. <sender>pushButton7</sender>
  379. <signal>clicked()</signal>
  380. <receiver>CaculatorWin</receiver>
  381. <slot>CalObjPressed()</slot>
  382. <hints>
  383. <hint type="sourcelabel">
  384. <x>60</x>
  385. <y>255</y>
  386. </hint>
  387. <hint type="destinationlabel">
  388. <x>336</x>
  389. <y>192</y>
  390. </hint>
  391. </hints>
  392. </connection>
  393. <connection>
  394. <sender>pushButton8</sender>
  395. <signal>clicked()</signal>
  396. <receiver>CaculatorWin</receiver>
  397. <slot>CalObjPressed()</slot>
  398. <hints>
  399. <hint type="sourcelabel">
  400. <x>129</x>
  401. <y>252</y>
  402. </hint>
  403. <hint type="destinationlabel">
  404. <x>336</x>
  405. <y>219</y>
  406. </hint>
  407. </hints>
  408. </connection>
  409. <connection>
  410. <sender>pushButton9</sender>
  411. <signal>clicked()</signal>
  412. <receiver>CaculatorWin</receiver>
  413. <slot>CalObjPressed()</slot>
  414. <hints>
  415. <hint type="sourcelabel">
  416. <x>226</x>
  417. <y>252</y>
  418. </hint>
  419. <hint type="destinationlabel">
  420. <x>336</x>
  421. <y>244</y>
  422. </hint>
  423. </hints>
  424. </connection>
  425. <connection>
  426. <sender>pushButton0</sender>
  427. <signal>clicked()</signal>
  428. <receiver>CaculatorWin</receiver>
  429. <slot>CalObjPressed()</slot>
  430. <hints>
  431. <hint type="sourcelabel">
  432. <x>37</x>
  433. <y>287</y>
  434. </hint>
  435. <hint type="destinationlabel">
  436. <x>29</x>
  437. <y>313</y>
  438. </hint>
  439. </hints>
  440. </connection>
  441. <connection>
  442. <sender>pushButton_leftbrackets</sender>
  443. <signal>clicked()</signal>
  444. <receiver>CaculatorWin</receiver>
  445. <slot>CalObjPressed()</slot>
  446. <hints>
  447. <hint type="sourcelabel">
  448. <x>104</x>
  449. <y>289</y>
  450. </hint>
  451. <hint type="destinationlabel">
  452. <x>98</x>
  453. <y>313</y>
  454. </hint>
  455. </hints>
  456. </connection>
  457. <connection>
  458. <sender>pushButton_rightbrackets</sender>
  459. <signal>clicked()</signal>
  460. <receiver>CaculatorWin</receiver>
  461. <slot>CalObjPressed()</slot>
  462. <hints>
  463. <hint type="sourcelabel">
  464. <x>194</x>
  465. <y>292</y>
  466. </hint>
  467. <hint type="destinationlabel">
  468. <x>190</x>
  469. <y>313</y>
  470. </hint>
  471. </hints>
  472. </connection>
  473. <connection>
  474. <sender>pushButton_Cal</sender>
  475. <signal>clicked()</signal>
  476. <receiver>CaculatorWin</receiver>
  477. <slot>ExecuteCalculate()</slot>
  478. <hints>
  479. <hint type="sourcelabel">
  480. <x>279</x>
  481. <y>288</y>
  482. </hint>
  483. <hint type="destinationlabel">
  484. <x>277</x>
  485. <y>313</y>
  486. </hint>
  487. </hints>
  488. </connection>
  489. <connection>
  490. <sender>pushButton_Clear</sender>
  491. <signal>clicked()</signal>
  492. <receiver>CaculatorWin</receiver>
  493. <slot>ClearInput()</slot>
  494. <hints>
  495. <hint type="sourcelabel">
  496. <x>306</x>
  497. <y>257</y>
  498. </hint>
  499. <hint type="destinationlabel">
  500. <x>336</x>
  501. <y>304</y>
  502. </hint>
  503. </hints>
  504. </connection>
  505. </connections>
  506. <slots>
  507. <slot>digitPressed()</slot>
  508. <slot>digitPressed(digit)</slot>
  509. <slot>CalObjPressed()</slot>
  510. <slot>ExecuteCalculate()</slot>
  511. <slot>ClearInput()</slot>
  512. </slots>
  513. </ui>

附件3、Ui转换的ui_Calculator.py文件内容

  1. # -*- coding: utf-8 -*-
  2. # Form implementation generated from reading ui file 'ui_Calculator.ui'
  3. #
  4. # Created by: PyQt5 UI code generator 5.13.0
  5. #
  6. # WARNING! All changes made in this file will be lost!
  7. from PyQt5 import QtCore, QtGui, QtWidgets
  8. class Ui_CaculatorWin(object):
  9. def setupUi(self, CaculatorWin):
  10. CaculatorWin.setObjectName("CaculatorWin")
  11. CaculatorWin.resize(339, 314)
  12. icon = QtGui.QIcon()
  13. icon.addPixmap(QtGui.QPixmap("C:/Users/jwp/资源/cal.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
  14. CaculatorWin.setWindowIcon(icon)
  15. self.gridLayoutWidget = QtWidgets.QWidget(CaculatorWin)
  16. self.gridLayoutWidget.setGeometry(QtCore.QRect(10, 140, 320, 170))
  17. self.gridLayoutWidget.setObjectName("gridLayoutWidget")
  18. self.gridLayout_2 = QtWidgets.QGridLayout(self.gridLayoutWidget)
  19. self.gridLayout_2.setContentsMargins(0, 0, 0, 0)
  20. self.gridLayout_2.setObjectName("gridLayout_2")
  21. self.pushButton_dot = QtWidgets.QPushButton(self.gridLayoutWidget)
  22. self.pushButton_dot.setObjectName("pushButton_dot")
  23. self.gridLayout_2.addWidget(self.pushButton_dot, 2, 3, 1, 1)
  24. self.pushButton_Multiply = QtWidgets.QPushButton(self.gridLayoutWidget)
  25. self.pushButton_Multiply.setObjectName("pushButton_Multiply")
  26. self.gridLayout_2.addWidget(self.pushButton_Multiply, 0, 2, 1, 1)
  27. self.pushButton0 = QtWidgets.QPushButton(self.gridLayoutWidget)
  28. self.pushButton0.setObjectName("pushButton0")
  29. self.gridLayout_2.addWidget(self.pushButton0, 6, 0, 1, 1)
  30. self.pushButton_div = QtWidgets.QPushButton(self.gridLayoutWidget)
  31. self.pushButton_div.setObjectName("pushButton_div")
  32. self.gridLayout_2.addWidget(self.pushButton_div, 0, 3, 1, 1)
  33. self.pushButton_leftbrackets = QtWidgets.QPushButton(self.gridLayoutWidget)
  34. self.pushButton_leftbrackets.setObjectName("pushButton_leftbrackets")
  35. self.gridLayout_2.addWidget(self.pushButton_leftbrackets, 6, 1, 1, 1)
  36. self.pushButton5 = QtWidgets.QPushButton(self.gridLayoutWidget)
  37. self.pushButton5.setObjectName("pushButton5")
  38. self.gridLayout_2.addWidget(self.pushButton5, 3, 1, 1, 1)
  39. self.pushButton_mod = QtWidgets.QPushButton(self.gridLayoutWidget)
  40. self.pushButton_mod.setObjectName("pushButton_mod")
  41. self.gridLayout_2.addWidget(self.pushButton_mod, 3, 3, 1, 1)
  42. self.pushButton3 = QtWidgets.QPushButton(self.gridLayoutWidget)
  43. self.pushButton3.setObjectName("pushButton3")
  44. self.gridLayout_2.addWidget(self.pushButton3, 2, 2, 1, 1)
  45. self.pushButton_Add = QtWidgets.QPushButton(self.gridLayoutWidget)
  46. self.pushButton_Add.setObjectName("pushButton_Add")
  47. self.gridLayout_2.addWidget(self.pushButton_Add, 0, 0, 1, 1)
  48. self.pushButton1 = QtWidgets.QPushButton(self.gridLayoutWidget)
  49. self.pushButton1.setObjectName("pushButton1")
  50. self.gridLayout_2.addWidget(self.pushButton1, 2, 0, 1, 1)
  51. self.pushButton9 = QtWidgets.QPushButton(self.gridLayoutWidget)
  52. self.pushButton9.setObjectName("pushButton9")
  53. self.gridLayout_2.addWidget(self.pushButton9, 4, 2, 1, 1)
  54. self.pushButton8 = QtWidgets.QPushButton(self.gridLayoutWidget)
  55. self.pushButton8.setObjectName("pushButton8")
  56. self.gridLayout_2.addWidget(self.pushButton8, 4, 1, 1, 1)
  57. self.pushButton_rightbrackets = QtWidgets.QPushButton(self.gridLayoutWidget)
  58. self.pushButton_rightbrackets.setObjectName("pushButton_rightbrackets")
  59. self.gridLayout_2.addWidget(self.pushButton_rightbrackets, 6, 2, 1, 1)
  60. self.pushButton6 = QtWidgets.QPushButton(self.gridLayoutWidget)
  61. self.pushButton6.setObjectName("pushButton6")
  62. self.gridLayout_2.addWidget(self.pushButton6, 3, 2, 1, 1)
  63. self.pushButton4 = QtWidgets.QPushButton(self.gridLayoutWidget)
  64. self.pushButton4.setObjectName("pushButton4")
  65. self.gridLayout_2.addWidget(self.pushButton4, 3, 0, 1, 1)
  66. self.pushButton2 = QtWidgets.QPushButton(self.gridLayoutWidget)
  67. self.pushButton2.setObjectName("pushButton2")
  68. self.gridLayout_2.addWidget(self.pushButton2, 2, 1, 1, 1)
  69. self.pushButton_Minus = QtWidgets.QPushButton(self.gridLayoutWidget)
  70. self.pushButton_Minus.setObjectName("pushButton_Minus")
  71. self.gridLayout_2.addWidget(self.pushButton_Minus, 0, 1, 1, 1)
  72. self.pushButton7 = QtWidgets.QPushButton(self.gridLayoutWidget)
  73. self.pushButton7.setObjectName("pushButton7")
  74. self.gridLayout_2.addWidget(self.pushButton7, 4, 0, 1, 1)
  75. self.pushButton_Cal = QtWidgets.QPushButton(self.gridLayoutWidget)
  76. self.pushButton_Cal.setObjectName("pushButton_Cal")
  77. self.gridLayout_2.addWidget(self.pushButton_Cal, 6, 3, 1, 1)
  78. self.pushButton_Clear = QtWidgets.QPushButton(self.gridLayoutWidget)
  79. self.pushButton_Clear.setObjectName("pushButton_Clear")
  80. self.gridLayout_2.addWidget(self.pushButton_Clear, 4, 3, 1, 1)
  81. self.CalculatorDisplay = QtWidgets.QTextBrowser(CaculatorWin)
  82. self.CalculatorDisplay.setGeometry(QtCore.QRect(10, 10, 321, 121))
  83. self.CalculatorDisplay.setObjectName("CalculatorDisplay")
  84. self.retranslateUi(CaculatorWin)
  85. self.pushButton_Add.clicked.connect(CaculatorWin.CalObjPressed)
  86. self.pushButton_Minus.clicked.connect(CaculatorWin.CalObjPressed)
  87. self.pushButton_Multiply.clicked.connect(CaculatorWin.CalObjPressed)
  88. self.pushButton_div.clicked.connect(CaculatorWin.CalObjPressed)
  89. self.pushButton1.clicked.connect(CaculatorWin.CalObjPressed)
  90. self.pushButton2.clicked.connect(CaculatorWin.CalObjPressed)
  91. self.pushButton3.clicked.connect(CaculatorWin.CalObjPressed)
  92. self.pushButton_dot.clicked.connect(CaculatorWin.CalObjPressed)
  93. self.pushButton4.clicked.connect(CaculatorWin.CalObjPressed)
  94. self.pushButton5.clicked.connect(CaculatorWin.CalObjPressed)
  95. self.pushButton6.clicked.connect(CaculatorWin.CalObjPressed)
  96. self.pushButton_mod.clicked.connect(CaculatorWin.CalObjPressed)
  97. self.pushButton7.clicked.connect(CaculatorWin.CalObjPressed)
  98. self.pushButton8.clicked.connect(CaculatorWin.CalObjPressed)
  99. self.pushButton9.clicked.connect(CaculatorWin.CalObjPressed)
  100. self.pushButton0.clicked.connect(CaculatorWin.CalObjPressed)
  101. self.pushButton_leftbrackets.clicked.connect(CaculatorWin.CalObjPressed)
  102. self.pushButton_rightbrackets.clicked.connect(CaculatorWin.CalObjPressed)
  103. self.pushButton_Cal.clicked.connect(CaculatorWin.ExecuteCalculate)
  104. self.pushButton_Clear.clicked.connect(CaculatorWin.ClearInput)
  105. QtCore.QMetaObject.connectSlotsByName(CaculatorWin)
  106. def retranslateUi(self, CaculatorWin):
  107. _translate = QtCore.QCoreApplication.translate
  108. CaculatorWin.setWindowTitle(_translate("CaculatorWin", "计算器"))
  109. self.pushButton_dot.setText(_translate("CaculatorWin", "."))
  110. self.pushButton_Multiply.setText(_translate("CaculatorWin", "*"))
  111. self.pushButton0.setText(_translate("CaculatorWin", "0"))
  112. self.pushButton_div.setText(_translate("CaculatorWin", "/"))
  113. self.pushButton_leftbrackets.setText(_translate("CaculatorWin", "("))
  114. self.pushButton5.setText(_translate("CaculatorWin", "5"))
  115. self.pushButton_mod.setText(_translate("CaculatorWin", "%"))
  116. self.pushButton3.setText(_translate("CaculatorWin", "3"))
  117. self.pushButton_Add.setText(_translate("CaculatorWin", "+"))
  118. self.pushButton1.setText(_translate("CaculatorWin", "1"))
  119. self.pushButton9.setText(_translate("CaculatorWin", "9"))
  120. self.pushButton8.setText(_translate("CaculatorWin", "8"))
  121. self.pushButton_rightbrackets.setText(_translate("CaculatorWin", ")"))
  122. self.pushButton6.setText(_translate("CaculatorWin", "6"))
  123. self.pushButton4.setText(_translate("CaculatorWin", "4"))
  124. self.pushButton2.setText(_translate("CaculatorWin", "2"))
  125. self.pushButton_Minus.setText(_translate("CaculatorWin", "-"))
  126. self.pushButton7.setText(_translate("CaculatorWin", "7"))
  127. self.pushButton_Cal.setText(_translate("CaculatorWin", "="))
  128. self.pushButton_Clear.setText(_translate("CaculatorWin", "Clear"))

博客地址:https://blog.csdn.net/LaoYuanPython

老猿Python博客文章目录:https://blog.csdn.net/LaoYuanPython/article/details/98245036

使用PyQt(Python+Qt)+动态编译36行代码实现的计算器的更多相关文章

  1. 第15.28节 PyQt(Python+Qt)入门学习:Model/View架构中的便利类QTableWidget详解

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.引言 表格部件为应用程序提供标准的表格显示工具,在表格内可以管理基于行和列的数据项,表格中的最大 ...

  2. 第15.27节 PyQt(Python+Qt)入门学习:Model/View架构中的便利类QTreeWidget详解

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.引言 树部件(Tree Widget)是Qt Designer中 Item Widgets(It ...

  3. 第15.26节 PyQt(Python+Qt)入门学习:Model/View架构中的便利类QListWidget详解

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 列表部件(List Widget)对应类QListWidget,是从QListView派生 ...

  4. 第15.25节 PyQt(Python+Qt)入门学习:Model/View开发实战--使用QTableView展示Excel文件内容

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 在前面的订阅专栏<第十九章.Model/View开发:QTableView的功能及属 ...

  5. PyQt(Python+Qt)学习随笔:视图中类QAbstractItemView的dragDropOverwriteMode属性

    老猿Python博文目录 老猿Python博客地址 一.属性的作用 dragDropOverwriteMode属性用于控制视图的拖放行为,如果其值为True,则视图中选定的数据将在拖拽数据放下时被覆盖 ...

  6. PyQt(Python+Qt)学习随笔:视图中的dragDropMode属性对dragEnabled和acceptDrops属性的影响

    老猿Python博文目录 老猿Python博客地址 在<PyQt(Python+Qt)学习随笔:QAbstractItemView的dragEnabled和dragDropMode属性的关系&g ...

  7. 第15.14节 PyQt(Python+Qt)入门学习:Designer的Buttons按钮详解

    一.引言 Qt Designer中的Buttons部件包括Push Button(常规按钮.一般称按钮).Tool Button(工具按钮).Radio Button(单选按钮).Check Box( ...

  8. win环境下,用虚拟化工具打包Qt动态编译exe的过程(使用Enigma Virtual Box)

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://goldlion.blog.51cto.com/4127613/834075 引子 ...

  9. PyQt(Python+Qt)学习随笔:利用QWidget部件的palette以及ColorGroup、colorRole局部调整部件的特定范围颜色

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 在<PyQt(Python+Qt)学习随笔:QWidget部件的 ...

随机推荐

  1. 简单了解JSON Web令牌(JWT)

    什么是JWT JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的.自包含的方式,用于作为JSON对象在各方之间安全地传输信息.该信息可以被验证和信任,因为它 ...

  2. Linux系统下用户如何膝盖FTP用户密码

    其实修改ftp用户密码与修改普通用户的密码的过程是一眼高的其具体步骤如下 1.用root账户登录系统 2.使用passwd命令修改密码: 第一次输入密码后提示:The password fails t ...

  3. JavaScript封装一个函数效果类似内置方法concat()

    JavaScript封装一个函数效果类似内置方法concat() 首先回忆concat()的作用: concat() 方法用于连接两个或多个数组.该方法不会改变现有的数组,而仅仅会返回被连接数组的一个 ...

  4. day90:luffy:路飞项目前端部署

    目录 1.域名备案 2.域名解析 3.设置安全组 4.部署架构图 5.一些准备工作 6.docker 7.把前端项目通过nginx容器来运行 1.域名备案 腾讯云先要进行域名实名认证,实名认证三天后才 ...

  5. 在 Kubernetes Ingress 中支持 Websocket/Socket 服务

    Kubernetes Ingress 可将集群内部的 Service 通过 HTTP/HTTPS 的方式暴露供外部访问,并通过路径匹配规则定义服务的路由.但是 Ingress 对 TCP/UDP 的服 ...

  6. 一次webpack小规模优化经历

    这标题一点营销号味道都没有,怎么会有人看啊!(笑) 没人看也无所谓的文章背景: 八月份入职了新公司,是个好几年的老项目了,公司产品是存在很久了,但我接触到的代码版本保守估计应该是有个三年到四年这样的历 ...

  7. Ceph OSD服务失效自动启动控制

    前言 服务器上面的服务会因为各种各样的原因失败,磁盘故障,权限问题,或者是服务过载引起超时,这些都可能引起 这个在ceph里面systemctl unit 默认有个on-fail restart,默认 ...

  8. CSS 背景常用属性

    CSS 背景常用属性 background-color 这个属性过于简单, 以下写法均可 background-color:red; background-color:rgb(0,0,255); ba ...

  9. IGH_Master主站配置驱动伺服电机和变频器总结

    IGH_Master主站配置驱动伺服电机和变频器总结 Ethercat是倍福公司提出的一种工业现场总线协议,具有很好的实时性,IGH是一种开源的Ethercat主站实现协议,本文总结了一下使用IGH_ ...

  10. Docker学习第四天(Docker四种网络模式)

    Docker四种网络模式 实现原理 Docker使用Linux桥接(参考<Linux虚拟网络技术>),在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根 ...