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. ...
随机推荐
- Lecture--9 Sorting
1/排序算法:冒泡排序bubble sort,插入排序 insertion sort,选择排序 selection sort,快速排序 quick sort,归并排序 merge sort;堆排序 h ...
- 浅析System.Console.WriteLine()
浅析System.Console.WriteLine() Writeline()函数的功能向 StreamWriter 类写入指定字符串和一行字符,共有19个重载,其与Write()函数的主要区别在于 ...
- 转---JS 获取鼠标左右键
原文:http://blog.csdn.net/mine3333/article/details/7291557 function test() { alert(event.x+" &quo ...
- AGC015 C Nuske vs Phantom Thnook(前缀和)
题意 题目链接 给出一张$n \times m$的网格,其中$1$为蓝点,$2$为白点. $Q$次询问,每次询问一个子矩阵内蓝点形成的联通块的数量 保证任意联通块内的任意蓝点之间均只有一条路径可达 S ...
- JavaScript初识(三)
十三丶JS中的面向对象 创建对象的几种常用方式: 1.使用Object或对象字面量创建对象 2.工厂模式创建对象 3.构造函数模式创建对象 4.原型模式创建对象 下面我们详细看一下如何创建对象 1.使 ...
- Table中采用JQuery slideToggle效果的问题
需求:用JQuery实现,点击最上边的粗加号时,对所有含有子表的Tr进行展开,点击 + 号时,只对当前Tr的下一个tr内容的动态隐藏和显示: 问题:JQuery的slideToggle() slide ...
- cout格式化输出 详解
//在使用setf等库函数时使用 //在使用流操纵算子时使用 //using namespace std; //以下所有的setf()都有对应的unsetf()用于取消设置 //所有的setiosfl ...
- Reduce侧连接
1.reduce side join 在reduce端进行表的连接,该方法的特点就是操作简单,缺点是map端shffule后传递给reduce端的数据量过大,极大的降低了性能 连接方法: (1)map ...
- innobackupex备份脚本
#!/bin/bash # 10 23 * * * /bin/bash /data/script/backup.sh BDATE=`date +%Y%m%d%H%M%S`BPATH=/data/bac ...
- 二叉搜索树(BST)学习笔记
简介 二叉搜索树(\(Binary\ Search\ Tree\)),简称\(BST\),用于在一个集合中查找元素. 性质 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为 ...