课堂点名器–维修实录

发布于 2022-08-15  1660 次阅读


关于

本课堂点名器由好友Yish研发...

本人吗....贡献了(发现了)不少Issues...

由于原作者迫于学业压力,一个致命的Bug就由我来修。

项目原文:一键直达

Github地址:https://github.com/Yish1/Class-Roster-Picker

维修实录

根据作者自述:

课堂点名器3.X 是由Python制作的。

本文根据:

“3.9版本中已知问题 Known Issues”

非数字崩溃问题

当连抽输入为非数字时“”,int(num)将传递空信息导致崩溃。

这便是致命Bug!

在于作者的沟通中可知:

程序是由PyQt5库及其衍生搭建,可以用PyQt5的语句限制用户的输入类型。

但是...我也不会啊!

根据作者提供的源码,用VScode跑一遍

当我输入字母“o”时,报错内容为

Traceback (most recent call last):
  File "c:\Users\Administrator\Desktop\dm2.py", line 381, in ten
    num = int(num)
ValueError: invalid literal for int() with base 10: 'o'

可知错误在:

num = int(num)

应该是当非数字字符输入时,程序无法处理,导致崩溃。

这就好办了!

在处理输入前加入对输入的分析就可以了

while True:
    ten=input("x:")
    try:
        x=eval(ten)
        if type(x)==int:break
    except:
        pass

再配合源码里的函数,就可以把源码改成...

while True:               #检验数字
    t=num   
    try:
        num=eval(t)
        if type(num)==int:
            break
    except:
        reply = QtWidgets.QMessageBox.warning(self, u'警告', u'请输入数字!!!', QtWidgets.QMessageBox.Yes)
        return
num = int(num)

目前问题已解决..

请放心食用!

例外,我还测试到了一个彩蛋(Bug)

当你输入的是算式如:16-9

它的连抽次数就会是7

因为这个输入符合了Python的语法

有空可以去试试

DPI问题

②屏幕DPI为125%时无法完全显示文字(已通过pyqt5开发文档中高DPI模式自适应代码修复,但似乎在部分设备上不起作用)

这个是属于ui问题了吧...

def setupUi(self, MainWindow):
        #以下课直接粘贴生成的setupui代码
        MainWindow.setObjectName("13班点名器By Yish")
        MainWindow.resize(460, 400)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(30,45, 470, 150))#主体
        font = QtGui.QFont()
        font.setFamily("宋体")
        font.setPointSize(50)#主体大小

看看代码...(最后一句)

主体大小?

有没有一种可能打错了,是字体大小...

于是,我开始上网寻找“pyqt文字自适应”

找是找到了,但是...

看不懂...也不会用...

于是,我开始搜索“python获取屏幕DPI”

在不断的搜索中...找到了一篇

from win32 import win32api, win32gui, win32print
from win32.lib import win32con

"""获取缩放后的分辨率"""
sX = win32api.GetSystemMetrics(0)   #获得屏幕分辨率X轴
sY = win32api.GetSystemMetrics(1)   #获得屏幕分辨率Y轴
print(sX)
print(sY)

"""获取真实的分辨率"""
hDC = win32gui.GetDC(0)
w = win32print.GetDeviceCaps(hDC, win32con.DESKTOPHORZRES)  # 横向分辨率
h = win32print.GetDeviceCaps(hDC, win32con.DESKTOPVERTRES)  # 纵向分辨率
print(w)
print(h)

# 缩放比率
screen_scale_rate = round(w / sX, 2)
print(screen_scale_rate)

当屏幕缩放为100%时,最后一项输出1.0

当屏幕缩放为125%时,最后一项输出1.25

这不正好用得上吗,还可以避开pyqt

经过测试:

当屏幕DPI为125%时,字体大小40为最佳

放入代码的开始部分

去除输出

增加一个“dpi”“zt”做变量

编写一个简单的“if”判断语句

dpi = screen_scale_rate
if dpi == 1.0:
    zt = 50
elif dpi == 1.25:
    zt = 40

再把zt放入原代码

font.setPointSize(zt)#主体大小

测试...完工...

Windows32位不兼容问题

④不支持32位设备

这个好说...

但现在大家也很少用32位系统了吧...

由于Windows系统会向下兼容

直接在老机器上跑一遍,封装...

关于环境

pip install PyQt5 安装方法
1,首先要安装
pip install sip
2,pip 要版本足够,pip 升级方法:
python -m pip install --upgrade pip
3,pip install PyQt5安装超时方法:
pip install PyQt5 -i https://pypi.tuna.tsinghua.edu.cn/simple
4,安装PyQt5-tools:
pip install pyqt5-tools -i https://pypi.tuna.tsinghua.edu.cn/simple

pip install pyinstaller
Pyinstaller -F -w -i 123.ico *.py 

3.999无Bug版本:一键下载


Hello world!