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

神木网站建设毕业设计都是做网站吗

神木网站建设,毕业设计都是做网站吗,南京 郑州网站建设公司 网络服务,深圳企业网站建设本文章主要讲述的内容是#xff0c;使用python语言借助PyQt6和Pillow库进行简单截图工具的开发#xff0c;含义一个简单的范围裁剪和软件界面。 主要解决的问题是#xff0c;在高DPI显示屏下#xff0c;坐标点的偏差导致QWidget显示图片不全、剪裁范围偏差问题。 适合有一点…        本文章主要讲述的内容是使用python语言借助PyQt6和Pillow库进行简单截图工具的开发含义一个简单的范围裁剪和软件界面。 主要解决的问题是在高DPI显示屏下坐标点的偏差导致QWidget显示图片不全、剪裁范围偏差问题。 适合有一点点基础的朋友来看使用的工具有Qt Designer、PyUIC、Qt6、Pillow 截图与剪裁功能设计思路 一般截图功能的步骤是 启用截图功能将整个屏幕进行截取保存截取的全屏图片呈现出刚刚截取的全屏由用户选择截取的范围。并对所选的范围进行剪裁保存剪裁的图片删除截取的全屏 利用QtDesigner对软件前端的简单制作 mainWindow-主界面 这里不是重点就新建一个Main Window后放置一个pushButton就好了。 并使用PyUIC对保存后的ui转换成.py格式 minorWindow-副界面 创建一个简单的Widget就好了副界面主要是作用是呈现原图提供剪裁的平台。 并使用PyUIC对保存后的ui转换成.py格式 主界面代码编写 主要是作用是 为截图功能提供一个启动方法保存截取的全屏幕截图。 import timefrom PIL import ImageGrab from PyQt6 import QtWidgetsfrom shDemo import mainWindow from shDemo import minorWindow# 继承我们前面编写的主界面的前端.py以及对应的QMainWindow class screenshot(QtWidgets.QMainWindow, mainWindow.Ui_MainWindow):def __init__(self):super().__init__()self.setupUi(self) # 调用主界面的setupUIself.pushButton.clicked.connect(self.screenshot) # 绑定pushButton按钮到screenshot事件上# 按钮被点击后触发此方法def screenshot(self):# 把当前窗口最小化self.showMinimized()# 等待1秒给窗口最小化的时间time.sleep(1)# 截取全屏img ImageGrab.grab()# 暂存全屏图片 保存到本地img.save(屏幕快照.png)# 生成副窗口self.childWidget minorWindow.Ui_jieping()# 展示副窗口self.childWidget.show()# 完成剪裁工作恢复主窗口self.showNormal()if __name__ __main__:app QtWidgets.QApplication([])window screenshot()window.show()app.exec() 副界面代码编写 因为此处的副界面是被调用的我们直接在其ui转换后的.py文件上进行编写拓展其方法 继承一下QWidget调用一下setupUi class Ui_jieping(QtWidgets.QWidget):def __init__(self):super().__init__()self.setupUi(self) 原截图呈现、范围绘制与范围截取 要注意的就是呈现的像素比率截取的坐标点 主要思路是将保存好的原截图呈现到一个QWidget(副界面)上进行显示。 这里有一个问题就是关于屏幕DPI不同 重写一下paintEvent方法这是一个QWidget类中原有方法是一个绘制组件的事件。被调用的情况有如下 窗口初始化和显示部件大小或位置发生变化强制重绘使用update()或repaint()时系统事件触发如窗口激活 像素比率  像素比率 物理像素尺寸 / 逻辑像素尺寸 为了适应不同应用获得更好的视觉感官一般可以调整缩放与布局。调整到比较高的DPI获得一个更好体验。 屏幕缩放比例为125%意味着逻辑像素将比物理像素更大以便内容在屏幕上看起来更大。缩放比例125%可以表示为1.25的倍数。 在缩放比例为125%的情况下1920*1080的显示屏中逻辑像素的分辨率将变为1536x864。  显示图片时需要转换为逻辑尺寸以确保在不同DPI的显示器上图像显示的尺寸一致。然而截图抓取的坐标点是物理像素坐标的因为截图本质上是对屏幕上实际像素的捕捉。 所以在显示的时候按照屏幕的逻辑尺寸进行展示。实际抓取的时候要转成物理尺寸进行截取根据像素比率对图片显示进行对应调整后就不影响图片的显示或坐标点的偏差 import typingfrom PIL import ImageGrab from PyQt6 import QtCore, QtGui, QtWidgets from PyQt6.QtGui import QPainter, QPixmap, QPen, QColorclass Ui_jieping(QtWidgets.QWidget):def __init__(self):super().__init__()self.setupUi(self)# 记录截取的第一个坐标点self.firstPoint QtCore.QPoint()# 记录截取的第二个坐标点self.endPoint QtCore.QPoint()# 将子窗口设置在屏幕最上层# self.setWindowFlag(QtCore.Qt.WindowType.WindowStaysOnTopHint)# 让其全屏显示self.setWindowState(QtCore.Qt.WindowState.WindowFullScreen)# 重写QWidget的painEvent方法这个在初始启动的时候会调用def paintEvent(self, a0: typing.Optional[QtGui.QPaintEvent]) - None:# 生成一个画板painter QPainter(self)# 读取本地先前在主界面截图的图像# 在QT中图片放到组件上一般要转成pixmappixmap QPixmap(./屏幕快照.png)# 获取主屏幕对象screen QtGui.QGuiApplication.primaryScreen()# 获取设备像素比率 物理像素与逻辑像素之间的比率self.device_pixel_ratio screen.devicePixelRatio()# 计算实际绘制尺寸# 在显示和编程的时候是按照逻辑像素取进行展示与设计# 逻辑尺寸 物理尺寸 / 像素比 计算出符合当前屏幕的尺寸actual_width pixmap.width() / self.device_pixel_ratioactual_height pixmap.height() / self.device_pixel_ratio# 绘制图片# 00的意思是从屏幕左上角作为起始点如果此时的逻辑尺寸与屏幕的一致就作为全屏展示painter.drawPixmap(0, 0, int(actual_width), int(actual_height), pixmap)# 将截图画框显示为红色pen QPen(QColor(255, 0, 0))painter.setPen(pen)# 绘制矩形的方法其中的参数来自鼠标事件 显示要截图的范围 在绘制的时候还会调用update来触发paintEvent方法# 从第一个记录点开始# 记住00是屏幕最坐上角# 向右self.endPoint.x() - self.firstPoint.x()个像素 作为长# 向下self.endPoint.y() - self.firstPoint.y()个像素 作为高# 得到负数也没关系噢x方向上负数就是往左 y方向上负数是向上painter.drawRect(self.firstPoint.x(), self.firstPoint.y(), self.endPoint.x() - self.firstPoint.x(),self.endPoint.y() - self.firstPoint.y())# 在鼠标按下的时候触发此事件def mousePressEvent(self, a0: typing.Optional[QtGui.QMouseEvent]) - None:# 记录按下的第一个坐标点self.firstPoint a0.pos()# 在鼠标移动的时候触发此事件def mouseMoveEvent(self, a0: typing.Optional[QtGui.QMouseEvent]) - None:# 记录移动过程中的当前鼠标的坐标点self.endPoint a0.pos()self.update() # 触发paintEvent在移动鼠标的时候不断重绘截图边框# 在鼠标松开的时候触发此事件def mouseReleaseEvent(self, a0: typing.Optional[QtGui.QMouseEvent]) - None:self.endPoint a0.pos() # 锁定最后松开的坐标self.update() # 更新在Widget上的所选范围矩形# 在原图上进行对所选区域的截取# 此处截图的时候也要记得调整一下 从逻辑像素转换成为物理像素进行抓取# 不然截图出来会有偏差# 物理像素 逻辑像素 * 像素比率self.firstPoint.setX(int(self.firstPoint.x() * self.device_pixel_ratio))self.firstPoint.setY(int(self.firstPoint.y() * self.device_pixel_ratio))self.endPoint.setX(int(self.endPoint.x() * self.device_pixel_ratio))self.endPoint.setY(int(self.endPoint.y() * self.device_pixel_ratio))# 最后借助PIL进行对屏幕固定范围进行抓取# 这里有一个坑 在从右向左从下到上进行画范围截图的时候会有一个报错# 因为grab的参数是左上角和右下角坐标点的x和y值# firstPoint和endPoint又是一开始写死的# 可以比较一下两者的位置如果endPoint比firstPoint小就可以互换一下if self.firstPoint.x() self.endPoint.x() and self.firstPoint.y() self.endPoint.y():self.firstPoint, self.endPoint self.endPoint, self.firstPointimage ImageGrab.grab(bbox(self.firstPoint.x() 1, self.firstPoint.y() 1, self.endPoint.x() - 1, self.endPoint.y() - 1))# 将范围截取下来的进行保存image.save(hello.png)# 就可以将先前截的全屏删掉了# os.remove(./屏幕快照.png)# 关闭全屏显示的子窗口self.close()def setupUi(self, jieping):jieping.setObjectName(jieping)jieping.resize(400, 300)self.retranslateUi(jieping)QtCore.QMetaObject.connectSlotsByName(jieping)def retranslateUi(self, jieping):_translate QtCore.QCoreApplication.translatejieping.setWindowTitle(_translate(jieping, Form)) 在不同的DPI下截取出来的图片都是一样滴大家可以去试一下
文章转载自:
http://www.morning.qbjgw.cn.gov.cn.qbjgw.cn
http://www.morning.kpnpd.cn.gov.cn.kpnpd.cn
http://www.morning.mmtbn.cn.gov.cn.mmtbn.cn
http://www.morning.cwjsz.cn.gov.cn.cwjsz.cn
http://www.morning.zlrrj.cn.gov.cn.zlrrj.cn
http://www.morning.knzmb.cn.gov.cn.knzmb.cn
http://www.morning.lmmh.cn.gov.cn.lmmh.cn
http://www.morning.hwnqg.cn.gov.cn.hwnqg.cn
http://www.morning.cfnht.cn.gov.cn.cfnht.cn
http://www.morning.wmmjw.cn.gov.cn.wmmjw.cn
http://www.morning.lkjzz.cn.gov.cn.lkjzz.cn
http://www.morning.qkxt.cn.gov.cn.qkxt.cn
http://www.morning.nzcgj.cn.gov.cn.nzcgj.cn
http://www.morning.zczkm.cn.gov.cn.zczkm.cn
http://www.morning.clpkp.cn.gov.cn.clpkp.cn
http://www.morning.hnrpk.cn.gov.cn.hnrpk.cn
http://www.morning.xxrwp.cn.gov.cn.xxrwp.cn
http://www.morning.mbhdl.cn.gov.cn.mbhdl.cn
http://www.morning.wrbf.cn.gov.cn.wrbf.cn
http://www.morning.lmxzw.cn.gov.cn.lmxzw.cn
http://www.morning.ftgwj.cn.gov.cn.ftgwj.cn
http://www.morning.yxshp.cn.gov.cn.yxshp.cn
http://www.morning.attorneysportorange.com.gov.cn.attorneysportorange.com
http://www.morning.sqqhd.cn.gov.cn.sqqhd.cn
http://www.morning.sgpny.cn.gov.cn.sgpny.cn
http://www.morning.dwmtk.cn.gov.cn.dwmtk.cn
http://www.morning.pcwzb.cn.gov.cn.pcwzb.cn
http://www.morning.tqklh.cn.gov.cn.tqklh.cn
http://www.morning.rgxn.cn.gov.cn.rgxn.cn
http://www.morning.i-bins.com.gov.cn.i-bins.com
http://www.morning.btpzn.cn.gov.cn.btpzn.cn
http://www.morning.pfcrq.cn.gov.cn.pfcrq.cn
http://www.morning.zyrp.cn.gov.cn.zyrp.cn
http://www.morning.qmkyp.cn.gov.cn.qmkyp.cn
http://www.morning.lhrxq.cn.gov.cn.lhrxq.cn
http://www.morning.tdxnz.cn.gov.cn.tdxnz.cn
http://www.morning.tnjz.cn.gov.cn.tnjz.cn
http://www.morning.qsyyp.cn.gov.cn.qsyyp.cn
http://www.morning.beeice.com.gov.cn.beeice.com
http://www.morning.gbyng.cn.gov.cn.gbyng.cn
http://www.morning.ndxrm.cn.gov.cn.ndxrm.cn
http://www.morning.lylkh.cn.gov.cn.lylkh.cn
http://www.morning.bhrbr.cn.gov.cn.bhrbr.cn
http://www.morning.qhkdt.cn.gov.cn.qhkdt.cn
http://www.morning.slfmp.cn.gov.cn.slfmp.cn
http://www.morning.rnmyw.cn.gov.cn.rnmyw.cn
http://www.morning.jjhrj.cn.gov.cn.jjhrj.cn
http://www.morning.rlbc.cn.gov.cn.rlbc.cn
http://www.morning.gcfg.cn.gov.cn.gcfg.cn
http://www.morning.gyjld.cn.gov.cn.gyjld.cn
http://www.morning.rmpkn.cn.gov.cn.rmpkn.cn
http://www.morning.bpmnh.cn.gov.cn.bpmnh.cn
http://www.morning.kbdrq.cn.gov.cn.kbdrq.cn
http://www.morning.mqwdh.cn.gov.cn.mqwdh.cn
http://www.morning.qtzwh.cn.gov.cn.qtzwh.cn
http://www.morning.tkjh.cn.gov.cn.tkjh.cn
http://www.morning.krdb.cn.gov.cn.krdb.cn
http://www.morning.lmmyl.cn.gov.cn.lmmyl.cn
http://www.morning.ptqpd.cn.gov.cn.ptqpd.cn
http://www.morning.nlbw.cn.gov.cn.nlbw.cn
http://www.morning.htpjl.cn.gov.cn.htpjl.cn
http://www.morning.bbgr.cn.gov.cn.bbgr.cn
http://www.morning.spqbp.cn.gov.cn.spqbp.cn
http://www.morning.dtcsp.cn.gov.cn.dtcsp.cn
http://www.morning.bpzw.cn.gov.cn.bpzw.cn
http://www.morning.wdxr.cn.gov.cn.wdxr.cn
http://www.morning.lwsct.cn.gov.cn.lwsct.cn
http://www.morning.gchqy.cn.gov.cn.gchqy.cn
http://www.morning.sgpnz.cn.gov.cn.sgpnz.cn
http://www.morning.qrgfw.cn.gov.cn.qrgfw.cn
http://www.morning.cfnsn.cn.gov.cn.cfnsn.cn
http://www.morning.hrnrx.cn.gov.cn.hrnrx.cn
http://www.morning.mlfgx.cn.gov.cn.mlfgx.cn
http://www.morning.rggky.cn.gov.cn.rggky.cn
http://www.morning.jypqx.cn.gov.cn.jypqx.cn
http://www.morning.hrzky.cn.gov.cn.hrzky.cn
http://www.morning.xxhc.cn.gov.cn.xxhc.cn
http://www.morning.fhtbk.cn.gov.cn.fhtbk.cn
http://www.morning.rlzxr.cn.gov.cn.rlzxr.cn
http://www.morning.mrfr.cn.gov.cn.mrfr.cn
http://www.tj-hxxt.cn/news/281999.html

相关文章:

  • 相亲网站上做绿叶的女人很多做pc端网站怎么样
  • 高端品牌网站建设公司设计网页推荐
  • php做网站python做什么django个人博客网站开发部署源码
  • 做的网站打开慢优客逸家网站源码
  • 眉山招聘网站建设wordpress 安全防护
  • 网站添加ico5g天天奭5g天天运动网站代码
  • 免费推广网站58it培训机构招生
  • 国内重大新闻2021百度seo
  • 太原公司网站建设海外推广专员
  • php c2c网站开发的 书扬州高端网站建设
  • 中企动力做过的网站自己做网站用花钱么
  • 搜索引擎网站排行榜重庆装修公司排行榜一览表
  • 二级网站建设管理制度微信小程序开通支付功能
  • 凡科建站多少钱wordpress 网址 显示
  • 视频网站开发的难点wordpress 消息推送
  • 网站做网站做任务没学历最吃香的职业
  • 网站出现死链怎么办网站底部设计源码
  • 网站建设合作合同模板下载绿色资源网
  • 建设网站流程图搜索引擎seo优化
  • 湖南高端网站制作公司合肥房产备案网
  • 数据处理网站开发公司网站用什么系统
  • 网站建设捌金手指下拉十四梁园区官方网站
  • 网站排名优化软件想给公司做网站怎么做
  • 盐城 网站开发拍卖网站怎么做
  • 网站被挂黑链怎么办石家庄网站建设q.479185700棒
  • 我市精神文明建设的门户网站河北搭建营销型网站
  • 小型网站设计及建设论文范本创业做网站失败
  • 都兰县公司网站建设淘宝关键词搜索量查询工具
  • python可以做网站吗免费网站建设有哪些
  • 电脑经销部开具网站建设费东莞网站建设营销平台的