场景:有一系列图像,需要查看图像每列的像素值的大小,可以把图像读出来然后指定列,再查看,但比较麻烦,每看一列都要修改一下。后面又用回调函数滑动条,这样不用每次都修改列了,但假如换张图像的话还是要修改图像路径。所以就想做个界面,可以选择打开图像,并且鼠标单击一下图像中某点,就会画出这个点所在列(当然也可以是行)的一整列像素值的折线图。

最终的效果如下,还可以基本满足。

代码如下:

from PyQt5.QtWidgets import QApplication, QMessageBox, QFileDialog, QGridLayout
from PyQt5.QtGui import QPainter, QPixmap
from PyQt5 import uic,QtWidgets
from PyQt5.QtCore import Qt, QPoint
from plot2 import Ui_MainWindow  # 这里的plot2是通过plot2.ui转成的plot2.py文件
import sys
import matplotlib
matplotlib.use("Qt5Agg")  # 声明使用QT5
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
import numpy as np
import cv2plt.rcParams['font.sans-serif']=['SimHei']  # 显示中文标签
plt.rcParams['axes.unicode_minus']=False#创建一个matplotlib图形绘制类
class MyFigure(FigureCanvas):def __init__(self,width=5, height=4, dpi=600):#第一步:创建一个创建Figureself.fig = Figure(figsize=(width, height), dpi=dpi)#第二步:在父类中激活Figure窗口super(MyFigure,self).__init__(self.fig) #此句必不可少,否则不能显示图形#第三步:创建一个子图,用于绘制图形用,111表示子图编号,如matlab的subplot(1,1,1)self.axes = self.fig.add_subplot(111)class MyWindow(QtWidgets.QMainWindow, Ui_MainWindow):def __init__(self):super(MyWindow, self).__init__()self.setupUi(self)self.button_1.clicked.connect(self.open)# 第五步:定义MyFigure类的一个实例self.F = MyFigure(width=3, height=2, dpi=600)def plotcol(self, col, row):print(col)col = col - self.label_1.x()row = row - self.label_1.y()print(col)if(col >= 0 and col <= self.label_1.width() and row >= 0 and row <= self.label_1.height()):img_1 = cv2.imread(self.imgName, 0)img_1 = cv2.resize(img_1, (self.label_2.width(), self.label_2.height()), interpolation=cv2.INTER_AREA)cols_ = img_1[:, col]x = np.arange(0, self.label_2.height(), 1)self.F.axes.plot(x, cols_)self.F.fig.suptitle("列像素折线图")self.F.fig.savefig('tmp.jpg')self.label_2.setPixmap(QPixmap('tmp.jpg').scaled(self.label_2.width(), self.label_2.height()))self.F.axes.clear()def open(self):self.imgName, imgType = QFileDialog.getOpenFileName(self.label_1, "打开图片", "", "*.tiff;;*.jpg;;*.png;;All Files(*)")self.jpg = QPixmap(self.imgName).scaled(self.label_1.width(), self.label_1.height())# self.label.setPixmap(jpg)if (self.jpg.isNull() != True):self.label_1.setPixmap(self.jpg)def mousePressEvent (self, event):if event.button() == Qt.LeftButton:print(event.pos())self.plotcol(event.pos().x(), event.pos().y())if __name__ == '__main__':app = QtWidgets.QApplication(sys.argv)mywindow = MyWindow()mywindow.show()sys.exit(app.exec_())

自己话好ui后,用工具自动转成py文件,只要ui中包含这三个组件,并且名字对应,就行。

这里还遇到一些状况,就是开始的时候选择的窗体是Dialog和widget这两个都试过,但最后运行的界面总和预览的不一致,但是如果不加布局的话,是一致的。搞了很久都不行,最后换成了Main Window窗体,可以。

还遇到一些其它问题:

(1)最开始的时候尝试使用的是加载动态ui,就是不转换为py文件,但是后面需要用到鼠标事件,没办法重写鼠标事件函数了

将其转换为py后,就比较方便重写

(2)另外一个问题就是怎么将plot画的图在label组件里显示,一定有方法,只是我还不知道,最后采用的方法比较笨,就是先把plot画的图保存为图片,然后label加载图片。后面再研究一下不这么笨的方法。

(3)还要对鼠标单击位置的坐标转换一下,转换为对应的图像中的坐标,并约束坐标只有在图像内部时画图。

PyQT:第一个Demo,画出鼠标单击位置出图像的列像素折线图相关推荐

  1. python 鼠标轨迹录制_按键时录制(获取)鼠标单击位置,在python中释放相同键时停止录制...

    我正在创建一个脚本,如果用户按f7,它将开始记录鼠标点击,当他释放按钮,它应该停止,这将发生,除非用户关闭程序. 脚本在按f7时打印"None",而不是显示单击位置和"f ...

  2. python画两条曲线图_python绘制多个曲线的折线图

    这篇文章利用的是matplotlib.pyplot.plot的工具来绘制折线图,这里先给出一个段代码和结果图: # -*- coding: UTF-8 -*- import numpy as np i ...

  3. python ggplot画等值线图,是否可以在Python ggplot上绘制多折线图?

    I need to plot 3 columns of a Pandas dataframe on python ggplot, with the same index. Is that possib ...

  4. html5鼠标点击弹出层,jQuery实现单击弹出Div层窗口效果(可关闭可拖动)

    本文实例讲述了jQuery实现单击弹出Div层窗口效果.分享给大家供大家参考.具体如下: 这是一款jquery实现的可拖动可关闭的弹出框效果,网上已经有很多类似效果了,网页上实现这种效果其实并不难,现 ...

  5. 编写一个APPlet,再随机的位置上画出几个随机大小的矩形。

    编写一个APPlet,再随机的位置上画出几个随机大小的矩形.如果一个矩形的宽度小于高度,则矩形填充成亮紫色:如果矩形的宽度大于高度,则矩形填充为浅黄色:如果矩形的宽度和高度相等,则只用红色线画出矩形的 ...

  6. 画一个圆角多边形_用SolidWorks一个扫描画出这个多边形瓶子

    多边形瓶子 2020年10月文件分享 后台发送:2010 获取文件 或底部阅读原文输入提取码 提取码:2010 建模过程 1.在[上视基准面]画两个八边形. 1-1.用样条曲线连接各个端点.(扫描的引 ...

  7. 编写一个java程序_鼠标在java窗口上的坐标_请问如何在Java中获取窗口外部的鼠标单击坐标...

    尽管可能,但可能会受到限制: 为焦点事件添加一个AWTEventListener.只要您的应用在单击按钮之前就具有焦点,就会收到焦点丢失事件.然后查询指针位置. 限制是,当然,您的应用程序失去了焦点. ...

  8. 试用海龟turtle 画图画出以下图形(图形的上方为一个正三角形,下方为正方形,边长均为200像素)

    试用海龟turtle 画图画出以下图形(图形的上方为一个正三角形,下方为正方形,边长均为200像素) #画一个3等边三角形 def draw_tri(length):turtle.forward(le ...

  9. 用python画星座_一个可以画出星座(中文标识)的jupyter文档

    star-chart-CN 绘制星座(中文标识) This a simple jupyter file to plot star consterllation in Chinese. 这是一个可以画出 ...

最新文章

  1. 报错解决:-bash: export: `g++11=g++': not a valid identifier
  2. CDOJ_327 BerOS file system
  3. codevs 2494 Vani和Cl2捉迷藏
  4. php连接mysql 5.1.73_安装php环境(php5.4.44+mysql5.1.73+IIS)
  5. administrator自动登录桌面
  6. php启用openssl,php怎么开启openssl模块
  7. 语言inc c,汇编语言练习
  8. C#_解决在控制台中输入Ctrl+Z的问题
  9. Linux 多播(组播)例程
  10. [BZOJ2502]清理雪道
  11. 开课吧Java:构建微服务时的三大常见错误
  12. ftp 服务器创建访问连接抱错_如何用固定IP连接FTP服务器?
  13. 哈希革新Transformer:这篇ICLR高分论文让一块GPU处理64K长度序列
  14. CE教程:植物大战僵尸(单卡片无CD)
  15. 数据挖掘 | 航空公司客户价值分析
  16. Php区分自然量跟aso量,ASO优化——判断下载量与评论的比例关系
  17. 手动生成linux中Qt的moc文件,手动生成Qt的moc文件的方法
  18. 计算机局域网组网技术的核心技术,自考“局域网技术与组网工程”模拟题(6)
  19. php 保留小数0补位,PHP自带函数给数字前补0或补位
  20. 远程工作的五个层次 – 以及为什么您可能处于第2层

热门文章

  1. 美团技术:复杂环境下落地 Service Mesh 的挑战与实践
  2. JAVA字符串占位符替换
  3. Groovy的基础语法
  4. 一个jeecg整合activiti的学习例子,源码下载
  5. JSF MVC 流程
  6. 数据源管理 | 主从库动态路由,AOP模式读写分离
  7. Matlab实现CNN(一)
  8. Jmeter 压测基础笔记
  9. 结合DvaJS来写小程序
  10. Android学习笔记(二)基础知识(1)