本方案将创建一个动态文字壁纸,文字可以平滑移动、渐变颜色、变换大小,并支持自定义文字内容和效果。
# 创建虚拟环境(可选)
python -m venv wallpaper_env
source wallpaper_env/bin/activate # Linux/Mac
# 或 wallpaper_env\Scripts\activate # Windows
# 安装依赖
pip install PyQt5 pywin32 # Windows系统需要pywin32
# Linux系统使用:pip install PyQt5
创建 dynamic_wallpaper.py:
import sys
import random
import math
from datetime import datetime
from PyQt5.QtCore import Qt, QTimer, QPoint, QRect, QPropertyAnimation, QEasingCurve
from PyQt5.QtGui import QPainter, QFont, QColor, QPen, QBrush, QLinearGradient
from PyQt5.QtWidgets import QApplication, QWidget, QDesktopWidget
class DynamicTextWallpaper(QWidget):
def __init__(self):
super().__init__()
# 窗口设置
self.setWindowFlags(
Qt.FramelessWindowHint |
Qt.WindowStaysOnBottomHint |
Qt.Tool
)
# 透明背景
self.setAttribute(Qt.WA_TranslucentBackground)
self.setAttribute(Qt.WA_TransparentForMouseEvents)
# 获取屏幕尺寸
screen = QDesktopWidget().screenGeometry()
self.setGeometry(0, 0, screen.width(), screen.height())
# 文字配置
self.texts = [
"Hello World",
"动态壁纸",
"Python编程",
"创意无限",
"代码之美"
]
# 文字对象列表
self.text_items = []
self.init_text_items()
# 颜色方案
self.color_schemes = [
[(255, 105, 180), (255, 20, 147), (199, 21, 133)], # 粉色系
[(135, 206, 250), (30, 144, 255), (0, 191, 255)], # 蓝色系
[(50, 205, 50), (34, 139, 34), (0, 128, 0)], # 绿色系
[(255, 215, 0), (255, 165, 0), (255, 140, 0)], # 金色系
[(138, 43, 226), (75, 0, 130), (147, 112, 219)] # 紫色系
]
# 动画计时器
self.timer = QTimer()
self.timer.timeout.connect(self.update_animation)
self.timer.start(50) # 20 FPS
# 颜色变换计时器
self.color_timer = QTimer()
self.color_timer.timeout.connect(self.update_colors)
self.color_timer.start(5000) # 每5秒变换颜色
self.current_color_scheme = 0
self.time_counter = 0
def init_text_items(self):
"""初始化文字对象"""
screen_width = self.width()
screen_height = self.height()
for i, text in enumerate(self.texts):
text_item = {
'text': text,
'x': random.randint(100, screen_width - 100),
'y': random.randint(100, screen_height - 100),
'dx': random.uniform(-2, 2),
'dy': random.uniform(-2, 2),
'size': random.randint(30, 70),
'rotation': random.uniform(0, 360),
'drotation': random.uniform(-1, 1),
'alpha': random.uniform(0.3, 0.8),
'pulse_speed': random.uniform(0.02, 0.05),
'pulse_phase': random.uniform(0, 2 * math.pi),
'font_index': i % 3
}
self.text_items.append(text_item)
def update_animation(self):
"""更新动画状态"""
self.time_counter += 0.1
for item in self.text_items:
# 更新位置
item['x'] += item['dx']
item['y'] += item['dy']
# 更新旋转
item['rotation'] += item['drotation']
# 边界检测
if item['x'] < 0 or item['x'] > self.width():
item['dx'] = -item['dx']
if item['y'] < 0 or item['y'] > self.height():
item['dy'] = -item['dy']
# 脉动效果
pulse = math.sin(self.time_counter * item['pulse_speed'] + item['pulse_phase']) * 0.2 + 0.8
item['current_size'] = item['size'] * pulse
# 透明度脉动
item['current_alpha'] = item['alpha'] * (0.7 + 0.3 * math.sin(self.time_counter * 0.5))
self.update()
def update_colors(self):
"""更换颜色方案"""
self.current_color_scheme = (self.current_color_scheme + 1) % len(self.color_schemes)
def paintEvent(self, event):
"""绘制事件"""
painter = QPainter(self)
painter.setRenderHint(QPainter.Antialiasing)
painter.setRenderHint(QPainter.TextAntialiasing)
for item in self.text_items:
self.draw_text_item(painter, item)
def draw_text_item(self, painter, item):
"""绘制单个文字项"""
# 保存画笔状态
painter.save()
# 设置字体
fonts = ["Arial", "Microsoft YaHei", "SimSun"]
font = QFont(fonts[item['font_index']], int(item['current_size']))
font.setBold(True)
painter.setFont(font)
# 创建渐变颜色
colors = self.color_schemes[self.current_color_scheme]
gradient = QLinearGradient(
item['x'], item['y'],
item['x'] + 100, item['y'] + 100
)
# 添加渐变颜色点
for i, color in enumerate(colors):
pos = i / (len(colors) - 1) if len(colors) > 1 else 0
gradient.setColorAt(pos, QColor(*color, int(255 * item['current_alpha'])))
# 设置画笔和画刷
pen = QPen(QColor(255, 255, 255, int(100 * item['current_alpha'])))
pen.setWidth(2)
painter.setPen(pen)
painter.setBrush(QBrush(gradient))
# 应用旋转
painter.translate(item['x'], item['y'])
painter.rotate(item['rotation'])
painter.translate(-item['x'], -item['y'])
# 绘制文字轮廓和填充
painter.drawText(
QRect(int(item['x'] - 150), int(item['y'] - 50), 300, 100),
Qt.AlignCenter,
item['text']
)
# 恢复画笔状态
painter.restore()
def main():
app = QApplication(sys.argv)
# 设置窗口为桌面背景(Windows)
try:
import win32gui
import win32con
hwnd = win32gui.FindWindow(None, "DynamicTextWallpaper")
if hwnd:
# 将窗口置于桌面图标下方
win32gui.SetWindowPos(
hwnd,
win32con.HWND_BOTTOM,
0, 0, 0, 0,
win32con.SWP_NOMOVE | win32con.SWP_NOSIZE
)
except ImportError:
print("注意:未安装pywin32,壁纸可能不会在桌面图标下方")
print("请使用: pip install pywin32")
wallpaper = DynamicTextWallpaper()
wallpaper.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
创建 config_manager.py:
import json
import os
class WallpaperConfig:
def __init__(self, config_file="wallpaper_config.json"):
self.config_file = config_file
self.default_config = {
"texts": [
"Hello World",
"动态壁纸",
"Python编程",
"创意无限",
"代码之美"
],
"animation_speed": 1.0,
"color_change_interval": 5,
"max_fps": 20,
"font_sizes": [30, 70],
"opacity_range": [0.3, 0.8],
"enable_shadows": True,
"enable_pulse": True,
"enable_rotation": True
}
self.config = self.load_config()
def load_config(self):
"""加载配置文件"""
if os.path.exists(self.config_file):
try:
with open(self.config_file, 'r', encoding='utf-8') as f:
loaded_config = json.load(f)
# 合并配置,确保所有必要的键都存在
config = self.default_config.copy()
config.update(loaded_config)
return config
except Exception as e:
print(f"加载配置文件失败: {e}")
return self.default_config
return self.default_config.copy()
def save_config(self):
"""保存配置文件"""
try:
with open(self.config_file, 'w', encoding='utf-8') as f:
json.dump(self.config, f, indent=4, ensure_ascii=False)
return True
except Exception as e:
print(f"保存配置文件失败: {e}")
return False
def update_config(self, new_config):
"""更新配置"""
self.config.update(new_config)
self.save_config()
创建 control_panel.py:
from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QLabel,
QLineEdit, QPushButton, QSpinBox, QSlider,
QCheckBox, QComboBox, QSystemTrayIcon, QMenu,
QApplication, QMessageBox)
from PyQt5.QtCore import Qt, pyqtSignal
from PyQt5.QtGui import QIcon
class ControlPanel(QWidget):
config_changed = pyqtSignal(dict)
def __init__(self, config_manager):
super().__init__()
self.config_manager = config_manager
self.init_ui()
self.create_tray_icon()
def init_ui(self):
"""初始化用户界面"""
self.setWindowTitle("动态壁纸控制面板")
self.setGeometry(100, 100, 400, 500)
layout = QVBoxLayout()
# 文字内容设置
layout.addWidget(QLabel("文字内容(用逗号分隔):"))
self.text_input = QLineEdit()
self.text_input.setText(", ".join(self.config_manager.config["texts"]))
layout.addWidget(self.text_input)
# 动画速度
layout.addWidget(QLabel("动画速度:"))
self.speed_slider = QSlider(Qt.Horizontal)
self.speed_slider.setRange(1, 10)
self.speed_slider.setValue(int(self.config_manager.config["animation_speed"] * 5))
layout.addWidget(self.speed_slider)
# 颜色切换间隔
layout.addWidget(QLabel("颜色切换间隔(秒):"))
self.color_interval = QSpinBox()
self.color_interval.setRange(1, 60)
self.color_interval.setValue(self.config_manager.config["color_change_interval"])
layout.addWidget(self.color_interval)
# 特效开关
self.shadow_check = QCheckBox("启用阴影效果")
self.shadow_check.setChecked(self.config_manager.config["enable_shadows"])
layout.addWidget(self.shadow_check)
self.pulse_check = QCheckBox("启用脉动效果")
self.pulse_check.setChecked(self.config_manager.config["enable_pulse"])
layout.addWidget(self.pulse_check)
self.rotation_check = QCheckBox("启用旋转效果")
self.rotation_check.setChecked(self.config_manager.config["enable_rotation"])
layout.addWidget(self.rotation_check)
# 应用按钮
self.apply_btn = QPushButton("应用设置")
self.apply_btn.clicked.connect(self.apply_settings)
layout.addWidget(self.apply_btn)
# 恢复默认按钮
self.default_btn = QPushButton("恢复默认")
self.default_btn.clicked.connect(self.restore_defaults)
layout.addWidget(self.default_btn)
self.setLayout(layout)
def create_tray_icon(self):
"""创建系统托盘图标"""
self.tray_icon = QSystemTrayIcon(self)
self.tray_icon.setIcon(QIcon("icon.png")) # 需要提供图标文件
tray_menu = QMenu()
show_action = tray_menu.addAction("显示控制面板")
show_action.triggered.connect(self.show_panel)
hide_action = tray_menu.addAction("隐藏壁纸")
hide_action.triggered.connect(self.toggle_wallpaper)
quit_action = tray_menu.addAction("退出")
quit_action.triggered.connect(QApplication.quit)
self.tray_icon.setContextMenu(tray_menu)
self.tray_icon.show()
def show_panel(self):
"""显示控制面板"""
self.show()
self.raise_()
self.activateWindow()
def apply_settings(self):
"""应用设置"""
texts = [t.strip() for t in self.text_input.text().split(",") if t.strip()]
if not texts:
texts = ["Hello World"]
new_config = {
"texts": texts,
"animation_speed": self.speed_slider.value() / 5,
"color_change_interval": self.color_interval.value(),
"enable_shadows": self.shadow_check.isChecked(),
"enable_pulse": self.pulse_check.isChecked(),
"enable_rotation": self.rotation_check.isChecked()
}
self.config_manager.update_config(new_config)
self.config_changed.emit(new_config)
QMessageBox.information(self, "成功", "设置已应用!")
def restore_defaults(self):
"""恢复默认设置"""
self.config_manager.config = self.config_manager.default_config.copy()
self.config_manager.save_config()
self.config_changed.emit(self.config_manager.config)
QMessageBox.information(self, "成功", "已恢复默认设置!")
def toggle_wallpaper(self):
"""切换壁纸显示状态"""
# 这里需要与主窗口通信来控制显示/隐藏
pass
创建 main.py:
import sys
from PyQt5.QtWidgets import QApplication
from dynamic_wallpaper import DynamicTextWallpaper
from config_manager import WallpaperConfig
from control_panel import ControlPanel
def main():
app = QApplication(sys.argv)
# 初始化配置管理器
config_manager = WallpaperConfig()
# 创建动态壁纸窗口
wallpaper = DynamicTextWallpaper()
# 创建控制面板
control_panel = ControlPanel(config_manager)
# 连接信号
control_panel.config_changed.connect(wallpaper.update_config)
# 显示壁纸
wallpaper.show()
# 可选:显示控制面板
# control_panel.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
在 dynamic_wallpaper.py 中添加配置更新方法:
class DynamicTextWallpaper(QWidget):
# ... 原有代码 ...
def update_config(self, new_config):
"""更新配置"""
if 'texts' in new_config:
self.texts = new_config['texts']
self.text_items = []
self.init_text_items()
if 'animation_speed' in new_config:
self.timer.setInterval(int(50 / new_config['animation_speed']))
if 'color_change_interval' in new_config:
self.color_timer.setInterval(new_config['color_change_interval'] * 1000)
# 更新其他配置...
创建 start_wallpaper.bat(Windows)或 start_wallpaper.sh(Linux/Mac):
Windows (start_wallpaper.bat):
@echo off
python main.py
pause
Linux/Mac (start_wallpaper.sh):
#!/bin/bash
python3 main.py
使用 PyInstaller 打包:
pip install pyinstaller
# 打包为单个可执行文件
pyinstaller --onefile --windowed --name="DynamicWallpaper" main.py
# 或者打包为目录
pyinstaller --name="DynamicWallpaper" main.py
添加文字轨迹:
添加天气信息:
添加系统信息:
添加交互功能:
添加粒子效果:
支持多显示器:
性能优化:
兼容性:
资源管理:
这个动态文字壁纸程序是完全可定制的,你可以根据需要调整文字内容、颜色、动画效果等所有参数。程序运行后会创建一个透明窗口覆盖整个桌面,显示动态移动的文字,而不会影响桌面图标和正常操作。