当前位置: 首页 > wzjs >正文

建立一个公司的网站江苏齐力建设集团网站

建立一个公司的网站,江苏齐力建设集团网站,wordpress管理员后台,婴幼儿网站模板🌐【开源工具】一键解决使用代理后无法访问浏览器网页问题 - 基于PyQt5的智能代理开关工具开发全攻略 🌈 个人主页:创客白泽 - CSDN博客 🔥 系列专栏:🐍《Python开源项目实战》 💡 热爱不止于代…

🌐【开源工具】一键解决使用代理后无法访问浏览器网页问题 - 基于PyQt5的智能代理开关工具开发全攻略

在这里插入图片描述
请添加图片描述

🌈 个人主页:创客白泽 - CSDN博客
🔥 系列专栏:🐍《Python开源项目实战》
💡 热爱不止于代码,热情源自每一个灵感闪现的夜晚。愿以开源之火,点亮前行之路。
🐋 希望大家多多支持,我们一起进步!
👍 🎉如果文章对你有帮助的话,欢迎 点赞 👍🏻 评论 💬 收藏 ⭐️ 加关注+💗分享给更多人哦

请添加图片描述

在这里插入图片描述

📌 概述:代理访问的痛点与解决方案

在日常开发和学习中,我们经常需要使用代理访问国际资源。但Windows系统代理设置存在几个典型痛点:

  1. 代理频繁失效需要手动切换
  2. 设置路径深(控制面板→Internet选项→连接→局域网设置)
  3. 状态不可视化,无法快速判断当前代理状态

本文介绍一款基于PyQt5开发的可视化代理开关工具,具有以下核心优势:

  • 一键切换系统代理状态
  • 美观的动画可视化效果
  • 实时状态反馈
  • 便携式设计(单文件运行)

🛠️ 功能特性

核心功能

  • 注册表代理状态实时检测
  • 管理员权限自动检测
  • 系统设置变更通知
  • 拖拽式无边框窗口

增强特性

  • 平滑过渡动画(QEasingCurve控制)
  • 自适应UI布局
  • 多显示器DPI适配
  • 跨平台兼容处理(Windows/macOS)

🎥 效果展示

在这里插入图片描述
在这里插入图片描述

图1:工具运行效果(开启/关闭状态对比对应的网络代理开启变化)

🧰 开发环境准备

基础环境

  • Python 3.8+
  • PyQt5 5.15
  • Windows 10/11(需管理员权限)

安装依赖

pip install pyqt5 win32ctypes ctypes

🚀 使用说明

基础使用

  1. 直接运行程序(建议管理员权限)
  2. 点击滑块切换代理状态
  3. 顶部拖拽区域可移动窗口
  4. 点击×按钮关闭程序

高级配置

修改代理服务器地址(需编辑注册表):

# 在setProxyState方法中添加以下代码
proxy_server = "127.0.0.1:1080"
winreg.SetValueEx(key, "ProxyServer", 0, winreg.REG_SZ, proxy_server)

🔍 代码深度解析

1. 自定义SwitchButton组件

class SwitchButton(QWidget):toggled = pyqtSignal(bool)def paintEvent(self, event):# 使用QLinearGradient实现渐变色效果gradient = QLinearGradient(bg_rect.topLeft(), bg_rect.bottomRight())if self._checked:gradient.setColorAt(0, QColor("#66BB6A"))  # 开启状态渐变色else:gradient.setColorAt(0, QColor("#E0E0E0"))  # 关闭状态渐变色

关键点分析

  • 通过pyqtProperty实现动画属性绑定
  • 使用QEasingCurve.OutQuad实现自然减速效果
  • 双状态绘制逻辑(开启/关闭)

2. 注册表操作核心逻辑

def setProxyState(self, enabled):try:with winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"Software\Microsoft\Windows\CurrentVersion\Internet Settings", 0, winreg.KEY_WRITE) as key:winreg.SetValueEx(key, "ProxyEnable", 0, winreg.REG_DWORD, 1 if enabled else 0)# 关键!通知系统设置变更self.notifySystem()

注册表路径解析

HKEY_CURRENT_USER
└── Software└── Microsoft└── Windows└── CurrentVersion└── Internet Settings├── ProxyEnable (DWORD)└── ProxyServer (STRING)

3. 系统通知机制

def notifySystem(self):INTERNET_OPTION_SETTINGS_CHANGED = 39INTERNET_OPTION_REFRESH = 37ctypes.windll.Wininet.InternetSetOptionW(0, INTERNET_OPTION_SETTINGS_CHANGED, 0, 0)ctypes.windll.Wininet.InternetSetOptionW(0, INTERNET_OPTION_REFRESH, 0, 0)

技术原理
调用WinINet API通知系统代理设置已变更,避免需要重启浏览器才能生效

💾 完整源码下载

import sys
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QFrame)
from PyQt5.QtCore import (Qt, QPropertyAnimation, QEasingCurve, QPoint, pyqtProperty, pyqtSignal)
from PyQt5.QtGui import QColor, QFont, QPainter, QBrush, QPen, QLinearGradient
import winreg
import ctypes
import platformclass SwitchButton(QWidget):toggled = pyqtSignal(bool)def __init__(self, parent=None):super().__init__(parent)self.setFixedSize(80, 40)self._checked = Falseself._circle_position = QPoint(5, 5)  # 明确初始化位置self._bg_color = QColor("#cccccc")self._circle_color = QColor("#ffffff")self._active_color = QColor("#4CAF50")self._animation = QPropertyAnimation(self, b"circle_position")self._animation.setDuration(200)self._animation.setEasingCurve(QEasingCurve.OutQuad)def paintEvent(self, event):painter = QPainter(self)painter.setRenderHint(QPainter.Antialiasing)# 绘制背景bg_rect = self.rect()gradient = QLinearGradient(bg_rect.topLeft(), bg_rect.bottomRight())if self._checked:gradient.setColorAt(0, QColor("#66BB6A"))gradient.setColorAt(1, QColor("#81C784"))else:gradient.setColorAt(0, QColor("#E0E0E0"))gradient.setColorAt(1, QColor("#BDBDBD"))painter.setBrush(QBrush(gradient))painter.setPen(Qt.NoPen)painter.drawRoundedRect(bg_rect, 20, 20)# 绘制圆形滑块painter.setBrush(QBrush(self._circle_color))painter.setPen(QPen(QColor("#999999"), 1))painter.drawEllipse(self._circle_position.x(), 5, 30, 30)@pyqtProperty(QPoint)def circle_position(self):return self._circle_position@circle_position.setterdef circle_position(self, pos):self._circle_position = posself.update()def mousePressEvent(self, event):if event.button() == Qt.LeftButton:self.toggle()def toggle(self, checked=None):if checked is None:self._checked = not self._checkedelse:self._checked = checked# 动画效果start_pos = QPoint(5, 5) if not self._checked else QPoint(45, 5)end_pos = QPoint(45, 5) if not self._checked else QPoint(5, 5)self._animation.stop()self._animation.setStartValue(start_pos)self._animation.setEndValue(end_pos)self._animation.start()self.update()self.toggled.emit(self._checked)def isChecked(self):return self._checkeddef setChecked(self, checked):self.toggle(checked)class ProxySwitchApp(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("网络代理开关")self.setFixedSize(180, 210)self.setWindowFlags(self.windowFlags() | Qt.FramelessWindowHint)self.setAttribute(Qt.WA_TranslucentBackground)self.initUI()self.initProxyState()def initUI(self):# 主窗口容器self.main_widget = QWidget()self.main_widget.setObjectName("mainWidget")self.setCentralWidget(self.main_widget)# 主布局layout = QVBoxLayout(self.main_widget)layout.setContentsMargins(20, 20, 20, 20)layout.setSpacing(20)# 标题栏title_bar = QWidget()title_bar.setFixedHeight(30)title_bar_layout = QHBoxLayout(title_bar)title_bar_layout.setContentsMargins(0, 0, 0, 0)self.title_label = QLabel("网络代理开关")self.title_label.setStyleSheet("font-size: 16px; font-weight: bold; color: #333333;")self.close_btn = QPushButton("×")self.close_btn.setFixedSize(30, 30)self.close_btn.setStyleSheet("""QPushButton {border: none;font-size: 18px;color: #777777;}QPushButton:hover {color: #ffffff;background-color: #E81123;border-radius: 15px;}""")self.close_btn.clicked.connect(self.close)title_bar_layout.addWidget(self.title_label)title_bar_layout.addStretch()title_bar_layout.addWidget(self.close_btn)# 开关控件switch_container = QWidget()switch_layout = QHBoxLayout(switch_container)switch_layout.setContentsMargins(0, 0, 0, 0)self.switch = SwitchButton()self.switch.toggled.connect(self.onSwitchToggled)self.status_label = QLabel()self.status_label.setStyleSheet("font-size: 14px; color: #555555;")self.status_label.setAlignment(Qt.AlignCenter)switch_layout.addStretch()switch_layout.addWidget(self.switch)switch_layout.addStretch()# 底部信息info_label = QLabel("点击滑块切换代理状态")info_label.setStyleSheet("font-size: 12px; color: #888888;")info_label.setAlignment(Qt.AlignCenter)# 添加到主布局layout.addWidget(title_bar)layout.addWidget(switch_container)layout.addWidget(self.status_label)layout.addWidget(info_label)layout.addStretch()# 设置样式self.main_widget.setStyleSheet("""#mainWidget {background-color: #ffffff;border-radius: 10px;border: 1px solid #dddddd;}""")def initProxyState(self):try:with winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"Software\Microsoft\Windows\CurrentVersion\Internet Settings", 0, winreg.KEY_READ) as key:value, _ = winreg.QueryValueEx(key, "ProxyEnable")self.switch.setChecked(value == 1)self.updateStatusLabel(value == 1)except WindowsError:self.switch.setChecked(False)self.updateStatusLabel(False)def onSwitchToggled(self, checked):self.setProxyState(checked)self.updateStatusLabel(checked)def setProxyState(self, enabled):try:with winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"Software\Microsoft\Windows\CurrentVersion\Internet Settings", 0, winreg.KEY_WRITE) as key:winreg.SetValueEx(key, "ProxyEnable", 0, winreg.REG_DWORD, 1 if enabled else 0)# 通知系统设置已更改self.notifySystem()return Trueexcept WindowsError as e:print(f"修改注册表失败: {e}")# 尝试以管理员身份运行if not self.isAdmin():self.showMessage("需要管理员权限", "请以管理员身份运行此程序")return Falsedef updateStatusLabel(self, enabled):if enabled:self.status_label.setText("代理状态: <span style='color:#4CAF50;'>已开启</span>")else:self.status_label.setText("代理状态: <span style='color:#F44336;'>已关闭</span>")def isAdmin(self):try:return ctypes.windll.shell32.IsUserAnAdmin()except:return Falsedef notifySystem(self):"""通知系统代理设置已更改"""if platform.system() == "Windows":INTERNET_OPTION_SETTINGS_CHANGED = 39INTERNET_OPTION_REFRESH = 37ctypes.windll.Wininet.InternetSetOptionW(0, INTERNET_OPTION_SETTINGS_CHANGED, 0, 0)ctypes.windll.Wininet.InternetSetOptionW(0, INTERNET_OPTION_REFRESH, 0, 0)def showMessage(self, title, message):from PyQt5.QtWidgets import QMessageBoxQMessageBox.information(self, title, message)def mousePressEvent(self, event):if event.button() == Qt.LeftButton:self.drag_pos = event.globalPos()event.accept()def mouseMoveEvent(self, event):if event.buttons() == Qt.LeftButton and hasattr(self, 'drag_pos'):self.move(self.pos() + event.globalPos() - self.drag_pos)self.drag_pos = event.globalPos()event.accept()if __name__ == "__main__":app = QApplication(sys.argv)# 设置全局字体font = QFont("Microsoft YaHei" if platform.system() == "Windows" else "PingFang SC")app.setFont(font)window = ProxySwitchApp()window.show()sys.exit(app.exec_())

🏆 进阶优化方向

1. 多代理配置预设

self.proxy_presets = {"SSR": "127.0.0.1:1080","Clash": "127.0.0.1:7890","V2Ray": "127.0.0.1:10808"
}

2. 系统托盘支持

from PyQt5.QtWidgets import QSystemTrayIcon, QMenudef createTrayIcon(self):tray = QSystemTrayIcon(self)menu = QMenu()# 添加菜单项...tray.setContextMenu(menu)tray.show()

3. 自动代理配置(PAC)支持


winreg.SetValueEx(key, "AutoConfigURL", 0, winreg.REG_SZ, pac_url)

📚 技术栈深度

PyQt5动画系统

  • QPropertyAnimation:属性动画核心类
  • QEasingCurve:提供30+种缓动曲线
  • 属性绑定机制:@pyqtProperty装饰器

Windows注册表安全

  • 权限管理:KEY_WRITE需要管理员权限
  • 异常处理:WindowsError捕获
  • 64/32位兼容:KEY_WOW64_64KEY标志

🧐 常见问题解答

Q:为什么修改后代理不立即生效?
A:需要调用InternetSetOptionW通知系统,部分浏览器可能需要手动刷新

Q:如何支持 socks5 代理?
A:需修改注册表ProxyServer值为socks=127.0.0.1:1080

Q:程序无法修改注册表?
A:右键以管理员身份运行,或添加UAC清单文件

🎯 总结与展望

本文开发的代理开关工具解决了以下核心问题:

  1. 将复杂的注册表操作可视化
  2. 提供状态即时反馈
  3. 通过动画提升用户体验

未来扩展方向

  • 增加代理延迟测试功能
  • 支持代理规则分组
  • 开发浏览器插件联动控制

技术思考:这种将系统底层配置可视化的思路,同样适用于其他系统设置管理(如环境变量、服务控制等),值得深入探索。


版权声明:本文代码部分采用MIT开源协议,转载请注明出处。技术交流欢迎评论区留言或私信作者。


文章转载自:

http://hjZBEUF5.Lxngn.cn
http://QVchciBT.Lxngn.cn
http://UbRqXXdt.Lxngn.cn
http://qJXFYpq8.Lxngn.cn
http://1YEwdvO2.Lxngn.cn
http://wa531u8o.Lxngn.cn
http://OQI9sbN4.Lxngn.cn
http://KyQwi8TG.Lxngn.cn
http://MbG0459V.Lxngn.cn
http://alHDJtuQ.Lxngn.cn
http://ewddOAlO.Lxngn.cn
http://pnuBy7Sc.Lxngn.cn
http://t92uzPKZ.Lxngn.cn
http://abnuRPKg.Lxngn.cn
http://8XxAE0Ra.Lxngn.cn
http://k3c4BM3e.Lxngn.cn
http://BFPxaP5k.Lxngn.cn
http://sUxMQ7Hw.Lxngn.cn
http://Bv3nzeCU.Lxngn.cn
http://h3GH8GAD.Lxngn.cn
http://Pk4cVLiO.Lxngn.cn
http://BkLqW1s5.Lxngn.cn
http://1CiTDzOW.Lxngn.cn
http://lwFeCUVY.Lxngn.cn
http://OegLvhcM.Lxngn.cn
http://9AvY0usg.Lxngn.cn
http://zcQWGp3D.Lxngn.cn
http://3kggangd.Lxngn.cn
http://8Mnk6sAU.Lxngn.cn
http://xwLgMTrL.Lxngn.cn
http://www.dtcms.com/wzjs/621004.html

相关文章:

  • 四川建设工程交易信息网站衣服定制app
  • 营销型网站深度网wordpress增加侧边栏
  • 西安做网站公司哪家行h5模板免费
  • wordpress分类信息导航谷歌推广优化
  • 重庆璧山网站建设网站建设结构
  • 企业网站源码生成器wordpress qq登录
  • 销售做网站名字找备案网站
  • 阿里云 备案 网站服务内容网页设计实验报告问题讨论
  • 郑州市建设厅官方网站如何修改wordpress的登录密码
  • 企业网站优化公司哪家好e建网站
  • 企业网站推广策划方法WordPress多语言多站点
  • 网站制作与建设书籍重庆市建设领域农民工工资专户网站
  • 怎么找到域名做的那个网站建站基础:wordpress安装教程图解 - 天缘博客
  • 营销型网站教程网站构成的作用
  • 找网页模板的网站好淘宝客返利网站程序
  • 网站上传文件不存在烟台网站制作设计
  • 四川城乡和住房建设厅网站首页网页设计平台有哪些
  • 在阿里云做视频网站需要什么wordpress 弹幕播放器
  • 阿里云域名续费网站省财政厅经济建设处网站
  • 网站地图怎么制作wordpress编辑器汉
  • 国外js特效网站北京彩页设计制作
  • 给别人做网站多少钱做交通工程刬线的网站公司
  • 游戏开发和网站开发哪个好玩龙泉驿网站seo
  • 钓鱼网站 企业形象网站建设方案推广
  • 网站采集功能wordpress拖拽主题
  • 接网站开发的公司北京市工商注册登记网
  • 营销网站建站企业网站搜索引擎优化的方法
  • 做网站给客户聊天记录哈尔滨建设工程有限公司
  • 生产建设兵团第三师政务网站eyoucms插件
  • 电子商务网站定制有没有做盗版电影网站犯罪的