PyQt5学习Ⅰ

在python上做GUI设计有很多开发框架供我们选择。可以看看http://www.360doc.com/content/17/0905/23/43284313_684859866.shtml

 

 

 

 

 

 

为什么我选择了pyqt5呢?其实没有什么特别的理由,就是因为实验室的学长用的是pyqt5,而我需要接手他的项目,所以也就得被迫学pyqt5,不过以前我也只是接触过最简单的easygui这个包,那个包确实过于简单了,简单到我都不想称之为GUI,功能确实太少,那么pyqt算是我真正设计GU用I的第一个架构了吧。

PyQt5简介

参考了http://zetcode.com/gui/pyqt5/。

PyQt5是Digia的Qt5应用程序框架的一组Python绑定。它适用于Python 2.x和3.x. 本教程使用Python 3. Qt库是最强大的GUI库之一。PyQt5的官方主页是www.riverbankcomputing.co.uk/news。PyQt5由Riverbank Computing开发。PyQt5是作为一组Python模块实现的。它有超过620个类和6000个功能和方法。它是一个多平台工具包,可在所有主要操作系统上运行,包括Unix,Windows和Mac OS。PyQt5是双重许可的。开发人员可以在GPL和商业许可之间进行选择。GPL之前在Linux第一讲里就到过,是GNU组织提出的一种协议,这种协议对开源是有利的。先来卡一下要学习那些内容,这些内容大都是以实例的方式来进行。

 

PyQt5安装

我们虽然前面学习了Linux,但是我们学习的时候还是先在windows下来学习。

 

看到导入模块没有问题,说明ok了,前面几次导入失败是因为模块名或者类的名字是错的。

PyQt5模块简介

就先来大致看一下PyQt5中的模块。

 

 

上面是谷歌浏览器自带的翻译插件翻译的,有些地方确实不太通顺,不过大概意思还是可以理解,这只是一个导论,后面会以实例的方式详细地介绍各个模块的用法。

PyQt5的日期和时间

 

但是我还是受不了这个翻译了,对于我来说,直接看原文是没有问题的,我会把一些比较难理解的地方给大家翻译出来。

 

上面是一个例子,在这个例子里面分别以不同的格式打印了日期,日期时间和时间。以前好像解释过第一行时干嘛的,不过是错的,今天我们来学习一下第一行的#!usr/bin/python3。

参考了https://www.cnblogs.com/junjiany/p/7055064.html。

 

注意,这个应该是必须在第一行。有的时候还需要指定编码方式。

 

这个指定编码方式可以不在第一行。我们今天的重点不是在这里,就不演示了,以后会有机会演示的。虽然例子是写在脚本里面,但是我们直接在命令行里面写更容易理解,因为命令行就是你给一个输入,有一个输出,对应关系很清晰,容易看。

 

我们就以上面PyQt5.QtCore.QDate的实例now作为一个例子。我们help(now)一下可以看到,now这个类里面toString方法的一些描述。

 

我们就可以理解Qt.ISODate和Qt.DefaultLocaleLongDate是两种时间的格式而已,不过它们都是Qt这个类的,所以导入的时候,Qt这个类也需要导入,这里要理解一下,上面的Qt.DateFormat=Qt.TextDate并不是说默认的格式是Qt.TextDate,默认的格式是不需要用到Qt的,这个TextDate只是想表示,你在括号里写Qt.ISODate,那么这个TextDate就换成ISODate,TextDate的意思只是表示是某一种时间格式而已,就像someone表示某一个人,其实呢,datetime和time也是有这两种格式的。

 

这个几个模块也不是说非要一起导入,用哪一个导入哪一个。如果默认的时间格式就可以,也不用导入Qt类,这也说明其实默认的时间格式并不需要用到Qt这个类。

 

有的时候我也比较懒,不想翻译大段英文。

 

关于夏令时,有点意思啊。

 

 

上面用中文报错是因为谷歌在翻译的时候,标点也给搞成中文了,我直接复制过来执行就会报错。需要注意的是每一次实例都只是生成了一个时间的快照而已,这个now实例是不会更新时间的,除非你再次实例化一次。

 

我是有点纳闷的,为什么会有28800,也就是8个小时的偏移呢?明明toLocalTime和toUTC结果是一样的啊。查了一下资料,

 

 

大概知道了是时区的事,为什么要以英国为对比,因为英国在零时区啊。上面复习了一下str.format的一个用法。

 

可以去https://www.cnblogs.com/Alexzzzz/p/6832253.html复习复习。

 

{}里面是后面要替换的位置,里面是编号,必须从0开始,而且不能断掉,后面如果有多个替换词,用逗号隔开。

 

daysInmonth()方法可以看一个特定月的天数,daysInYear()可以看某一年的天数,为什么会有这样的方法呢,因为不是每个月都是30天,也不是每年都是365天啊。

 

 

这个QDate还必须有三个整数参数才行,必须输入年月日,而且要输入正确的年月日,不然结果都是0,因为5月没有70号,所以后面的结果都是0。

 

 

daysTo()计算两个日期之间的间隔天数。由例子可以看出是括号里的减去self。

 

结果是可以有负数的。如果你看到结果是0,很大可能是因为你输错了日期,输了不可能存在的日期。

 

 

可以看到加的数量可以是负的,那就相当于是减。

 

其实QDate也是有这样的方法的。其实上面的d.__dir__()里面就见到了,不过我没有圈圈而已。由于QDate类不会对输入的日期报错,所以如果输错,结果是没有的。还有就是方法的顺序不能错,先加12年等时间再转化为字符串,不然肯定是错的,因为字符串根本没有上面的方法。

 

 

确实我们国家已经取消了夏令时了。

 

 

 

当然不要忘记,实例化一次得到的只是快照,是不会变的。

 

欧洲人真会玩,搞这么多种时间。

 

 

 

 

emmmm,这个用前面的daysTo不行吗?不懂为什么搞这么多。

从一个简单的例子开始

下面是一个显示小窗口的简单示例。然而,我们可以用这个窗口做很多事情。我们可以调整它,最大化它或最小化它。这需要大量编码。有人已编码此功能。因为它在大多数应用程序中重复,所以不需要再次编码。PyQt5是一个高级工具包。如果我们将在较低级别的工具包中进行编码,则以下代码示例可能就会是几百行了。下面显然直接复制到脚本里面会更好,由于pycharm真的太慢了,于是我抛弃了pycharm,选择了vscode,至于为什么选择vscode,在另一篇里面有讲。

 

 

用sublime来试试这个东西。不得不感叹,sublime打开小文件是真的快。

 

我们先来实验下,首先没有show怎么样呢?

 

 

确实app = QApplication(sys.argv), w.show(),sys.exit(app.exec_())都是必须的,不然窗口是显示不出来的,没有尝试把app = QApplication(sys.argv)删了是因为肯定会报错,这一看就知道。中间的一些设置都可以不要,应该都是有默认值的。

 

点x把窗口关了以后才会有finished,这个程序才算是结束。我比较好奇sys.argv到底是什么。

 

这个——是一个制表符,怎么显示的在我上一讲的评论区里面有,还是比较好用的,因为复制别人的代码过来很多缩进都有问题,这个很方便看缩进对不对。在vscode如何显示呢?

 

加上最后一行的,保存以后。

 

可以看到了,->是tab,点是空格。其实sublime也蛮贴心的,会直接把错误的行给你指示出来。

 

vscode和matlab一样,会在右边的相当于滚动条那个地方有红色提示。

 

并且我们发现其实pylint这个自带的查错就够用了,完全不需要flake8。

 

看着还没有那么烦。

 

exec_也就是返回一个整数。

 

第一个案例我们就稍微了解一些知识就够了。

 

 

 

其实执行mainloop的也就是app.exec_(),sys.exit()其实不要也行,也是可以正常退出的,不过据上面说的sys.exit()方法确保干净的退出。将通知环境应用程序如何结束,不过目前看起来完全不需要。并且app.exec_()的机里并不是一直在执行w=QWidget()到w.show()的代码,因为print(1)和print(2)并没有一直在执行,没有一直在打印1,2。目前它的机理我暂时无法理解。我原以为 app = QApplication(sys.argv)这句里面的参数必须是sys.argv,但是我发现我错了。

 

 

我们甚至可以不导入模块sys,其实 app = QApplication()里面传进去一个列表就行,目前来看是这样的,不过既然官方教程都这么写,一定有它的道理,说不定只是因为我们学的太少,太无知而已。

 

一个app.exce_(),我们点x可以finished,如果再加一个,就永远不会finished了,当然只是这个py程序结束不了而已。第一个小程序差不多知道每一行什么意思了,下一个程序。

应用程序图标

应用程序图标是一个小图像,通常显示在标题栏的左上角。在下面的示例中,我们将展示如何在PyQt5中执行此操作。我们还将介绍一些新方法。某些环境不会在标题栏中显示图标。我们需要启用它们。 如果您没有看到任何图标,请参阅我在Stackoverflow上获得解决方案的https://stackoverflow.com/questions/44080247/pyqt5-does-now-show-icons/45439678#45439678。

 

OOP(Object Oriented Programming 面向对象的程序设计)

 

if _name_=='_main_'是什么意思,如果看过我的python系列应该都不难理解。只要空格和tab不混用时不会报错的。

 

这个图标好像没有变啊。

 

图标设置出现了问题了。

 

首先我们在d盘下有一个web.png

 

然后运行呢?

 

还是不行,我猜可能图片有点大,像素太高。我们下载一下下面的图标。

 

 

这个分辨率够低了吧。

 

ok了。

显示工具提示

 

 

sizeHint可以自动帮你调节大小,知道这个就可以了。富文本格式就是

 

 

 

也不是一定要用rtf格式,普通的字符就可以显示。

 

现在我们按按钮是没用的,因为我们没有写按钮按下会发生什么事的代码。这段我们差不多也看懂了,下一个例子。

关闭窗口

关闭窗口的明显方法是单击标题栏上的x标记。在下一个示例中,我们将展示如何以编程方式关闭窗口。我们将简要地接触信号和插槽。以下是QPushButton我们在示例中使用的窗口小部件的构造函数。QPushButton(字符串文本,QWidget parent = None)该text参数是将在按钮上显示的文本。这parent是我们放置按钮的小部件。在我们的例子中,它将是一个Widget。应用程序的小部件形成层次结构。在此层次结构中,大多数小部件都有其父级。没有父母的小工具是顶窗。

 

 

clicked.connect把按钮和动作联系起来,可以实现按一下按钮自动执行代码。QApplication.instance().quit直接退出了QApplication的实例,直接看到finished了。

 

并且在上面的gif里面我们看到了,点quit可以直接退出两个窗口,因为它里面链接的代码是QApplication级别的退出,而点X号需要点两次才能退出两个窗口。

消息框

默认情况下,如果我们单击标题栏上的x按钮,QWidget则会关闭。有时我们想要修改此默认行为。例如,如果我们在编辑器中打开了一个文件,我们对其进行了一些更改。我们会显示一个消息框以确认操作。

 

 

 

和以前不一样的是,现在我们关闭窗口,会弹出一个选择,按yes会退出,点no不会退出。

这个closeEvent是继承自QWidget的一个方法,不过我们现在是修改这个方法的内容以实现自己想要的功能。

 

但是方法的名字不能随便改的。我删除了一个n,就不会在关闭的时候显示消息窗口了,就是直接退出了。

 

还有就是event只是一个形参而已,名字只要和下面对应就行。

 

把窗口显示在屏幕中心

 

 

这个center方法不是继承的,是我们自己加的,我们名字当然可以不取center,可以随便取,但是要注意一定要对应。还有就是其实这个有点多此一举,因为默认的位置其实就在中心。

 

一就先到这里,推荐一个sublime里快捷键的网站。https://blog.csdn.net/mycms5/article/details/70194045

快捷键还是很好用的。

猜你喜欢

转载自blog.csdn.net/qq_41740705/article/details/81222131