今天开始要做一个网络营销工具,开发需要使用Python+Qt。第一次使用,下面是我整理的具体安装配置步骤和初次开发详解。对于每一种开发,我们刚开始都会写的一个HelloWorld程序。下面在给出环境配置之后,我会讲解如何写第一个程序HelloWorld。
1.安装说明
(1)python下载安装
首先下载python:http://www.python.org/ftp/python/ 。这里有各种版本,大家根据自己的要求下载。
我选择的下载是:http://www.python.org/ftp/python/3.2.2/python-3.2.2.msi
安装后需要配置环境变量,将python的目录添加进环境变量path中。如:我的python安装目录为“D:\Python27”,则我将“D:\Python27”加入环境变量Path中。
(2)PyQt的下载安装
下载地址:http://www.riverbankcomputing.co.uk/software/pyqt/download
一路回车安装,默认会安装到python的目录下。比如我的安装到了:D:\python27中。
(3)Eric下载安装
下载地址为:http://eric-ide.python-projects.org/eric-download.html
eric4是一款python,ruby的IDE,其强大代码功能,与QT4 的完美结合。使开发图形界面 的python应用程序变得容易。eric4本身就是用pyqt写的。所以安装时之前一定要安装好python才可以。解压后,双击install.py就开始了。安装完成后,点击eric4.bat,就可以运行。第一次安装完成后,需要做一配置才可以。如果你的软件没第一次运行,没有弹出名为pythonw的configure(配置对话框 ),可以通过点击eric4-configure.bat弹出。
配置过程如下:
点击Editor--Autocompation---勾上所有的对号选框。QScintilla---勾上左右的两个选框,然后在下面source中,选择from Document and API files.
点击Editor----APIs----勾上Complie APIs Autocompation,然后在Language中,选择python。点击下面的Add from installed APIs大按钮,选择住需要的.api文件。最后点击Compile APIs,几份钟后完成。
此时全部安装过程就算完成了。
2.第一个HelloWorld程序
(1)运行D:\Python27\eric4.bat启动程序,或点击D:\Python27\Lib\site-packages\eric4\eric4.py启动程序。点击菜单中Project---New 弹出对话框中
Projcet Name:HelloWorld
Projcet Type:QT4 GUI
Projcet Directory:选择你计划存放的项目文件目录。
点击OK,会出现版本选择对话框,选择None。
(2)单击软件界面左面的Projcet-Viewer中的第二个选项卡Forms
在下面空白区域中,右键鼠标--New form... 弹出对话框中选择Dialog,然后OK。给ui文件起个名字(HelloWorld.ui),保存后,会自弹出QT4设计窗口,选择Line Edit ,绘制一个单行文本框,并在右面属性框中,把objcetName改为LText(名字随便,你自己方便记住就可以).
然后绘制一个按钮并把其名字改为btn1,并把text改为hello。
在绘制加一个按钮并把其名字改为btn2,并把text改为exit。
(3)给exit按钮设计信号与槽,当点击它时,就会退出
点击窗口右面的(信号/槽编辑器)中的加号(+),就会出现一条没有定义过的事件,此时在发送者选择btn2(btn2是刚才定义的exit按钮),信号中选择clicked(),接受者中选择Dialog,槽中选择close(),然后保存后关闭设计器。
下面讲解一下“信号”和“槽”的概念:在PyQt4下,事件处理方面的术语为“信号”和“槽”,即signal和slot。事件对应信号signal,而事件的处理函数则为slot槽。PyQt4有一些预定义的slot,我们可以直接用,比如“exit”按钮的slot,其实就是关闭对话框,这个slot已经在PyQt4中有定义了。对于这样的slot,我们不用单独写代码,在QtDesigner中就可以完成。而对于“hello”按钮,我们需要自己写代码。对于这样的slot,我们在QtDesigner中不做任何处理,甚至不做定义。那么在这个例子中,在QtDesigner里我们只处理“exit”按钮的单击事件。这里“exit”按钮发出事件信号;而窗体Dialog为事件的接收方,即槽slot,窗体会对事件信号进行处理。
(4)返回到eric界面后,在左右的Forms选项卡中会出现名为HelloWorld.ui的文件 ,在文件名字右键鼠标,选择Complie form ,然后点确定。
点击Projcet-Viewer下的第一个选项卡Source后,就看见一个名字为Ui_HelloWorld.py的文件。双击这个文件,然后打开源 文件可以看到它的内容,生成了一个Ui_HelloWorld类。Ui_HelloWorld.py是可以单独运行的。按F2键,执行后,就会出现我们刚才设计好的程序。到此一个python程序已经成型。点击hello按钮没有任何反应,是因为还没有对其进行 编码,但是点击exit按钮后,程序退出。
注:不建议手动修改Ui_DlgHello.py,因为当你每次修改完界面并Complie form之后,会将你之前手动进行的修改给覆盖掉。
(5)给hello按钮编码,其点击后,在文本框中会出Hello World的文字
在PyQt4中,界面代码与事件代码是分开的,这样每次改界面不会影响到事件处理的代码。事件处理要新建一个类,然后在这个新类里写事件处理函数。新建类的工作可以交给Eric4来完成。
具体流程如下:鼠标右键HelloWorld.ui,选择Generate Dialog Code,设定ClassName,点击右面的New按钮。默认就可以。确定之后。在下面的文本框中,可以选择我们感兴趣的事件,Eric4会一并生成事件处理函数的定义。我们这里选择btn1下的给第一个 on_btn1_clicked()打上对勾,然后ok。这时在点击Projcet-Viewer下的第一个选项卡Source,就会多出一个 HelloWorld.py文件。双击打开这个文件。在文件后面就会出现一个刚才生成的btn1按钮的脚本。
@pyqtSignature("") def on_btn1_clicked(self): """ Slot documentation goes here. """ # TODO: not implemented yet raise NotImplementedError
下面对这段脚本进行讲解:
注意这个@pyqtSignature(""),自动处理了下面定义的槽slot(事件处理函数)与相对应的信号signal(事件)之间的关联。这里是指,单击btn1按钮,就会自动执行这个函数。slot的命名规则就是”on_对象名_信号名”,如果想添加新的slot,按这个规则来添加函数就行,并且在函数定义语句之前加上@pyqtSignature(""),不用再重新生成一次HelloWorld.py文件。
其实另外一种关联signal与slot之间的方法是在运行里绑定,比如按钮对象btnAbout的clicked信号的槽是about_clicked函数,那么在__init__函数中加入这样一句话:
PyQt4.QtCore.QObject.connect(self.btnAbout, PyQt4.QtCore.SIGNAL("clicked()"), self.about_clicked)
那么单击按钮btnAbout时就会执行about_clicked函数。
两种方法各有长处。第一种方法简单,第二种方法对于多个signal使用同一个slot时很有效。
ok,继续,我们需要把上面的代码段修改为:
@pyqtSignature("") def on_btn1_clicked(self): self.LText.setText("Hello World")然后在源文件顶部加入Python代码
import PyQt4, PyQt4.QtGui, sys在底部最后面加入Python代码
if __name__ == "__main__": app = PyQt4.QtGui.QApplication(sys.argv) dlg = Dialog() dlg.show() sys.exit(app.exec_())
到此第个Python程序设计完成。按F5运行。
注:如果按钮文本为汉字的话,运行之后,按钮文本会显示为乱码。比如,我们将btn1的文本设置为“你好”,则运行之后,btn1按钮的文字则显示为乱码。
解决方法一,是把btn1对应的代码中的("你好")改为(u"你好,PyQt4")就行了。但是这样更改之后,当重新编译界面后,之前的修改就会丢失掉。
这时,我们可以采用方法二(推荐使用这用方式修改),是把Eric菜单中“Settings”中的“Preferences”中的“Python”编码更改为“utf-8”就可以了。
PyQt4对中文的支持是很好的。代码统一使用utf-8编码,能省去很多麻烦。
---------------------------------------------------------------------------------------------------------------------------
注:最终的HelloWorld.py文件如下所示:
# -*- coding: utf-8 -*- """ Module implementing Dialog. """ from PyQt4.QtGui import QDialog from PyQt4.QtCore import pyqtSignature from Ui_HelloWorld import Ui_Dialog import PyQt4, PyQt4.QtGui, sys class Dialog(QDialog, Ui_Dialog): """ Class documentation goes here. """ def __init__(self, parent = None): """ Constructor """ QDialog.__init__(self, parent) self.setupUi(self) @pyqtSignature("") def on_btn1_clicked(self): """ Slot documentation goes here. """ # TODO: not implemented yet #raise NotImplementedError self.LText.setText("Hello World") if __name__ == '__main__': app = PyQt4.QtGui.QApplication(sys.argv) dlg = Dialog() dlg.show() sys.exit(app.exec_())