使用PyQt来编写第一个Python GUI程序
本文由 伯乐在线 - Lane 翻译,Daetalus 校稿。未经许可,禁止转载!
英文出处:pythonforengineers.com。欢迎加入翻译小组。
简介
许多人在学习如何创建一个 GUI 应用的时候都感到十分的困难。其中最重要的原因是,他们不知道应该从何下手。大多数的教程都只有文字,但事实上仅仅依靠文字很难学会 GUI 编程,因为 GUI 应用大多数都是基于视觉上的。
我们将通过创建一个简单的 GUI 应用来避免上面提到的这些问题,并且向你展示着手开始这件事其实是多么的简单。一旦你明白了这些基本的知识,以后的进一步学习将会变得十分的容易。
这就是我们即将完成的东西:
这是一个简单的 GUI 应用,根据输入的价格(price)和税率(tax rate),计算出最终的价格(final price)。
大多数的教程都试图直接通过代码来对 GUI 应用进行布局,但是这样做实在是很费劲。我们将要做的是利用优秀的 QT Designer 工具来对我们的应用进行布局。
所以不要再劳神费力的用代码来设计界面了。现在开始所有的东西都将通过图形界面来搞定。
所有的代码都在这里。
前提条件
如果你已经接受了我的建议并且安装了 Anaconda,你应该已经安装好了 PyQt4。如果没有的话,你需要从这里先下载它。
同时你还需要一个 Qt Designer。我建议你下载整个的 QT 套件,因为其中还包含了许多其他有用的工具。
开始着手
提示:当你需要查看更多细节的时候,你可以通过点击下方的任意图片来查看其原图。(译者注:你可能需要查看原始链接来查看原图)
打开 QT Designer。在弹出的窗口中,选择 Main Window,这样它会给你一个空白的画板。
接下来在左侧选择Text Edit
:
将Text Edit
拖动到主窗口:
看见右边我粗略的用红圈框起来的部分了吗?那就是定义这个对象的名字的地方。这个名字将是我们通过 Python 代码调用到这个对象的变量名,所以请尽量取一个有意义的名称。
我将它取名为price_box
,因为我们会在这里输入价格。然后我们需要给这个输入框添加一个 label,以便让用户更加清楚这个输入框的作用。
我在上图中圈出了 label。把它拖动到主窗口当中来。
现在它被默认称作TextLabel
。双击并将其命名为Price
。你还可以将这段文字字体加大并且设置为粗体,就像下边看到的这样:
对于税率(tax)输入框,我们会使用另外的一个东西。找到spin box
:
左侧用圈框起来的部分就是一个spin box
。它会限定你能输入的值。其实并不是非得要用spin box
,这样做只不过是为了更好地展示 QT Creator 所能提供的各种不同的组件。将spin box
拖到窗口中。然后我们要做的第一件事情就是将objectName
改为一个有意义的名字,例如我将其设置为tax_rate
。请记住这将会是你在 Python 代码中调用它的时候会使用到的变量名。
我们可以为我们的spin box
设置一个默认值。我选择将其设置为 20:
如果你仔细观察上图,你会发现我们也可以设置它的最小值和最大值。不过我并不打算去更改他们。
同样地,我会为它添加一个标签叫做Tax Rate
。然后看看我们接下来会用到的圈起来的Push Button
:
好的,现在选择Push Button
然后将其拖动到我们的窗口中来。
这个按钮现在显示的是PushButton
,这并不是一个很有意义的名字。到了这一步,你应该知道该怎么更改它了。不过在此之前,我们要把这个按钮的名字(不是显示用的文字列)改为calc_tax_button
。
然后,我们可以修改真正的显示文字列了:
然后选择另外一个Text Edit
并将其拖动到窗口中。你不需要给它添加标签,因为我们会把我们的结果输出到这里。把它的名字改为results_window
(下图中没有画出来,但你应该已经知道该如何操作了)。
如果你觉得需要的话,你可以添加一个大标题。这是一个简单的label box
并且将字体加大了。
现在保存你的成果:
这个文件在下一部分我们编写代码的时候将会用到,所以最好把它存在一个我们方便访问的地方。
我们创建的只是一个简单的 XML 文件。用任意一个文本编辑器打开它,你可以看到这样的内容:
编写代码
Qt 代码是面向对象的,并且简单易学。所有我们添加的组件都是一个对象,并且都拥有自己的方法比如toPlainText()
(用来读取输入框中的值)。这让它使用起来非常方便。
在你编写代码之前,你必须要使用一些函数来进行配置。我确信官方的文档中肯定有提到过这个,但是我现在打死也找不到这些文档了,所以我只能通过官方的例程(以及网上的一些教程)中总结出了这一小段代码来进行配置。我已经把这些函数上传到了 pyqt_skeleton.py。
这些代码非常有用,每当你想要创建一个新的 PyQt 项目的时候,就在这段代码的基础上添加你自己的代码吧。
这段代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
import sys from PyQt4 import QtCore, QtGui, uic qtCreatorFile = "" # Enter file here. Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile) class MyApp(QtGui.QMainWindow, Ui_MainWindow): def __init__( self ): QtGui.QMainWindow.__init__( self ) Ui_MainWindow.__init__( self ) self .setupUi( self ) if __name__ = = "__main__" : app = QtGui.QApplication(sys.argv) window = MyApp() window.show() sys.exit(app.exec_()) |
其中需要注意的是第三行:
1
|
qtCreatorFile = "" # Enter file here. |
你需要在这里填入你先前创建的文件的地址。这个文件将会被内置的函数载入:
1
|
Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile) |
让我们大致地看一看这段代码:
1
2
3
4
5
|
if __name__ = = "__main__" : app = QtGui.QApplication(sys.argv) window = MyApp() window.show() sys.exit(app.exec_()) |
这段主程序创建了一个新的 Qt Gui 应用。,每个 QT 应用都可以通过命令行进行配置,所以必须传入sys.argv
参数。不过现在我们用不到这个。最后,我们创建了一个MyApp
类,这个类继承于 Qt 库并且调用了父类的初始化函数:
1
2
3
4
5
|
class MyApp(QtGui.QMainWindow, Ui_MainWindow): def __init__( self ): QtGui.QMainWindow.__init__( self ) Ui_MainWindow.__init__( self ) self .setupUi( self ) |
你不一定非得要了解这些代码的细节。你只需要在它的基础上继续开发就好了。
下载pyqt_skeleton.py
这个文件,并将它重命名为pyqt_first.py
。这是因为我们不想去改动到源文件。然后要做的第一件事就是在代码中导入我们自己的 XML 文件,这个 XML 文件包含了我们的这个 GUI 信息。将下面的这一行:
1
|
qtCreatorFile = "" # Enter file here. |
替换为
1
|
qtCreatorFile = "tax_calc.ui" |
这样就能把我们的 GUI 文件载入到内存中。现在,我们的 GUI 中最关键的组件就是我们的这个按钮了。一旦我们按下这个按钮,就会发生一些神奇的事情。到底会发生什么?这就需要我们告诉代码当按下Calculate Tax
按钮的时候该怎么做了。在__init__
函数中,添加如下的内容:
1
|
self .calc_tax_button.clicked.connect( self .CalculateTax) |
这段代码有什么用?还记得我们把按钮命名为了calc_tax_button
吗?(这是这个按钮对象的名字,不是按钮上显示的提示字符串。)clicked
是一个内置的函数,当有按钮被点击的时候它会被自动调用(很神奇吧)。所有的 QT 组件都有特定的函数,你可以通过 Google 来查看详细。这段代码的最后部分是connect(self.CalculateTax)
。这意味着这个按钮会被链接到一个叫做self.CalculateTax
的函数,这样以后每当用户按下这个按钮的时候,这段代码都会被调用。
我们还没有实现这个函数。所以让我们动手开始写吧。
在MyApp
类中,添加另外一个函数。我们需要先看看整个函数,然后再去了解它的细节:
1
2
3
4
5
6
|
def CalculateTax( self ): price = int ( self .price_box.toPlainText()) tax = ( self .tax_rate.value()) total_price = price + ((tax / 100 ) * price) total_price_string = "The total price with tax is: " + str (total_price) self .results_window.setText(total_price_string) |
好了,让我们一行一行的分析上面的代码。
我们现在要做两件事:读取价格和税率,然后计算最终的价格。好了开始吧。请记住,我们要通过我们设定的名字来调用这些组件(这就是我让你不要用默认的通用名称比如box1
的原因,否则的话我们在写代码的时候会很恼火)。
1
|
price = int ( self .price_box.toPlainText()) |
price_box.toPlainText()
是一个内置的可以读取输入框中的值的函数。顺便提一句,虽然你用得多了以后肯定能记住这些函数,因为他们的名字取得很规范,但是你没必要一开始就去记忆所有这些函数。我每次都是通过 Google 诸如 “Qt Textbox 读取数据”一类的关键字来找到我所需要的函数。
通过函数读取到的是一个 string 类型的值,所以我们需要把他转换成 integer 类型并存在一个price
变量中。
然后读取税率:
1
|
tax = ( self .tax_rate.value()) |
同样的,value()
是读取spinbox
中值的函数。感谢 Google。
我们现在已经得到了以上两个值,这样我们就能用非常高大上的数学公式来计算我们的最终价格了:
1
2
|
total_price = price + ((tax / 100 ) * price) total_price_string = "The total price with tax is: " + str (total_price) |
我们新建了一个 string 变量来储存我们的最终价格。因为最终直接显示在应用上的将会是一个 string 类型的值:
1
|
self .results_window.setText(total_price_string) |
在results_window
中,我们调用了setText()
函数,它能显示我们计算出的最终价格的字符串。
最后运行我们写好的程序:
1
|
python pyqt_first.py |
好了,这就是一个简单的 PyQt 教程。
如果你还想要体验更多好玩儿的东西,你可以试着用一用别的组件,不过先提醒一句,你要是放了太多的组件在你的应用中的话,用起来可能会有点费劲…
关于作者: Lane
使用PyQt来编写第一个Python GUI程序的更多相关文章
- [转载]使用PyQt来编写第一个Python GUI程序
转载自:http://python.jobbole.com/81276/ 英文版出处:http://pythonforengineers.com/your-first-gui-app-with-pyt ...
- 编写第一个python selenium程序(二)
上节介绍了如何搭建selenium 系统环境,那么本节来讲一下如何开始编写第一个自动化测试脚本. Selenium2.x 将浏览器原生的API封装成WebDriver API,可以直接操作浏览器页面里 ...
- 编写第一个python selenium-webdriver程序(二)
上节介绍了如何搭建selenium 系统环境,那么本节来讲一下如何开始编写第一个自动化测试脚本. Selenium2.x 将浏览器原生的API封装成WebDriver API,可以直接操作浏览器页面里 ...
- 搭建Spring开发环境并编写第一个Spring小程序
搭建Spring开发环境并编写第一个Spring小程序 2015-05-27 0个评论 来源:茕夜 收藏 我要投稿 一.前面,我写了一篇Spring框架的基础知识文章,里面没 ...
- ROS学习笔记三:编写第一个ROS节点程序
在编写第一个ROS节点程序之前需要创建工作空间(workspace)和功能包(package). 1 创建工作空间(workspace) 创建一个catkin_ws: #注意:如果使用sudo一次 ...
- Xamarin iOS开发实战第1章使用C#编写第一个iOS应用程序
Xamarin iOS开发实战第1章使用C#编写第一个iOS应用程序 C#原本是用来编写Windows以及Windows Phone的应用程序.自从Xamarin问世后.C#的作用就发生了非常大的变化 ...
- Day1:第一个python小程序
Day1:第一个python小程序与开发工具Pycharm 一.Hello World C:\Users\wenxh>python Python 3.6.2 (v3.6.2:5fd33b5, J ...
- 使用python做一个爬虫GUI程序
整体思路和之前的一篇博客爬虫豆瓣美女一致,这次加入了图片分类,同时利用tkinter模块做成GUI程序 效果如下: 整体代码如下: # -*- coding:utf-8 -*- import requ ...
- Pycharm+Django搭建第一个Python Web程序
1.安装django 无论是Python2.x还是Python3.x版本,都可以使用pip来安装Django.在控制台使用如下命令:pip install django 如: 2.检查dgango是否 ...
随机推荐
- Java语言导学笔记 Chapter 9 IO
java.io 9.1.1 字符流 Reader为读取器(reader)提供API和部分实现,读取器是读取16位字符的流: Writer为写出器(writer)提供API和部分实现,写出器是写16位字 ...
- NOIP第二次模拟赛 stage1【划分数列(seq.pas/c/cpp)
7划分数列(seq.pas/c/cpp) [题目描述] 给你一个有n个元素的数列,要求把它划分成k段,使每段元素和的最大值最小 [输入格式] 第一行两个正整数n,k 第二行为此数列ai [输出格式] ...
- BZOJ 1416: [NOI2006]神奇的口袋( 高精度 )
把x1~xn当成是1~n, 答案是不会变的. 然后直接模拟就行了...... P.S 双倍经验... BZOJ1416 && BZOJ1498 -------------------- ...
- c语言中的制表符\t与空格
(本文不讨论制表符与空格缩进问题) 编程过程中,我们常常用多个空格或制表符分隔两个字符串,那么这两个在显示效果上有什么区别呢? 比较如下两行代码的输出效果 代码1: printf("1\t1 ...
- sp<> 强指针类的用法
在android 中可以广泛看到的template<typename T>, class Sp 句柄类实际上是android 为实现垃圾回收机制的智能指针.智能指针是c++ 中的一个概念 ...
- Python 模块的一般处理
因为Python模块在被导入时,定义在模块中的顶级代码是会被执行的!如果我们想改变这种运行方向可以这样做: if __name__ == '__main__':#当这个模块作为主程序时__name__ ...
- 转:CSS3 Flexbox 布局介绍
转:CSS3 Flexbox 布局介绍 Flexbox是一个用于页面布局的全新CSS3模块功能.它可以把列表放在同一个方向(从左到右或从上到下排列),并且让这些列表能延伸到占用可用的空间.较为复杂的布 ...
- c# 多显示器设置主屏幕(Set primary screen for multiple monitors)
原文 http://www.cnblogs.com/coolkiss/archive/2013/09/18/3328854.html 经过google加各种百度,终于找到了一个有效的解决方案,下面是两 ...
- Unix/Linux环境C编程入门教程(4) Debian Linux环境搭建
Unix/Linux版本众多,我们推荐Unix/Linux初学者选用几款典型的Unix/Linux操作系统进行学习. 1.广义的Debian是指一个致力于创建自由操作系统的合作组织及其作品,由于Deb ...
- android服务Service(上)- IntentService
Android学习笔记(五一):服务Service(上)- IntentService 对于需要长期运行,例如播放音乐.长期和服务器的连接,即使已不是屏幕当前的activity仍需要运行的情况,采用服 ...