本例讲解计算器的编程。涉及到的内容有:单行文本框、多行文本浏览框和按钮的应用,布局(含垂向箱型布局以及栅格布局)和 事件(含按钮单击,Enter建按下事件)。程序的显示效果如下图。计算的历史信息会保存在文本浏览框中。代码如下:
# _*_ coding:utf-8_*_ import sys from math import * from PyQt5.QtGui import * from PyQt5.QtWidgets import *
class MyWidget(QWidget):#创建一个QWidget的 子类 def __init__(self,parent = None):#初始化函数 super().__init__(parent)#调用基类的初始化函数 self.initUI()
def initUI(self): self.browser = QTextBrowser()#多行文本浏览框 self.lineedit = QLineEdit(u"在此处输入表达式")#单行文本输入框 #计算器按钮文本列表 bttexts = ['clear', '<--', '%', '/', '7', '8', '9', '*', '4', '5', '6', '-', '1', '2', '3','+', '()', '0', '.', '='] buttons = [] for bttext in bttexts: buttons.append(QPushButton(bttext))#循环创建多个按钮 glayout = QGridLayout()#创建网格布局 #向网格布局添加控件 .addWidget(Qwidget,row,column) # or .addWidget(Qwidget,row,column,rowSpan,columnSpan) for i in range(5): for j in range(4): glayout.addWidget(buttons[i*4+j], i , j)
vlayout = QVBoxLayout()#创建垂向箱型布局 vlayout.addWidget(self.browser)#往垂向箱型布局添加控件 vlayout.addWidget(self.lineedit) vlayout.addLayout(glayout)#往垂向箱型布局添加布局 self.setLayout(vlayout)#设置self 的布局 self.lineedit.selectAll()#单行文本输入框文字全选 self.lineedit.setFocus()#获得焦点 #设置 Enter按下键盘事件 的响应函数 self.lineedit.returnPressed.connect(self.updateUI)
#循环 设置鼠标左键单击事件 的响应函数 for button in buttons: button.clicked.connect(self.on_clicked)
self.resize(400,350) self.setWindowTitle(u"计算器")
def on_clicked(self): cp = self.lineedit.cursorPosition() #获取 光标位置 索引 # self.sender() 为信号发送者(产生对应事件的控件) text = self.sender().text() # 获取 按钮 文本 if text =='clear': self.lineedit.clear()#全部清空 elif text =='<--':#实现 backspace if cp: self.lineedit.setText( self.lineedit.text()[:cp-1] + self.lineedit.text()[cp:] ) self.lineedit.setCursorPosition(cp-1) elif text =="=": self.updateUI() else: #在光标处输入响应字符 self.lineedit.setText( self.lineedit.text()[:cp] + text + self.lineedit.text()[cp:] ) self.lineedit.setCursorPosition(cp+1) self.lineedit.setFocus()
def updateUI(self): try: text = self.lineedit.text() answer = eval(text) #计算表达式的值 self.lineedit.setText(str(answer))#更新 单行文本输入框 #往 多行文本浏览框 添加一行结果 self.browser.append("%s = <b>%s</b>"%(text,answer)) except Exception as error:#报错则 显示错误信息 self.browser.append("<font color=red>%s<font>" % error) self.lineedit.setFocus() if __name__== '__main__': app = QApplication(sys.argv) widget = MyWidget() widget.show() #显示到屏幕 sys.exit(app.exec_())
布局管理 是管理各个控件在窗口上的位置。在PyQt 中我们可以使用绝对定位(给定x和y坐标) 和使用布局类。但是,使用绝对定位主要有以下缺点:
1. 如果我们改变了窗口的大小,控件的位置可能变得不协调
2. 放置控件前要计算好坐标,比较麻烦。也不利于更新布局。
布局管理器的布局管理类非常灵活,实用。它是将组件定位在窗口上的首选方式。当窗口大小变化是,布局内多个控件的相对位置会保持不变。布局类有 QHBoxLayout(水平箱型布局)、QVBoxLayout(垂向箱型布局)和 QGridLayout(网格布局) 。布局可以嵌套使用,如本例中网格布局就嵌套在垂向箱型布局中。
本文分享自 Python可视化编程机器学习OpenCV 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!