pyqt5 制作壁纸切换工具实例 第二章

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提供了大量能使我们快速便捷地处理数据的函数和方法。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

matianlongg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值