python使用PyQt5,及QtCreator,qt-unified界面设计以及逻辑实现
1.环境安装:
2.qt-unified软件设计界面
新建项目—>Qt—>From
根据左边菜单栏上的控件直接拖到窗口上布局 设计如下界面:
保存文件,命令行切换到保存的.ui文件目录执行如下命令将.ui文件转化py文件
pyuic5 -o mainwindow.py mainwindow.ui
其中,-o 后的参数为输出文件的名称 -o 后第二个参数即为生成的ui文件的名称,报错请注意环境变量
这个时候运行会报错,所以还需要配置几个步骤。
- 增加几个引用
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QFileDialog,QMessageBox
import sys
- 添加主函数脚本
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
然后成功运行,弹出界面。
这个时候,我们要把按钮和输入框的改造下,使其能够交互起来。
QPushButton的信号槽连接:
self.choose_file.clicked.connect(self.open_file)
,传入的是点击后执行的方法。获取QLineEdit里面的文本:
self.cookie_edit.text()
。将文案输出到QTextBrowser组件中显示:
self.message_show.append('爬取全部文章成功\n')
。判断复选框是否选中
self.only_name.isChecked()
,返回的是true/false。
运行中我发现,每次执行的时候,QTextBrowser组件中的文案,不能像print()方法一样,一行一行的输出,每次都是要等到全部执行完后,一次性输出。这个不符合我设计QTextBrowser组件的初衷。于是我又去问了问怎么样才能让QTextBrowser组件中的文案一行一行的输出。
最终多方尝试后,解决了这个问题,就是加入这句代码QApplication.processEvents()
,可以将这句代码放入循环中,就能做到界面的实时刷新了。
在复杂操作的过程中频繁调用QApplication.processEvents()。这个函数告诉Qt处理所有那些还没有被处理的各类事件,然后将控制权返还给调用者。
实际上QApplication.exec()就是一个不停调用processEvents()函数的while循环。
个人示例代码
# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QFileDialog,QMessageBox
import sys class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(479, 547)
self.textout = QtWidgets.QTextBrowser(Form)
self.textout.setGeometry(QtCore.QRect(20, 251, 431, 271))
self.textout.setObjectName("textout")
self.label = QtWidgets.QLabel(Form)
self.label.setGeometry(QtCore.QRect(180, 10, 101, 31))
self.label.setObjectName("label")
self.lujinuot = QtWidgets.QLabel(Form)
self.lujinuot.setGeometry(QtCore.QRect(90, 60, 271, 20))
self.lujinuot.setObjectName("lujinuot")
self.label_3 = QtWidgets.QLabel(Form)
self.label_3.setGeometry(QtCore.QRect(20, 60, 71, 21))
self.label_3.setObjectName("label_3")
self.selectfile = QtWidgets.QPushButton(Form)
self.selectfile.setGeometry(QtCore.QRect(370, 60, 81, 23))
self.selectfile.setObjectName("selectfile")
self.label_4 = QtWidgets.QLabel(Form)
self.label_4.setGeometry(QtCore.QRect(20, 110, 54, 12))
self.label_4.setObjectName("label_4")
self.incookie = QtWidgets.QLineEdit(Form)
self.incookie.setGeometry(QtCore.QRect(70, 109, 381, 21))
self.incookie.setObjectName("incookie")
self.startpachong = QtWidgets.QPushButton(Form)
self.startpachong.setGeometry(QtCore.QRect(20, 190, 431, 41))
self.startpachong.setObjectName("startpachong")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "爬虫程序"))
self.label.setText(_translate("Form", "<html><head/><body><p><span style=\" font-size:18pt;\">程序设置</span></p></body></html>"))
self.lujinuot.setText(_translate("Form", " "))
self.label_3.setText(_translate("Form", "<html><head/><body><p><span style=\" font-size:12pt;\">文件路径</span></p></body></html>"))
self.selectfile.setText(_translate("Form", "选择文件"))
self.label_4.setText(_translate("Form", "cookie:"))
self.startpachong.setText(_translate("Form", "开始爬取")) if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_Form()
ui.setupUi(MainWindow)
MainWindow.show() #可以通过QFileDialog.getOpenFileName打开文件目录,选择文件
#可以通过QFileDialog.getExistingDirectory选择文件目
# ui.cookie_edit.text() #获取QLineEdit里面的文本
# ui.lujinuot.setText(filename) #设置QLineEdit里面的文本
#QtWidgets.QApplication.processEvents() #界面实时刷新
#ui.selectfile.clicked.connect(selectfile) #点击事件
# ui.textout.append("点击了选择文件按钮\n") #添加内容
# ui.selectfile.isChecked() #返回按钮的状态True/False #提示框
# msg_box = QMessageBox(QMessageBox.Warning, "消息提示", "消息内容")
# msg_box.show()
# msg_box.exec_() def selectfile():
# msg_box = QMessageBox(QMessageBox.Warning, "消息提示", "消息内容")
# msg_box.show()
# msg_box.exec_() filename= QFileDialog.getExistingDirectory()
ui.lujinuot.setText(filename) ui.selectfile.clicked.connect(selectfile)
ui.textout.append("输入cookie点开始爬取\n") QtWidgets.QApplication.processEvents() #界面实时刷新 sys.exit(app.exec_())
实例2:
#coding:utf-8
import requests as req
import time,json,os,sys
import xlwt
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QFileDialog,QMessageBox,QApplication
import sys from multiprocessing import Process class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(479, 547)
self.textout = QtWidgets.QTextBrowser(Form)
self.textout.setGeometry(QtCore.QRect(20, 251, 431, 271))
self.textout.setObjectName("textout")
self.label = QtWidgets.QLabel(Form)
self.label.setGeometry(QtCore.QRect(180, 20, 101, 31))
self.label.setObjectName("label")
self.lujinuot = QtWidgets.QLabel(Form)
self.lujinuot.setGeometry(QtCore.QRect(90, 70, 271, 20))
self.lujinuot.setObjectName("lujinuot")
self.label_3 = QtWidgets.QLabel(Form)
self.label_3.setGeometry(QtCore.QRect(20, 70, 71, 21))
self.label_3.setObjectName("label_3")
self.selectfile = QtWidgets.QPushButton(Form)
self.selectfile.setGeometry(QtCore.QRect(370, 70, 81, 23))
self.selectfile.setObjectName("selectfile")
self.label_4 = QtWidgets.QLabel(Form)
self.label_4.setGeometry(QtCore.QRect(20, 120, 54, 12))
self.label_4.setObjectName("label_4")
self.incookie = QtWidgets.QLineEdit(Form)
self.incookie.setGeometry(QtCore.QRect(70, 120, 381, 21))
self.incookie.setObjectName("incookie")
self.startpachong = QtWidgets.QPushButton(Form)
self.startpachong.setGeometry(QtCore.QRect(20, 190, 431, 41))
self.startpachong.setObjectName("startpachong") self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "拼多多资料采集程序 v1.0"))
self.label.setText(_translate("Form", "<html><head/><body><p><span style=\" font-size:18pt;\">程序设置</span></p></body></html>"))
self.lujinuot.setText(_translate("Form", "路径显示"))
self.label_3.setText(_translate("Form", "<html><head/><body><p><span style=\" font-size:12pt;\">保存路径</span></p></body></html>"))
self.selectfile.setText(_translate("Form", "选择文件"))
self.label_4.setText(_translate("Form", "cookie:"))
self.startpachong.setText(_translate("Form", "开始")) def writeWFH(headers):
filename = "未发货-"+str(time.strftime("%Y-%m-%d").strip())+".xls"
# filename = os.path.join(ui.lujinuot.text(),filename)
wbk = xlwt.Workbook()
ws = wbk.add_sheet('sheet 1')
ws.write(0,0,"昵称")
ws.write(0,1,"电话号码")
ws.write(0,2,"地址")
ws.write(0,3,"快递公司")
ws.write(0,4,"快递单号") count = 1
page = 1
while True:
url = "https://st.huanleguang.com/api/trades?status=paid&print_status=all&shipping_delay=all&shop_id=&memo_type=1&seller_flag=-1&refund_status=all&order_type=all&area_info=all&order_num=all&post_type=all&merge_type=all&trade_type=all&page_size=200&page_no=%s&tid=&buyer_nick=&express_no=&receiver_mobile=&receiver_name=&item_name_id=&sku_size=&sku_color="%page
ret = req.get(url=url,headers=headers)
if len(json.loads(ret.text))>0:
for line in json.loads(ret.text):
TextWrite("第 %s 条记录"%count)
line = line[0]
nickname = line["receiver_name"]
phone = line["receiver_mobile"]
add = line["receiver_state"]+line["receiver_city"]+line["receiver_district"]+line["receiver_address"]
kuaidi = line["express_name"]
danhao = line["express_no"]
ws.write(count,0,nickname)
ws.write(count,1,phone)
ws.write(count,2,add)
ws.write(count,3,kuaidi)
ws.write(count,4,danhao)
count = count+1
page = page+1
else:
wbk.save(filename)
TextWrite("保存成功!%s"%filename)
break
return def writeYFH(headers):
wbk = xlwt.Workbook()
ws = wbk.add_sheet('sheet 1')
ws.write(0,0,"昵称")
ws.write(0,1,"电话号码")
ws.write(0,2,"地址")
ws.write(0,3,"快递公司")
ws.write(0,4,"快递单号") filename = "已发货-%s.xls"%str(time.strftime("%Y-%m-%d").strip())
# filename = os.path.join(ui.lujinuot.text(),filename)
count = 1
page = 1
while True:
url = "https://st.huanleguang.com/api/trades?status=shipped&print_status=all&shipping_delay=all&shop_id=&memo_type=1&seller_flag=-1&refund_status=all&order_type=all&area_info=all&order_num=all&post_type=all&merge_type=all&trade_type=all&page_size=200&page_no=%s&tid=&buyer_nick=&express_no=&receiver_mobile=&receiver_name=&item_name_id=&sku_size=&sku_color="%page
ret = req.get(url=url,headers=headers)
if len(json.loads(ret.text))>0:
for line in json.loads(ret.text):
TextWrite("第 %s 条记录"%count)
line = line[0]
nickname = line["receiver_name"]
phone = line["receiver_mobile"]
add = line["receiver_state"]+line["receiver_city"]+line["receiver_district"]+line["receiver_address"]
kuaidi = line["express_name"]
danhao = line["express_no"]
ws.write(count,0,nickname)
ws.write(count,1,phone)
ws.write(count,2,add)
ws.write(count,3,kuaidi)
ws.write(count,4,danhao)
count = count+1
page = page+1
else:
wbk.save(filename)
TextWrite("保存成功!%s"%filename)
return def SelectFile():
filename = QFileDialog.getExistingDirectory()
ui.lujinuot.setText(filename) def TextWrite(msg):
ui.textout.append(str(msg))
print(msg)
QtWidgets.QApplication.processEvents() def pa():
cookie = ui.lujinuot.text().strip()
# cookie = "__guid=227988319.2581628879631838000.1540522358017.8997; gr_user_id=b83ae182-83cd-4b7e-84b0-c22e856d1c3d; gr_session_id_84652f4a0b894385=7ef6971a-1053-47b0-bc0d-2eb931e3ed88; gr_session_id_84652f4a0b894385_7ef6971a-1053-47b0-bc0d-2eb931e3ed88=true; hlg_8_0=8-5045059-3-e695f708efb6c3e814ec42de4798554f; monitor_count=2; gr_cs1_7ef6971a-1053-47b0-bc0d-2eb931e3ed88=shop_id%3A5045059; _ati=7213780759932" headers = {"Accept-Encoding":"gzip, deflate, br","Accept-Language":"zh-CN,zh;q=0.9","Connection":"keep-alive","User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36","Cookie":cookie}
#全部数据
try:
time1 = time.time()
writeWFH(headers)
writeYFH(headers)
time2 = time.time()
time3 = time2-time1
TextWrite("用时 %s 秒"%str(int(time3*10)/10))
except Exception as e:
TextWrite("访问出错!"+str(e)) def StartPa():
# TextWrite(ui.incookie.text())
if ui.lujinuot.text() == "路径显示":
TextWrite("<html><head/><body><span style=\" color:red;\">请先选择文件保存路径!!!</span></body></html>")
return
elif ui.lujinuot.text() == "":
TextWrite("<html><head/><body><span style=\" color:red;\">保存路径不能为空!!!</span></body></html>")
return
elif ui.incookie.text() == "":
TextWrite("<html><head/><body><span style=\" color:red;\">cookie不能为空!!!</span></body></html>")
return
else:
pa() if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_Form()
ui.setupUi(MainWindow)
MainWindow.show() ui.selectfile.clicked.connect(SelectFile)
ui.startpachong.clicked.connect(StartPa) sys.exit(app.exec_())
python使用PyQt5,及QtCreator,qt-unified界面设计以及逻辑实现的更多相关文章
- PyQt5 - 01 使用qt creator创建第一个pyqt5界面程序
1. 安装Qt Creator qt creator下载点我 2. 利用Qt Creator创建界面 点击文件 -> 新建文件或项目 选择Qt -> Qt设计师界面类 选择一个模版,创建一 ...
- 第15.10节 PyQt(Python+Qt)入门学习:Qt Designer可视化设计界面组件与QWidget类相关的组件属性详解
PyQt学习有阵子了,对章节的骨架基本考虑好了,准备本节就写组件的属性的,结果一是日常工作繁忙,经常晚上还要加班,二是Qt的组件属性很多,只能逐一学习.研究和整理,花的时间有点长,不过终于将可视化设计 ...
- PyQt5系列教程(二)利用QtDesigner设计UI界面
软硬件环境 OS X EI Capitan Python 3.5.1 PyQt 5.5.1 PyCharm 5.0.1 前言 在PyQt5系列教程的第一篇http://blog.csdn.net/dj ...
- PyQt5多个GUI界面设计
版权声明:本文为博主原创文章,转载 请注明出处:https://blog.csdn.net/sc2079/article/details/90454379 - 写在前面 本科毕业设计终于告一段落了.特 ...
- 熬夜整理出来的干货:Python+Pycharm+PyQT5可视化程序设计入门
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:朱淑强 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自 ...
- Python 中 PyQt5 库语法(一)
目录 PyQt5库(一) 一. 简介 1. 什么是 Qt 2. 什么是PyQt 3. 环境搭建 二. 基本结构 1. 第一个程序 2. 控件操作 3. 快速生成代码 4. 面向对象 三. 基类控件 1 ...
- [OpenCV Qt教程] 在Qt图形界面中显示OpenCV图像的OpenGL Widget (第一部分)
本文译自:http://www.robot-home.it/blog/en/software/tutorial-opencv-qt-opengl-widget-per-visualizzare-imm ...
- pyqt5对用qt designer设计的窗体实现弹出子窗口的示例
pyqt5对用qt designer设计的窗体实现弹出子窗口的示例 脚本专栏 python 1. 用qt designer编写主窗体,窗体类型是MainWindow,空白窗口上一个按钮.并转换成mai ...
- qt简单界面更新代码(菜鸟级)(部分代码)
qt简单界面更新代码(菜鸟级)(部分代码)self.timers_1=QtCore.QTimer(self)self.timers_1.timeout.connect(self.min_1)self. ...
随机推荐
- Hive 基本语法操练(三):分区操作和桶操作
(一)分区操作 Hive 的分区通过在创建表时启动 PARTITION BY 实现,用来分区的维度并不是实际数据的某一列,具体分区的标志是由插入内容时给定的.当要查询某一分区的内容时可以采用 WHER ...
- (一)Redis简介和安装
1 Redis介绍 1.1 什么是NoSql 为了解决高并发.高可扩展.高可用.大数据存储问题而产生的数据库解决方案,就是NoSql数据库. NoSQL,泛指非关系型的数据库,N ...
- Java 多线程的实现方法
package com.jckb; /**多线程实现的两种方法 * * @author gx * */ public class Test2 { public static void main(Str ...
- 360或其他双核浏览器下在兼容模式用chrome内核渲染的方法
<meta name="renderer" content="webkit"> <meta http-equiv="X-UA-COM ...
- X64下IIS调用32位的dll
WebAPI项目中遇到了需要调用32位C++的dll的情况,调试的时候能正常调用,但是发布了之后部署在IIS中出现了BadFormatImage异常, 解决方法是在IIS中相应应用程序池=>高级 ...
- JAVA中数组介绍
一.数组: 数组指一组数据的集合,数组中的每个数据被称作元素. 二.数组定义: 数组类型[] 数组名 = new 数组类型[元素个数或数组长度]: (注意:等号前面的[]里面不能写任何东西) 也可以以 ...
- springboot+Jsp部署linux
这个springboot部署到linux,我之前一直都是在linux上使用tomcat部署,但是这样部署容易出现EL表达式无法使用导致项目报错:后来发现了一种更简单的方法,就是将项目打成war包,注册 ...
- 常用模块random,time,os,sys,序列化模块
一丶random模块 取随机数的模块 #导入random模块 import random #取随机小数: r = random.random() #取大于零且小于一之间的小数 print(r) #0. ...
- 【mysql】mysql 配置
安装完mysql后, 要及得配置一下 /etc/mysql/my.cnf 配置字符编码为utf8 [client] default-character-set = utf8 [mysqld] defa ...
- 第2章 TCP-IP的工作方式
第2章 TCP-IP的工作方式 TCP/IP协议系统 为了实现TCP的功能,TCP/IP的创建者使用了模块化的设计.TCP/IP协议系统被分为不同的组件,每个组件分别负责通信过程的一个步骤.这种模块化 ...