前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PyQt 编程入门(三)

PyQt 编程入门(三)

作者头像
用户6021899
发布2019-08-14 17:42:31
7950
发布2019-08-14 17:42:31
举报
文章被收录于专栏:Python编程 pyqt matplotlib

本例讲解计算器的编程。涉及到的内容有:单行文本框、多行文本浏览框和按钮的应用,布局(含垂向箱型布局以及栅格布局)和 事件(含按钮单击,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(网格布局) 。布局可以嵌套使用,如本例中网格布局就嵌套在垂向箱型布局中。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-01-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python可视化编程机器学习OpenCV 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档