从0到1 一步一步创建一个pyqt的窗口程序
1、安装相关软件和模块
安装python 3.5, Qtcreat还有如下的模块
2、使用Qtcreat创建一个窗口界面,并且保存,如下图
3、在命令行中进入qt工程所在的目录,输入命令pyuic5 mainwindow.ui -o mainwindow.py 从ui文件生成py文件
对mainwindow.py文件中相关的显示的地方做一些手工的修改,最后的代码如下:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'mainwindow.ui'
#
# Created by: PyQt5 UI code generator 5.8.2
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(400, 300)
self.centralWidget = QtWidgets.QWidget(MainWindow)
self.centralWidget.setObjectName("centralWidget")
self.lineEdit = QtWidgets.QLineEdit(self.centralWidget)
self.lineEdit.setGeometry(QtCore.QRect(100, 10, 191, 21))
self.lineEdit.setObjectName("lineEdit")
self.label = QtWidgets.QLabel(self.centralWidget)
self.label.setGeometry(QtCore.QRect(10, 10, 81, 21))
self.label.setObjectName("label")
self.label_2 = QtWidgets.QLabel(self.centralWidget)
self.label_2.setGeometry(QtCore.QRect(40, 80, 54, 12))
self.label_2.setObjectName("label_2")
self.lineEdit_2 = QtWidgets.QLineEdit(self.centralWidget)
self.lineEdit_2.setGeometry(QtCore.QRect(100, 80, 191, 20))
self.lineEdit_2.setObjectName("lineEdit_2")
self.pushButton = QtWidgets.QPushButton(self.centralWidget)
self.pushButton.setGeometry(QtCore.QRect(270, 200, 75, 23))
self.pushButton.setObjectName("pushButton")
MainWindow.setCentralWidget(self.centralWidget)
self.menuBar = QtWidgets.QMenuBar(MainWindow)
self.menuBar.setGeometry(QtCore.QRect(0, 0, 400, 23))
self.menuBar.setObjectName("menuBar")
MainWindow.setMenuBar(self.menuBar)
self.mainToolBar = QtWidgets.QToolBar(MainWindow)
self.mainToolBar.setObjectName("mainToolBar")
MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.mainToolBar)
self.statusBar = QtWidgets.QStatusBar(MainWindow)
self.statusBar.setObjectName("statusBar")
MainWindow.setStatusBar(self.statusBar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "NTP时间同步"))
self.label.setText(_translate("MainWindow", "NTP服务器地址"))
self.label_2.setText(_translate("MainWindow", "北京时间"))
self.pushButton.setText(_translate("MainWindow", "请求时间"))
self.lineEdit.setText(_translate("MainWindow", "ntp1.aliyun.com"))
4、创建窗口程序要执行的逻辑程序,本程序的从网上NTP服务器获取时间的功能,创建ntp.py文件,此文件和ui工程不在一个目录下,另创建一个目录下面,同时把上面生成的mainwindow.py文件复制到此目录下面。ntp.py文件的代码如下。
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMessageBox
from PyQt5.QtGui import QIcon
from mainwindow import Ui_MainWindow
import sys
from datetime import datetime
import ntplib
from pyico import *
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self)
# 设置应用程序的窗口图标
self.setWindowIcon(QIcon(":/clock.png"))
#默认选择结果取反
self.pushButton.clicked.connect(self.ntp)
self.client = ntplib.NTPClient()
def ntp(self):
self.statusBar.showMessage('开始请求')
#从输入框读入字符串
input_s = self.lineEdit.text()
print(input_s)
try:
response = self.client.request(input_s)
except:
print('Error')
self.statusBar.showMessage('请求失败')
return None
out_s = datetime.fromtimestamp(response.tx_time)
print(out_s)
#out_s是一个对象,必须转换成字符串后才能输出来编辑框中去
self.lineEdit_2.setText(str(out_s))
self.statusBar.showMessage('请求完成')
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
mainWindow = MainWindow()
mainWindow.show()
sys.exit(app.exec_())
5、EXE文件图标和窗口打开后的左上角的图标处理
首先找好适合的png图片,并且用工具转换成一个icon格式的文件,把这两个文件复制到ui工程下面,可以使用qtCreat创建一个包含图标文件的资源文件,扩展名为.qrc。也可以自己用记事本手动编辑出来一个,格式很简单。
6、根据icon文件生成pyico.py文件,此文件用于窗口左上角的图标显示,并把此文件复制到ntp代码的目录下面,此目录下还需要复制过来2个图标的图片文件
在命令行中输入pyrcc5 ntp.qrc -o pyico.py
7、以上程序调试通过后,在命令中输入pyinstaller --icon=clock.ico --paths=E:\python_test\api-ms-win -F -w ntp.py生成可以windows下面可执行的exe文件。其中=E:\python_test\api-ms-win这个目录下包含pyqt运行所调用的windows窗口显示相关的dll库文件。具体的库文件可以查看博主的另外一篇博客。
8、最后在生成的EXE如下,打开运行一下