Python pyQt4/pyQt5 学习笔记1(空白窗口,按钮,控件事件,控件提示,窗体显示到屏幕中间,messagebox)
PyQt4是用来编写有图形界面程序(GUI applications)的一个工具包。PyQt4作为一个Python模块来使用,它有440个类和超过6000种函数和方法。同时它也是一个可以在几乎所有主流操作系统(如Unix,windows,Mac OS)上运行的跨平台的工具包。
PyQt4的类库可分为以下模块:
- QtCore
- QtGui
- QtNetwork
- QtXml
- QtSvg
- QtOpenGL
- QtSql
其中QtCore包含了PyQt非GUI功能模块的核心部分,这个模块用来对时间、文件和目录、不同的数据类型、流、URL、资源的媒体类型、线程和进程进行处理。
QtGui包含了图形相关的组件和类库,包括按钮(button)、窗口(window)、状态栏(status bar)、工具栏(toolbar)、滑块(slider)、位图(bitmap)、颜色(color)和字体(font)等等【这些名词的英文我们在编程中会经常用到】。
QtNetwork包含了网络编程相关模块。这些类库有助于TCP/IP编程和客户端&服务器端的UDP编程,使得网络编程更加简单和轻便。
QtXml包含处理Xml文件的类库。这个模块提供了对SAM和DOM接口的实现。
QtSvg提供了显示svg文件的类库。SVG,全称Scalable Vector Graphics,即可缩放矢量图形,是一种基于xml的描述二维图形和图像应用的文件格式。
QtOpenGL是用OpenGL库来渲染2D、3D图像的模块。它可以使Qt GUI库和OpenGL库无缝接合【好厉害的样子】。
最后,QtSql模块提供了处理数据库的类库。
PyQt4 和 PyQt5 的不同之处
The PyQt5 is not backward compatible with PyQt4; there are several significant changes in PyQt5. However, it is not very difficult to adjust older code to the new library. The differences are, among others, the following:
PyQt5不向后兼容PyQt4;这是一些在PyQt5中的重要改变。然而,将旧代码迁移到新的版本中并不是非常困难。不同点如下:
- Python 模块已经被改写. 一些模块被舍弃 (
QtScript
), 部分的模块被分割成子模块 (QtGui
,QtWebKit
). - 新的模块被引进, 包含
QtBluetooth
,QtPositioning
, 和Enginio
. - PyQt5 只支持最新风格的信号和槽的写法. SIGNAL()和SLOT()的调用将不会被长时间支持.
- PyQt5 不支持任何在Qt 5.0版本中弃用或取消的API
其它GUI框架
写GUI程序的Python程序员可以在这三种框架中选择:PyQt,PyGTK和wxPython。
例子:生成一个空白窗口
下面是PyQt4的程序(windows版本):
import sys
from PyQt4 import QtGui def main():
app=QtGui.QApplication(sys.argv)
w=QtGui.QWidget()
w.resize(250,150)
w.move(300,300)
w.setWindowTitle('Simple')
w.show()
sys.exit(app.exec_()) if __name__=='__main__':
main()
结果:
w = QtGui.QWidget()
QtGui.QWidget是PyQt4所有用户接口对象中的基础类库。我们在这里调用了QtGui.QWidget的默认构造函数,这个构造没有父对象。我们把没有父对象的部件(widget)叫做窗口(window)。
下面是PyQt5的相同例子(macOS版本):
import sys
from PyQt5.QtWidgets import QApplication, QWidget def main():
app=QApplication(sys.argv)
w=QWidget()
w.resize(250,150)
w.move(300,300)
w.setWindowTitle('Simple')
w.show()
sys.exit(app.exec_()) if __name__=='__main__':
main()
结果:
例子:按钮,控件事件,控件提示,窗体显示到屏幕中间,messagebox
下面是PyQt4的程序(windows版本)
import sys
from PyQt4 import QtGui,QtCore class winForm(QtGui.QWidget):
def __init__(self):
super(winForm,self).__init__()
self.initUI() def initUI(self):
QtGui.QToolTip.setFont(QtGui.QFont('SansSerif',10))
self.setToolTip('this is a <b>QWidget</b> widget')
btn=QtGui.QPushButton('Button',self)
btn.setToolTip('this is a <b>QPushButton</b> widget')
btn.resize(btn.sizeHint())
btn.move(50,50) btn1=QtGui.QPushButton('Quit',self)
btn1.clicked.connect(QtCore.QCoreApplication.instance().quit)
btn1.resize(btn1.sizeHint())
btn1.move(150,50) self.setGeometry(300,300,250,150)
self.setWindowTitle('Tooltips')
self.setWindowIcon(QtGui.QIcon())
self.center()
self.show() def closeEvent(self,event):
res=QtGui.QMessageBox.question(self,'info',
"你要确定退出吗?",QtGui.QMessageBox.Yes |
QtGui.QMessageBox.No,
QtGui.QMessageBox.No)
if res==QtGui.QMessageBox.Yes:
event.accept()
else:
event.ignore() def center(self):
qr=self.frameGeometry()
cp=QtGui.QDesktopWidget().availableGeometry().center()
qr.moveCenter(cp)
self.move(qr.topLeft()) def main():
app=QtGui.QApplication(sys.argv)
ex=winForm()
sys.exit(app.exec_()) if __name__=='__main__':
main()
下面是程序的运行效果,依次演示了控件提示,messagebox弹窗
下面解说上面的代码:
class winForm(QtGui.QWidget):
def __init__(self):
super(winForm,self).__init__()
这里我们创建了一个新的类叫做winForm,括号中的QtGui.QWidget表明这个Example类是从QtGui.QWidget类继承来的。这意味着我们为新类写构造函数时需要调用父类的构造函数。super(Example, self)返回了Example的父对象(即QtGui.QWidget),接着我们调用了父对象的构造函数。注意__init__
是Python中的构造函数。
注意:你必须调用父类的构造函数,否则会出现运行错误:
RuntimeError: super-class __init__() of type winForm was never called
QtGui.QToolTip.setFont(QtGui.QFont('SansSerif',10))
self.setToolTip('this is a <b>QWidget</b> widget')
btn=QtGui.QPushButton('Button',self)
btn.setToolTip('this is a <b>QPushButton</b> widget')
我们调用setTooltip()这个方法,我们还可以使用html标签!真是想不到。笔者突然想有空可以试试加入div标签,走马灯标签和超链接标签试试。
btn.resize(btn.sizeHint())
btn.move(50,50)
我们设定了按钮的大小,位置。其中sizeHint()方法返回了一个推荐的大小
btn1=QtGui.QPushButton('Quit',self)
btn1.clicked.connect(QtCore.QCoreApplication.instance().quit)
btn1.resize(btn1.sizeHint())
btn1.move(150,50)
这段代码就是那个名为Quit的按钮,它是一个push button,点击它程序就退出。
我们在例子中要使用的QtGui.QPushButton的构造函数原型是这样的:
QPushButton(string text, QWidget parent = None)
其中text参数是按钮上显示的文字。parent参数是部件的父对象,在这里就是我们要把按钮放在什么上,本例中是一个QtGui.QWidget【其实是一个窗口(window)】
这里我们创造了一个按钮(push button),它是QtGui.QPushButton类的一个实例。第一个参数是按钮上的文字‘Quit’,第二个参数是父对象,这里就是我们创建的winForm了,也就是self,它继承自QtGui.QWidget类【Example没有父对象,是一个窗口(window),记得吗】。
PyQt4中的事件处理系统是由信号槽机制(signals and slots)实现的。如果我们点击了这个按钮,就会发出“clicked”这个信号。QtCore.QCoreApplication这个东西包含了程序的主循环,它处理和分派所有的事件,而instance()方法返回的是目前的实例(insatnce)。注意到QtCore.QCoreApplication随着QtGui.QApplication的创建而创建,而由于我们这里用connect()函数将“clicked”事件和可以终止应用的quit()函数联系(connect)在了一起,所以点击按钮,应用终止。这种交流在两个对象之间完成:发送者和接受者,其中发送者是按钮,接受者是应用本身。
self.setGeometry(300,300,250,150)
self.setWindowTitle('Tooltips')
self.setWindowIcon(QtGui.QIcon())
self.center()
self.show()
这段代码设置窗体的显示位置、大小、标题、程序图标,最后把窗体显示出来。还有一个自定义的函数center,用于窗体居中显示。(你可以注释self.center()来看看有什么不同)
由于我们是继承 QtGui.QWidget类,我们的新类winForm其实就是一个部件(widget),有widget的所有方法,这三个方法就都出自widget。
setGeometry这个方法,它做了两件事情:将部件定位并设定了它的大小【其实就是resize和move的混合函数】。前两个参数是部件相对于父元素的x,y坐标【这里其实是个窗口(window),没有父元素记得吗?所以是屏幕上的x,y坐标。】,后两个参数是部件的宽和高
setWindowIcon这个方法,它设定了应用的图标。为了做到这一点,我们创建了一个QtGui.QIon对象,创建时的参数就是我们想要的图标的路径
def center(self):
qr=self.frameGeometry()
cp=QtGui.QDesktopWidget().availableGeometry().center()
qr.moveCenter(cp)
self.move(qr.topLeft())
自定义的函数center,用于窗体居中显示
其中QtGui.QDesktopWidget这个类提供了用户桌面的信息,包括屏幕大小。
frameGeometry方法得到了主窗口的矩形框架qr
QtGui.QDesktopWidget().availableGeometry().center() 这些方法来得到屏幕分辨率,并最终得到屏幕中间点的坐标cp
qr.moveCenter(cp) 将矩形框架移至屏幕正中央,大小不变
self.move(qr.topLeft()) 最后我们将应用窗口移至矩形框架的左上角点,这样应用窗口就位于屏幕的中央了【注意部件的move都是左上角移动到某点】。
def closeEvent(self,event):
res=QtGui.QMessageBox.question(self,'info',
"你要确定退出吗?",QtGui.QMessageBox.Yes |
QtGui.QMessageBox.No,
QtGui.QMessageBox.No)
if res==QtGui.QMessageBox.Yes:
event.accept()
else:
event.ignore()
这段代码出弹窗,用户可以确认或者取消操作。
根据类定义,如果关闭QtGui.QWidget,QtGui.QCloseEvent将会执行。所以为了达到我们的目的,我们需要重新定制closeEvent()这个事件句柄(event handler)。看来类似于C#中的重写虚函数。
下面是PyQt5的相同功能的代码(macOS版本):
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QToolTip, QPushButton, QMessageBox, QDesktopWidget
from PyQt5 import QtCore
from PyQt5.QtGui import QFont, QIcon class winForm(QWidget):
def __init__(self):
super(winForm, self).__init__()
self.initUI() def initUI(self):
QToolTip.setFont(QFont('SansSerif', 10))
self.setToolTip('this is a <b>QWidget</b> widget')
btn = QPushButton('Button', self)
btn.setToolTip('this is a <b>QPushButton</b> widget')
btn.resize(btn.sizeHint())
btn.move(50, 50) btn1 = QPushButton('Quit', self)
btn1.clicked.connect(QtCore.QCoreApplication.instance().quit)
btn1.resize(btn1.sizeHint())
btn1.move(150, 50) self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Tooltips') self.setWindowIcon(QIcon())
self.center()
self.show() def closeEvent(self, event):
res = QMessageBox.question(self, 'info', '你要确定退出吗?', QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if res == QMessageBox.Yes:
event.accept()
else:
event.ignore() def center(self):
qr = self.frameGeometry()
cp = QDesktopWidget().availableGeometry().center()
qr.moveCenter(cp)
self.move(qr.topLeft()) def main():
app = QApplication(sys.argv)
ex=winForm()
sys.exit(app.exec_()) if __name__ == '__main__':
main()
结果:
Python pyQt4/pyQt5 学习笔记1(空白窗口,按钮,控件事件,控件提示,窗体显示到屏幕中间,messagebox)的更多相关文章
- Python pyQt4/PyQt5 学习笔记3(绝对对位,盒布局,网格布局)
本节研究布局管理的内容. (一)绝对对位 import sys from PyQt4 import QtGui class Example(QtGui.QWidget): def __init__( ...
- Python pyQt4/pyQt5 学习笔记2(状态栏、菜单栏和工具栏)
例子:状态栏.菜单栏和工具栏 import sys from PyQt4 import QtGui class Example(QtGui.QMainWindow): def __init__(sel ...
- Python pyQt4/PyQt5 学习笔记4(事件和信号)
信号 & 槽 import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import (QWidget,QLCDNumber,QS ...
- PyQt4入门学习笔记(三)
# PyQt4入门学习笔记(三) PyQt4内的布局 布局方式是我们控制我们的GUI页面内各个控件的排放位置的.我们可以通过两种基本方式来控制: 1.绝对位置 2.layout类 绝对位置 这种方式要 ...
- PyQt4入门学习笔记(一)
PyQt4入门学习笔记(一) 一直没有找到什么好的pyqt4的教程,偶然在google上搜到一篇不错的入门文档,翻译过来,留以后再复习. 原始链接如下: http://zetcode.com/gui/ ...
- PyQt5学习笔记-从主窗体打开一个子窗体
PyQt5学习笔记-从主窗体打开一个子窗体 软件环境: Eric6+Python3.5+PyQt5 试验目标: 1.点击菜单项Open,打开一个子窗体 2.点击按钮Open,打开一个子窗体 主窗体设计 ...
- Requests:Python HTTP Module学习笔记(一)(转)
Requests:Python HTTP Module学习笔记(一) 在学习用python写爬虫的时候用到了Requests这个Http网络库,这个库简单好用并且功能强大,完全可以代替python的标 ...
- python网络爬虫学习笔记
python网络爬虫学习笔记 By 钟桓 9月 4 2014 更新日期:9月 4 2014 文章文件夹 1. 介绍: 2. 从简单语句中開始: 3. 传送数据给server 4. HTTP头-描写叙述 ...
- Python Built-in Function 学习笔记
Python Built-in Function 学习笔记 1. 匿名函数 1.1 什么是匿名函数 python允许使用lambda来创建一个匿名函数,匿名是因为他不需要以标准的方式来声明,比如def ...
随机推荐
- Linux 内存buffer与cache区别_003
一.首先大概了解一下计算机CPU.Cache.Buffer.内存.硬盘.SWAP CPU也称为中央处理器(CPU,Central Processing Unit)是一块超大规模的集成电路,是一台计算机 ...
- server2008,本机可以登录ftp,其他机器登录不了解决办法。肯定是防火墙的问题
转自http://kkworms.blog.51cto.com/540865/558477 今天在windows server 2008 R2上安装了FTP,安装过程如下,然后添加内置防火墙设置,设置 ...
- CentOS7修改设置静态IP和DNS
当前位置: 主页 > CentOS入门 > 系统配置 > CentOS7修改设置静态IP和DNS 时间:2016-02-22 00:55来源:blog.csdn.net 作者:get ...
- 第一個shell腳本
#!/bin/bash echo "Hello World !" 運行
- SharePoint 使用ECMAscript对象模型来读取帖子列表
本随笔讲述如何用JavaScript来读取SharePoint 2013 中blog相关的帖子列表. ASCX File Content: <div id="divGetItemsFr ...
- git恢复本地删除的文件夹取消增加的文件
git项目中有时候会在本地增加或者删除了一些文件或者文件夹,但是又不想提交,一般情况下,我们取消本地所有修改: git checkout . 取消指定文件修改: git checkout filena ...
- 如何在Linux系统中安装VMware
首先打开vmware官网的下载链接:https://my.vmware.com/web/vmware/info/slug/desktop_end_user_computing/vmware_works ...
- 处理执行sql语句
sqlplus / as sysdba @1.sqlsqlplus / as sysdba @2.sqlsqlplus / as sysdba @3.sql
- Java压缩包解压到指定文件
在获得一个以Zip格式压缩的文件之后,需要将其进行解压缩,还原成压缩前的文件.若是使用Java自带的压缩工具包来实现解压缩文件到指定文件夹的功能,因为jdk提供的zip只能按UTF-8格式处理,而Wi ...
- flexbox父盒子justify-content属性
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...