https://github.com/howarder3/ironman2021_PyQt5_photoshop/tree/main/day24_color_detector_project
我们接下来的讨论,会基於读者已经先读过我 day5 文章 的架构下去进行程序设计
如果还不清楚我程序设计的逻辑 (UI.py、controller.py、start.py 分别在干麻)
建议先阅读 day5 文章後再来阅读此文。
https://www.wongwonggoods.com/python/pyqt5-5/
接下来我们要设计一个侦测滑鼠指示颜色的小工具
我们针对颜色设计一下栏位:
pyuic5 -x day24.ui -o UI.py
一样,这程序只有介面 (视觉上的呈现),没有任何互动功能
python UI.py
这次我们的 controller 有三个主要的新功能
为了避免我们的程序吃光我们电脑的所有资源,
我们用更新时间加以限制,不需要到几乎无时无刻都在更新,
以「20ms (0.02 秒)」的频率更新画面,基本上人体就已经感觉不出差别了,
而且也比较省电脑资源。而上述的功能可以使用 QTimer 来实现。
def setup_control(self):
self.ui.label.setText("")
timer = QTimer(self)
timer.timeout.connect(self.get_current_cursor_color)
timer.start(20)
我们在 setup_control 进行这样的设定,另外我们想把刚刚 Color 那段字消掉,
只留下颜色就好,於是我们补上一行 self.ui.label.setText("")
QCursor 可以帮助我们取得现在滑鼠的座标,
而透过 QApplication 可以帮助我们取得现在萤幕的截图。
def get_current_cursor_color(self):
x = QCursor.pos().x()
y = QCursor.pos().y()
self.ui.text_pos.setText(f"X:{x:^4d} Y:{y:^4d}")
pixmap = QApplication.primaryScreen().grabWindow(
QApplication.desktop().winId(), x, y, 1, 1)
image = pixmap.toImage()
color = QColor(image.pixel(0, 0))
self.set_label_color(color)
这部分是拿昨天我们做的颜色选择器来改的,
主要功能都相同,我们把昨天 print 显示的字串,
现在改成直接显示在 textEdit 里面。
传进来的资料型态都是 Qcolor,
这边简单分析一下,
我们可以透过 color.red(), color.green(), color.blue() 取得 RGB 的 0~255 的值,
使用 color.name() 取得颜色的 hex 值。
def set_label_color(self, color):
r, g, b = color.red(), color.green(), color.blue()
strRGB = (f"{r:^3d}, {g:^3d}, {b:^3d}")
self.ui.label.setStyleSheet('background-color:rgb({});'.format(strRGB))
self.ui.text_rgb.setText(f"({strRGB})")
self.ui.text_hex.setText(color.name().upper())
这边我们拿 【PyQt5】Day 22 – PyQt 视窗的个性化/属性控制 setWindowFlags,禁止放大缩小、永远显示於最上层/最下层 的 setWindowFlags 内容来应用,
我们只允许「缩小与关闭」跟「永远让视窗在最上层」。
我们去新增 UI.py 如下:
(我们这次选择的是 Form 不是 MainWindow,需要稍微修改一下)
# 只有缩小/关闭 (取消放大)
# 视窗永远在最上层,适合互动性高的程序
Form.setWindowFlags(Qt.WindowMinimizeButtonHint | Qt.WindowCloseButtonHint| Qt.WindowStaysOnTopHint)
总之就是可以自动侦测滑鼠目前所指位置的颜色,并显示出来。
★ 本文也同步发於我的个人网站(会有内容目录与显示各个小节,阅读起来更流畅):【PyQt5】Day 24 project / 侦测滑鼠目前指示颜色的小工具 (滴管工具), 利用 QCursor 侦测滑鼠, QApplication 取得截图
Christopher Alexander 在「建筑的永恒之道」中,开头第一句就说了:「无心之心,道...
WebRTC 通讯 WebRTC 最常见的应用场景就是一对一的视讯通话,当我们准备和另一端的人进行点...
前言 在取用个资料的时候,都是一个一个执行,分散各地,为了方便需要整合;讯号灯也是如此,都放在个别的...
本系列文之後也会置於个人网站 喔不,其实今天还不会真正提到OAuth 2.0的深度内容。今天要来谈...
https://codeforces.com/contest/1557/problem/B 程序码:...