使用Python实现一个远程壁纸设置系统

作者:

文章目录
  • 该系统由两部分组成: 发送端:带有GUI界面的客户端,可选择图片并发送到目标计算机 接收端:后台运行的服务端,接收图片并自动设置为桌面壁纸
  • 网络隔离:建议在内部网络使用,或配置防火墙规则 身份验证:生产环境可添加简单的密码验证 文件验证:可添加文件类型和大小检查 访问控制:可限制允许连接的IP地址范围
  • 系统可以进一步扩展以下功能: 批量发送到多个目标 壁纸定时自动更换 壁纸历史记录和回滚 支持更多图片格式和特效 添加用户认证机制 这个远程壁纸设置系统展示了如何使用Python的socket编程和Windows API实现实用的系统集成功能。代码结构清晰,易于理解和扩展,为跨设备文件传输和系统设置提供了很好的参考实现。 以上就是使用Python实现一个远程壁纸设置系统的详细内容,更多关于Python远程壁纸设置的资料请关注风君子博客其它相关文章! 您可能感兴趣的文章: Python实现设置windows桌面壁纸代码分享 python设置windows桌面壁纸的实现代码 Python实现电脑壁纸的采集与轮换效果 用python爬取电脑壁纸实例代码
  • 目录
    • 系统概述
    • 完整代码实现
      • 1. 发送端代码
      • 2. 接收端代码
    • 系统效果展示
      • 发送端界面
      • 接收端运行效果
      • 壁纸设置效果
    • 使用说明
      • 安装依赖
      • 使用步骤
    • 技术特点
      • 网络通信
      • 文件处理
      • Windows集成
    • 应用场景
      • 企业环境
      • 教育场景
      • 家庭使用
      • 个人使用
    • 安全考虑
      • 扩展功能

        该系统由两部分组成:

        • 发送端:带有GUI界面的客户端,可选择图片并发送到目标计算机
        • 接收端:后台运行的服务端,接收图片并自动设置为桌面壁纸

        import os
        import socket
        import tkinter as tk
        from tkinter import filedialog, messagebox, ttk
        from PIL import Image, ImageTk
        import json
        
        
        class RemoteWallpaperClient:
            def __init__(self, root):
                self.root = root
                self.root.title("远程壁纸设置客户端")
                self.root.geometry("500x450")
                self.root.resizable(False, False)
        
                # 默认服务器端口
                self.default_port = 12345
        
                # 当前选择的图片路径
                self.current_image_path = None
        
                # 创建界面
                self.create_widgets()
        
            def create_widgets(self):
                # 主框架
                main_frame = ttk.Frame(self.root, padding="20")
                main_frame.pack(fill=tk.BOTH, expand=True)
        
                # 标题
                title_label = ttk.Label(main_frame, text="远程壁纸设置客户端",
                                        font=("Arial", 16, "bold"))
                title_label.pack(pady=10)
        
                # 目标计算机设置区域
                target_frame = ttk.LabelFrame(main_frame, text="目标计算机设置", padding="10")
                target_frame.pack(fill=tk.X, pady=10)
        
                # IP地址输入
                ip_frame = ttk.Frame(target_frame)
                ip_frame.pack(fill=tk.X, pady=5)
        
                ttk.Label(ip_frame, text="目标IP地址:").pack(side=tk.LEFT)
                self.ip_entry = ttk.Entry(ip_frame, width=15)
                self.ip_entry.pack(side=tk.LEFT, padx=5)
                self.ip_entry.insert(0, "192.168.1.")
        
                # 端口输入
                port_frame = ttk.Frame(target_frame)
                port_frame.pack(fill=tk.X, pady=5)
        
                ttk.Label(port_frame, text="端口:").pack(side=tk.LEFT)
                self.port_entry = ttk.Entry(port_frame, width=10)
                self.port_entry.pack(side=tk.LEFT, padx=5)
                self.port_entry.insert(0, str(self.default_port))
        
                # 壁纸选择区域
                wallpaper_frame = ttk.LabelFrame(main_frame, text="壁纸设置", padding="10")
                wallpaper_frame.pack(fill=tk.X, pady=10)
        
                # 选择壁纸按钮
                select_btn = ttk.Button(wallpaper_frame, text="选择壁纸图片",
                                        command=self.select_wallpaper)
                select_btn.pack(pady=5)
        
                # 壁纸预览区域
                preview_frame = ttk.Frame(wallpaper_frame)
                preview_frame.pack(fill=tk.X, pady=5)
        
                self.preview_label = tk.Label(preview_frame, text="未选择图片",
                                              relief=tk.SUNKEN, bg='white',
                                              width=50, height=12)
                self.preview_label.pack(fill=tk.BOTH, expand=True)
        
                # 按钮框架
                btn_frame = ttk.Frame(main_frame)
                btn_frame.pack(pady=10)
        
                # 发送壁纸按钮
                send_btn = ttk.Button(btn_frame, text="发送壁纸",
                                      command=self.send_wallpaper)
                send_btn.pack(side=tk.LEFT, padx=5)
        
                # 测试连接按钮
                test_btn = ttk.Button(btn_frame, text="测试连接",
                                      command=self.test_connection)
                test_btn.pack(side=tk.LEFT, padx=5)
        
                # 状态栏
                self.status_var = tk.StringVar()
                self.status_var.set("就绪")
                status_bar = ttk.Label(main_frame, textvariable=self.status_var,
                                       relief=tk.SUNKEN, anchor=tk.W)
                status_bar.pack(fill=tk.X, side=tk.BOTTOM)
        
            def select_wallpaper(self):
                """选择壁纸图片"""
                file_types = [
                    ("图片文件", "*.jpg *.jpeg *.png *.bmp"),
                    ("所有文件", "*.*")
                ]
        
                file_path = filedialog.askopenfilename(
                    title="选择壁纸图片",
                    filetypes=file_types
                )
        
                if file_path:
                    self.current_image_path = file_path
                    self.preview_wallpaper(file_path)
                    self.status_var.set(f"已选择: {os.path.basename(file_path)}")
        
            def preview_wallpaper(self, image_path):
                """预览壁纸"""
                try:
                    # 打开图片
                    image = Image.open(image_path)
        
                    # 调整图片大小以适应预览区域
                    preview_width = 400
                    preview_height = 200
                    image.thumbnail((preview_width, preview_height), Image.Resampling.LANCZOS)
        
                    # 转换为Tkinter可用的格式
                    photo = ImageTk.PhotoImage(image)
        
                    # 更新预览标签
                    self.preview_label.configure(image=photo, text="")
                    self.preview_label.image = photo  # 保持引用
        
                except Exception as e:
                    self.preview_label.configure(image=None, text="预览加载失败")
                    print(f"预览图片失败: {e}")
        
            def test_connection(self):
                """测试与目标计算机的连接"""
                ip = self.ip_entry.get().strip()
                port = self.port_entry.get().strip()
        
                if not ip:
                    messagebox.showerror("错误", "请输入目标IP地址")
                    return
        
                try:
                    port = int(port)
                except ValueError:
                    messagebox.showerror("错误", "端口号必须是数字")
                    return
        
                try:
                    # 尝试连接
                    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                    sock.settimeout(5)  # 5秒超时
                    result = sock.connect_ex((ip, port))
                    sock.close()
        
                    if result == 0:
                        messagebox.showinfo("成功", f"成功连接到 {ip}:{port}")
                        self.status_var.set(f"已连接到 {ip}:{port}")
                    else:
                        messagebox.showerror("错误", f"无法连接到 {ip}:{port},请检查目标计算机是否运行了服务端程序")
                        self.status_var.set("连接失败")
        
                except Exception as e:
                    messagebox.showerror("错误", f"连接测试失败: {str(e)}")
                    self.status_var.set("连接测试失败")
        
            def send_wallpaper(self):
                """发送壁纸到目标计算机"""
                # 获取目标IP和端口
                ip = self.ip_entry.get().strip()
                port = self.port_entry.get().strip()
        
                if not ip:
                    messagebox.showerror("错误", "请输入目标IP地址")
                    return
        
                if not self.current_image_path:
                    messagebox.showerror("错误", "请先选择壁纸图片")
                    return
        
                try:
                    port = int(port)
                except ValueError:
                    messagebox.showerror("错误", "端口号必须是数字")
                    return
        
                try:
                    # 读取图片文件
                    with open(self.current_image_path, 'rb') as f:
                        image_data = f.read()
        
                    # 获取文件名
                    filename = os.path.basename(self.current_image_path)
        
                    # 创建连接
                    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                    sock.settimeout(10)  # 10秒超时
        
                    self.status_var.set(f"正在连接到 {ip}:{port}...")
                    sock.connect((ip, port))
        
                    # 发送文件名和文件大小
                    file_info = {
                        'filename': filename,
                        'filesize': len(image_data)
                    }
                    file_info_json = json.dumps(file_info).encode('utf-8')
        
                    # 先发送文件信息长度,然后发送文件信息
                    sock.send(len(file_info_json).to_bytes(4, byteorder='big'))
                    sock.send(file_info_json)
        
                    # 发送图片数据
                    self.status_var.set("正在发送壁纸数据...")
                    sock.sendall(image_data)
        
                    # 接收响应
                    response = sock.recv(1024).decode('utf-8')
                    sock.close()
        
                    if response == "SUCCESS":
                        messagebox.showinfo("成功", f"壁纸已成功发送到 {ip}")
                        self.status_var.set(f"壁纸已发送到 {ip}")
                    else:
                        messagebox.showerror("错误", f"设置壁纸失败: {response}")
                        self.status_var.set("设置壁纸失败")
        
                except Exception as e:
                    messagebox.showerror("错误", f"发送壁纸失败: {str(e)}")
                    self.status_var.set("发送失败")
        
        
        def main():
            # 检查依赖
            try:
                from PIL import Image
            except ImportError:
                print("请先安装 Pillow 库: pip install Pillow")
                return
        
            # 创建主窗口
            root = tk.Tk()
            app = RemoteWallpaperClient(root)
        
            # 启动主循环
            root.mainloop()
        
        
        if __name__ == "__main__":
            main()
        

        import os
        import socket
        import threading
        import ctypes
        import json
        import tempfile
        
        
        class WallpaperServer:
            def __init__(self, port=12345):
                self.port = port
                self.host = '0.0.0.0'  # 监听所有接口
                self.running = False
                self.server_socket = None
        
            def start(self):
                """启动服务器"""
                try:
                    self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                    self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
                    self.server_socket.bind((self.host, self.port))
                    self.server_socket.listen(5)
                    self.running = True
        
                    print(f"壁纸服务器已启动,监听端口 {self.port}")
                    print("等待客户端连接...")
        
                    while self.running:
                        try:
                            client_socket, addr = self.server_socket.accept()
                            print(f"接收到来自 {addr} 的连接")
        
                            # 为每个客户端创建新线程
                            client_thread = threading.Thread(
                                target=self.handle_client,
                                args=(client_socket, addr)
                            )
                            client_thread.daemon = True
                            client_thread.start()
        
                        except Exception as e:
                            if self.running:
                                print(f"接受连接时出错: {e}")
        
                except Exception as e:
                    print(f"启动服务器失败: {e}")
        
            def handle_client(self, client_socket, addr):
                """处理客户端连接"""
                try:
                    # 接收文件信息长度
                    file_info_len = int.from_bytes(client_socket.recv(4), byteorder='big')
        
                    # 接收文件信息
                    file_info_json = client_socket.recv(file_info_len).decode('utf-8')
                    file_info = json.loads(file_info_json)
        
                    filename = file_info['filename']
                    filesize = file_info['filesize']
        
                    print(f"接收文件: {filename}, 大小: {filesize} 字节")
        
                    # 接收文件数据
                    received_data = b''
                    while len(received_data) < filesize:
                        chunk = client_socket.recv(min(4096, filesize - len(received_data)))
                        if not chunk:
                            break
                        received_data += chunk
        
                    # 保存文件到临时目录
                    temp_dir = tempfile.gettempdir()
                    temp_file_path = os.path.join(temp_dir, filename)
        
                    with open(temp_file_path, 'wb') as f:
                        f.write(received_data)
        
                    print(f"文件已保存到: {temp_file_path}")
        
                    # 设置壁纸
                    if self.set_windows_wallpaper(temp_file_path):
                        print("壁纸设置成功")
                        client_socket.send("SUCCESS".encode('utf-8'))
                    else:
                        print("壁纸设置失败")
                        client_socket.send("FAILED: 无法设置壁纸".encode('utf-8'))
        
                except Exception as e:
                    print(f"处理客户端请求时出错: {e}")
                    try:
                        client_socket.send(f"FAILED: {str(e)}".encode('utf-8'))
                    except:
                        pass
                finally:
                    client_socket.close()
        
            def set_windows_wallpaper(self, image_path):
                """设置Windows壁纸"""
                try:
                    # 转换为绝对路径
                    abs_path = os.path.abspath(image_path)
        
                    # Windows API 常量
                    SPI_SETDESKWALLPAPER = 20
                    SPIF_UPDATEINIFILE = 0x01
                    SPIF_SENDWININICHANGE = 0x02
        
                    # 设置壁纸
                    result = ctypes.windll.user32.SystemParametersInfoW(
                        SPI_SETDESKWALLPAPER,
                        0,
                        abs_path,
                        SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE
                    )
        
                    return bool(result)
                except Exception as e:
                    print(f"设置壁纸失败: {e}")
                    return False
        
            def stop(self):
                """停止服务器"""
                self.running = False
                if self.server_socket:
                    self.server_socket.close()
                print("壁纸服务器已停止")
        
        
        def main():
            # 检查操作系统
            if os.name != 'nt':
                print("此程序仅支持Windows系统")
                return
        
            # 创建并启动服务器
            server = WallpaperServer(port=12345)
        
            try:
                server.start()
            except KeyboardInterrupt:
                print("n正在停止服务器...")
                server.stop()
        
        
        if __name__ == "__main__":
            main()
        

        发送端提供直观的GUI界面,包含以下功能区域:

        目标计算机设置

        • IP地址输入框(默认192.168.1.)
        • 端口输入框(默认12345)

        壁纸设置

        • 选择壁纸图片按钮
        • 图片预览区域
        • 支持JPG、JPEG、PNG、BMP格式

        操作按钮

        • 发送壁纸按钮
        • 测试连接按钮
        • 实时状态显示栏

        接收端在后台运行,控制台显示如下状态信息:

        壁纸服务器已启动,监听端口 12345
        等待客户端连接...
        接收到来自 192.168.1.100 的连接
        接收文件: wallpaper.jpg, 大小: 2048576 字节
        文件已保存到: C:UsersUsernameAppDataLocalTempwallpaper.jpg
        壁纸设置成功
        

        在运行程序前,需要安装必要的Python库:

        pip install Pillow
        

        启动接收端

        • 在目标计算机上运行接收端程序
        • 程序将在后台监听指定端口(默认12345)
        • 仅支持Windows系统

        配置发送端

        • 运行发送端程序
        • 输入目标计算机的IP地址
        • 确保端口号与接收端一致

        选择壁纸

        • 点击"选择壁纸图片"按钮
        • 从本地选择图片文件
        • 预览区域将显示缩略图

        发送壁纸

        • 可先点击"测试连接"验证网络连通性
        • 点击"发送壁纸"开始传输
        • 状态栏显示发送进度和结果

        • TCP协议:使用可靠的TCP连接传输文件
        • 多线程处理:服务端为每个客户端连接创建独立线程
        • JSON数据格式:使用JSON传输文件元信息
        • 大文件支持:分块传输,支持大尺寸图片

        • 格式支持:支持常见图片格式(JPG、PNG、BMP等)
        • 预览功能:发送端提供图片预览
        • 临时存储:接收端将文件保存在临时目录
        • 路径处理:自动处理绝对路径和相对路径

        • 系统API:使用Windows API设置壁纸
        • 即时生效:壁纸设置后立即应用
        • 兼容性:支持各种分辨率和图片比例

        • 统一壁纸:为办公电脑设置统一的公司壁纸
        • 活动宣传:推送活动主题壁纸
        • 安全提醒:设置安全提示壁纸

        • 教室管理:为机房电脑统一设置壁纸
        • 课程主题:根据课程内容推送相关壁纸

        • 多设备同步:为家中多台电脑设置相同壁纸
        • 节日主题:根据节日推送相应主题壁纸

        • 远程管理:远程为自己的其他设备更换壁纸
        • 自动轮换:结合脚本实现自动壁纸轮换

        1. 网络隔离:建议在内部网络使用,或配置防火墙规则
        2. 身份验证:生产环境可添加简单的密码验证
        3. 文件验证:可添加文件类型和大小检查
        4. 访问控制:可限制允许连接的IP地址范围

        系统可以进一步扩展以下功能:

        • 批量发送到多个目标
        • 壁纸定时自动更换
        • 壁纸历史记录和回滚
        • 支持更多图片格式和特效
        • 添加用户认证机制

        这个远程壁纸设置系统展示了如何使用Python的socket编程和Windows API实现实用的系统集成功能。代码结构清晰,易于理解和扩展,为跨设备文件传输和系统设置提供了很好的参考实现。

        以上就是使用Python实现一个远程壁纸设置系统的详细内容,更多关于Python远程壁纸设置的资料请关注风君子博客其它相关文章!

        您可能感兴趣的文章:

        • Python实现设置windows桌面壁纸代码分享
        • python设置windows桌面壁纸的实现代码
        • Python实现电脑壁纸的采集与轮换效果
        • 用python爬取电脑壁纸实例代码

        站内搜索