pyqt5 制作壁纸切换工具实例 第一章 https://blog.csdn.net/mtl1994/article/details/118020546
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
使用pyqt5 制作壁纸小工具懒加载 实例。
提示:以下是本篇文章正文内容,下面案例可供参考
一、代码
1.结构
wallpaper
----resource
--------icon
------------icon.png
----src
--------frame
------------main.py
------------ui_mainwindow.py
------------image.py
----main.py
frame/main.py
MainWidget
init
1.初始化frame/ui_mainwindows.py
2.初始化系统托盘
3.给系统托盘设置点击方法
frame/ui_mainwindow.py
Ui_MainWindow
setupUi
1.布局
onValueChanged
1.滚动条事件如果到底,加载图片(分页 懒加载)
init_image
1.初始化线程显示预览图
retranslateUi
1.赋值
frame/image_widget.py(新增)
ImageWidget
init
1.初始化widget、盒子
2.获取图片
3.获取基础参数 宽高 、临时文件夹目录、设置大小
4.获取壁纸图片
setWallPaper
1.使用win32api 设置壁纸方法
download_img
1.下载图片并调用setWallPaper
show_images
1.加载图片
choose_image
1.图片点击 调用download_img
turn_page
1.翻页
MyLabel
init
1初始化
mousePressEvent
1.重写鼠标点击方法
main.py
1.主函数启动类
frame/main.py
frame/main.py
# -*- coding: utf-8 -*-
import os
import sys
from PyQt5.QtCore import QPropertyAnimation, QPoint, pyqtSignal
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QMainWindow, QSystemTrayIcon
from src.frame.ui_mainwindow import Ui_MainWindow
class MainWidget(Ui_MainWindow, QMainWindow):
SignalClosed = pyqtSignal()
def __init__(self, parent=None):
self.icon_path = os.path.join(sys.path[1], 'resource/icon/icon.png')
super(MainWidget, self).__init__(parent)
self.setupUi(self)
self.show_flag = False
self.setWindowTitle("壁纸")
self.setWindowIcon(QIcon(self.icon_path))
self.Ui_MainWindow = Ui_MainWindow
#系统托盘
self.trayIcon = QSystemTrayIcon(self)
self.trayIcon.setIcon(QIcon(self.icon_path))
self.trayIcon.setToolTip("壁纸")
self.trayIcon.show()
self.trayIcon.activated.connect(self.tray_click)
#设置在系统托盘上方显示
self.tg = self.trayIcon.geometry()
# self.setGeometry(self.tg.x()-452/2, self.tg.y()-802,452, 802)
self._startPos = QPoint(
self.tg.x()-452/2,
self.tg.y()
)
# 窗口弹出结束位置
self._endPos = QPoint(
self.tg.x()-452/2,
self.tg.y()-802-10
)
self.move(self._startPos)
# 动画
self.animation = QPropertyAnimation(self, b"pos")
# self.animation.finished.connect(self.onAnimationEnd)
self.animation.setDuration(1000) # 1s
def show_animation(self):
#显示动画
self.move(self._startPos)
self.animation.stop()
self.animation.setStartValue(self.pos())
self.animation.setEndValue(self._endPos)
self.animation.start()
def tray_click(self, reason):
if reason in [1,2,3]:
if self.show_flag:
self.hide()
else:
self.activateWindow()
self.raise_()
self.show()
self.show_animation()
self.show_flag = not self.show_flag
frame/ui_mainwindow.py
# -*- coding: utf-8 -*-
import threading
from PyQt5 import QtCore
from PyQt5.QtWidgets import QMainWindow, QHBoxLayout, QLabel, QWidget, QGridLayout, QVBoxLayout, QScrollArea
from PyQt5.QtCore import Qt
from src.frame.image_widget import image_widget
class Ui_MainWindow(QMainWindow):
def setupUi(self,MainWindow):
self.w,self.h = (660, 820)
self.img_height = (self.h - 100) // 4
self.resize(self.w,self.h)
self.img_data = None
self.img_arr = []
self.MainWindow = MainWindow
MainWindow.setWindowFlags(QtCore.Qt.SubWindow|QtCore.Qt.FramelessWindowHint)
#头部信息-----------------
self.title_label = QLabel(self)
#头部
self.title_widget = QWidget()
#头部盒子
self.title_hbox = QVBoxLayout()
self.title_hbox.addWidget(self.title_label)
self.title_widget.setLayout(self.title_hbox)
#信息body-----------------
self.center_widget = QWidget()
#盒子
self.center_hbox = QHBoxLayout()
self.label = QLabel(self)
self.label2 = QLabel(self)
self.label3 = QLabel(self)
self.center_hbox.addWidget(self.label)
self.center_hbox.addWidget(self.label2)
self.center_hbox.addWidget(self.label3)
self.center_widget.setLayout(self.center_hbox)
#下面-------------
self.bottom_widget = QWidget()
self.bottom_hbox = QVBoxLayout()
self.bottom_widget.setLayout(self.bottom_hbox)
# 创建窗口主部件
self.main_widget = QWidget()
# 创建主部件的网格布局
self.main_layout = QGridLayout()
# 设置窗口主部件布局为网格布局
self.main_widget.setLayout(self.main_layout)
#滚动条
self.scroll = QScrollArea()
self.scroll.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
#img begin
self.image_widget = image_widget(self, col=2,row=4,h=self.img_height, w=self.w)
self.scroll.setWidget(self.image_widget)
self.scroll.verticalScrollBar().valueChanged.connect(
self.onValueChanged)
#img end
# 左侧部件在第0行第0列,占12行5列
self.main_layout.addWidget(self.title_widget, 0, 0,1,12)
self.main_layout.addWidget(self.center_widget,1,0,1,12)
# 右侧部件在第0行第6列,占12行7列
self.main_layout.addWidget(self.scroll, 2, 0,10,12)
# 设置窗口主部件
self.main_layout.setContentsMargins(0, 0, 0, 0)
#渲染信息
self.retranslateUi()
MainWindow.setCentralWidget(self.main_widget)
self.init_image()
def onValueChanged(self, value):
"""滚动条下拉方法"""
max_height = self.img_height * (self.image_widget.page_no-1)*3 - self.scroll.horizontalScrollBar().height()
if ((value > 0 and self.image_widget.page_no == 1) or value >= max_height) and self.image_widget.flag:
self.image_widget.turn_page()
def init_image(self):
try:
t = threading.Thread(target=self.image_widget.show_images(), args=(),
name='funciton')
t.start()
except:
print(111)
print("Error: 无法启动线程")
def retranslateUi(self):
_translate = QtCore.QCoreApplication.translate
self.main_widget.setStyleSheet("background-color: rgb(0,0,0);"
"color:white")
self.title_label.setText(_translate("MainWindow", "壁纸"))
self.label.setText(_translate("MainWindow", "最新"))
self.label2.setText(_translate("MainWindow", "最热"))
self.label3.setText(_translate("MainWindow", "随机"))
self.title_label.setAlignment(Qt.AlignCenter)
self.label.setAlignment(Qt.AlignCenter)
self.label2.setAlignment(Qt.AlignCenter)
self.label3.setAlignment(Qt.AlignCenter)
self.title_widget.setFixedHeight(50)
self.center_widget.setFixedHeight(50)
frame/image_widget.py
# -*- coding: utf-8 -*-
import os
import tempfile
import threading
import time
import PyQt5
import requests
import win32api
import win32con
import win32gui
from PyQt5.QtCore import pyqtSignal
from PyQt5.QtGui import QPixmap, QImage
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QLabel
from src.util.unsplash_api import latest
class image_widget(QWidget):
page_no = 1 #页码
img_list = []
def __init__(self, parent=None, col=1, row=3, w=50, h=300):
super(image_widget, self).__init__(parent)
self.col = col
self.row = row
self.w = w
self.h = h
#设置初始宽高
self.setFixedSize(self.w, self.h*row)
self.vbox = QVBoxLayout(self)
self.vbox.setContentsMargins(0, 0, 0, 0)
#临时文件夹 存放下载图片
self.temp_path = tempfile.gettempdir()
self.img_list = latest()
self.flag = True #锁 防止连点
def setWallPaper(self,pic):
# open register
regKey = win32api.RegOpenKeyEx(win32con.HKEY_CURRENT_USER, "Control Panel\\Desktop", 0, win32con.KEY_SET_VALUE)
win32api.RegSetValueEx(regKey, "WallpaperStyle", 0, win32con.REG_SZ, "2")
win32api.RegSetValueEx(regKey, "TileWallpaper", 0, win32con.REG_SZ, "0")
# refresh screen
win32gui.SystemParametersInfo(win32con.SPI_SETDESKWALLPAPER, pic, win32con.SPIF_SENDWININICHANGE)
def download_img(self,img_url):
header = {} # 设置http header,视情况加需要的条目,这里的token是用来鉴权的一种方式
r = requests.get(img_url, headers=header, stream=True)
if r.status_code == 200:
if not os.path.exists(self.temp_path):
os.makedirs(self.temp_path)
img_name = time.strftime("%Y%m%d", time.localtime()) + ".jpg"
open(os.path.join(self.temp_path, img_name), 'wb').write(r.content) # 将内容写入图片
self.setWallPaper(os.path.join(self.temp_path, img_name))
del r
def turn_page(self):
length = len(self.img_list)
if self.page_no >= length//self.row:
print("没有了")
else:
self.page_no += 1
self.show_images()
def show_images(self):
_self = self
self.flag = False
length = len(self.img_list)
start,end = 0,self.row * self.col
if self.page_no > 1:
start = self.row * self.col * (self.page_no - 1)
end = self.row * self.col * self.page_no
self.setFixedSize(self.w, self.h * end)
hbox = QHBoxLayout(self)
while start < end and end < length:
r = self.img_list[start]
print(start,r["urls"]["small"])
c = requests.get(r["urls"]["small"]).content
img = QImage.fromData(c)
# pix = QPixmap(img).scaled(320, 180)
pix = QPixmap(img).scaled(self.w / self.col, self.h)
label = MyLabel(start)
label.setPixmap(pix) # 加载图片
label.signal.connect(_self.choose_image)
hbox.addWidget(label)
if (start+1) % self.col == 0:
self.vbox.addLayout(hbox)
hbox = QHBoxLayout(self)
start += 1
self.flag = True
def choose_image(self,index):
print(index)
try:
t = threading.Thread(target=self.download_img(self.img_list[index]["urls"]["regular"]),
name='funciton')
t.start()
except:
print("Error: 无法启动线程")
class MyLabel(QLabel):
signal = pyqtSignal(int)
def __init__(self, index=None):
super(MyLabel, self).__init__()
self.index = index
def mousePressEvent(self, e): # 重载鼠标点击事件
self.signal.emit(self.index)
if __name__ == '__main__':
print(2%2)
main.py
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
import traceback
from PyQt5.QtWidgets import QApplication
from frame.main import MainWidget
if __name__ == '__main__':
try:
app = QApplication(sys.argv)
# app.setStyleSheet(open("data/style.qss", "rb").read().decode("utf-8"))
QApplication.setQuitOnLastWindowClosed(False) # 关闭最后一个窗口不退出程序
window = MainWidget()
sys.exit(app.exec_())
except Exception as e:
traceback.print_exc()
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。