改变屏幕分辨率的小程序


前言

  现在的分辨率普遍较大,而老的程序很多需要较小的分辨率。因为大部分的老程序都还在指定的工作岗位上,所以做了一个分辨率修改的小程序。


一、调用原理

利用python的第三方模块和托盘模块实现自由切换到1024*768(也可以自己定义),通过托盘最小化,达到不占用系统栏的目的。

二、使用步骤

1.导入代码

代码如下(示例):

import os
import sys
import win32api
import win32con
from PyQt5.QtGui import QIcon

from PyQt5.QtWidgets import QWidget, QApplication, QFrame, QPushButton, QVBoxLayout, QMessageBox, QComboBox, \
    QSystemTrayIcon, QAction, QMenu


class MyClass(QWidget):
    def __init__(self, x, y):
        super().__init__()  # 继承父类
        self.initUI()		# 自己定义的函数,初始化类界面,里面放着自己各种定义的按钮组件及布局
        self.x = x
        self.y = y

    def initUI(self):
        self.setWindowTitle("改变分辨率程序")  # 设置界面名称
        self.setWindowIcon(QIcon('./blackground.ico'))  # 设置标题图标
        self.resize(350, 200)  # 设置界面大小

        myframe = QFrame(self)  # 实例化一个QFrame可以定义一下风格样式,相当于一个框架,可以移动,其内部组件也可以移动
        btn1 = QPushButton("自适应分辨率", self)  # 定义一个按钮,括号里需要一个self,如果需要在类内传递,则应该定义为self.btn1
        btn1.clicked.connect(self.auto_fit)  # 将点击事件与自适应的函数相连,clicked表示按钮的点击事件,还有其他的功能函数,后面连接的是一个类内函数,调用时无需加括号
        btn2 = QPushButton("强行改为1024*768", self)
        btn2.clicked.connect(self.compel_fit)  # 连接一个强行改分辨率的函数
        btn3 = QPushButton("还原分辨率", self)
        btn3.clicked.connect(self.callback_fit)  # 这里将连接还原函数,具体弹出方式在函数里说明
        btn4 = QPushButton("退出程序", self)
        btn4.clicked.connect(self.close)  # 将按钮与关闭事件相连,这个关闭事件是重写的,它自带一个关闭函数,这里重写为点击关闭之后会弹窗提示是否需要关闭

        vlo = QVBoxLayout()  # 创建一个垂直布局,需要将需要垂直布局的组件添加进去
        vlo.addWidget(btn1)
        vlo.addWidget(btn2)
        vlo.addWidget(btn3)
        vlo.addWidget(btn4)
        vlo.addStretch(1)  # 一个伸缩函数,可以一定程度上防止界面放大之后排版不协调
        hlo = QVBoxLayout(self)  # 创建整体框架布局,即主界面的布局
        hlo.addLayout(vlo)  # 将按钮布局添加到主界面的布局之中
        hlo.addWidget(myframe)  # 将框架也加入到总体布局中,当然也可以不需要这框架,直接按照整体框架布局来排版
        # 之所以这里有这个myframe,是因为尝试过很多种布局,其中一个布局就是将其他组件都放到这个myframe中,移动这个myframe
        # 其里面的组件布局相对位置不会改变,后面又尝试了多种布局,所以这个myframe最后里面其实就剩下一个下拉框
        self.show()  # 显示主界面
        self.tray()  # 程序实现托盘

    def tray(self):
        # 创建托盘程序
        ti = SystemTray(self)

    def auto_fit(self):  # 自适应函数
        dm = win32api.EnumDisplaySettings(None, 0)  # 调用可以得到显示设备所有的图形模式信息
        if 1024 <= x < 1440:  # 现在的分辨率与系数的比较
            dm.PelsHeight = 768  # 屏幕的高
            dm.PelsWidth = 1024  # 屏幕的宽
            dm.BitsPerPel = 32  # 显示设备的颜色分辨率32
            dm.DisplayFixedOutput = 0  # 设置分辨率后拉伸画面,否则切换到小分辨率时,屏幕只在中间一小块
            win32api.ChangeDisplaySettings(dm, 0) # 设置生效
        elif 1440 <= x < 1600:
            dm.PelsHeight = 900
            dm.PelsWidth = 1400
            dm.BitsPerPel = 32
            dm.DisplayFixedOutput = 0
            win32api.ChangeDisplaySettings(dm, 0)
        elif x >= 1600:
            dm.PelsHeight = 900
            dm.PelsWidth = 1600
            dm.BitsPerPel = 32
            dm.DisplayFixedOutput = 0
            win32api.ChangeDisplaySettings(dm, 0)

    def compel_fit(self):
        dm = win32api.EnumDisplaySettings(None, 0)
        dm.PelsHeight = 768
        dm.PelsWidth = 1024
        dm.BitsPerPel = 32
        dm.DisplayFixedOutput = 0
        win32api.ChangeDisplaySettings(dm, 0)

    @staticmethod
    def callback_fit():
        dm = win32api.EnumDisplaySettings(None, 0)
        dm.PelsHeight = y
        dm.PelsWidth = x
        dm.BitsPerPel = 32
        dm.DisplayFixedOutput = 0
        win32api.ChangeDisplaySettings(dm, 0)

    # def closeEvent(self, event):
    #     result = QMessageBox.question(self, "提示:", "您真的要退出程序吗", QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)
    #     if result == QMessageBox.Yes:
    #         dm = win32api.EnumDisplaySettings(None, 0)
    #         dm.PelsHeight = y
    #         dm.PelsWidth = x
    #         dm.BitsPerPel = 32
    #         dm.DisplayFixedOutput = 0
    #         win32api.ChangeDisplaySettings(dm, 0)
    #         event.accept()
    #     else:
    #         event.ignore()


class SystemTray(object):
    # 程序托盘类
    def __init__(self, w):
        self.app = app
        self.w = w
        QApplication.setQuitOnLastWindowClosed(False)  # 禁止默认的closed方法,只能使用qapp.quit()的方法退出程序
        self.w.show()  # 不设置显示则为启动最小化到托盘
        self.tp = QSystemTrayIcon(self.w)
        self.initUI()
        self.run()

    def initUI(self):
        # 设置托盘图标

        self.tp.setIcon(QIcon('./blackground.ico'))

    def quitApp(self):
        # 退出程序
        self.w.show()  # w.hide() #设置退出时是否显示主窗口
        re = QMessageBox.question(self.w, "提示", "退出系统", QMessageBox.Yes |
                                  QMessageBox.No, QMessageBox.No)
        if re == QMessageBox.Yes:
            MyClass.callback_fit()
            self.tp.setVisible(False)  # 隐藏托盘控件,托盘图标刷新不及时,提前隐藏
            app.quit()  # 退出程序

    def message(self):
        # 提示信息被点击方法
        print("弹出的信息被点击了")

    def act(self, reason):
        # 主界面显示方法
        # 鼠标点击icon传递的信号会带有一个整形的值,1是表示单击右键,2是双击,3是单击左键,4是用鼠标中键点击
        if reason == 2 or reason == 3:
            self.w.show()

    def run(self):

        a1 = QAction('&显示(Show)', triggered=self.w.show)  # 托盘菜单1
        a2 = QAction('&退出(Exit)', triggered=self.quitApp)  # 托盘菜单2

        tpMenu = QMenu()  # 托盘菜单
        tpMenu.addAction(a1)
        tpMenu.addAction(a2)
        self.tp.setContextMenu(tpMenu)
        self.tp.show()  # 不调用show不会显示系统托盘消息,图标隐藏无法调用

        # 信息提示
        # 参数1:标题
        # 参数2:内容
        # 参数3:图标(0没有图标 1信息图标 2警告图标 3错误图标),0还是有一个小图标
        # self.tp.showMessage('Hello', '我藏好了', icon=0)
        # 绑定提醒信息点击事件
        self.tp.messageClicked.connect(self.message)
        # 绑定托盘菜单点击事件
        self.tp.activated.connect(self.act)
        sys.exit(self.app.exec_())  # 持续对app的连接


# 创立一个主界面,并保持它,从各种按钮或者组件中接受信号完成界面功能,相当于无限循环
# 只有选择退出后才会关掉程序退出循环
if __name__ == '__main__':

    app = QApplication(sys.argv)
    x = win32api.GetSystemMetrics(win32con.SM_CXSCREEN)
    y = win32api.GetSystemMetrics(win32con.SM_CYSCREEN)
    mc = MyClass(x, y)		# 这里相当于实例化一个主界面,myclass是自己定义的主界面类
    sys.exit(app.exec_())  # 监听退出,如果选择退出,界面就会关掉

2.小程序效果

效果如下:
在这里插入图片描述
在这里插入图片描述


总结

通过程序改变分辨率,需要人为的多个分辨率手动切换。
程序需要打包成exe文件,这样用起来很方便。
图片图标和程序必须放在同一个文件夹中。
最后的代码放到github,有需要的自取。手动点赞

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值