import random
from PyQt5 import QtGui
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPainter, QPen, QColor, QCursor
from PyQt5.QtWidgets import QWidget
padding_left = 50
padding_bottom = 30
padding_top = 20
padding_right = 50
class View_Chart(QWidget):
def __init__(self, line_color, background_color, x_axis_colors, y_axis_colors, tooltip_colors, data):
super().__init__()
self.line_color = line_color
self.background_color = background_color
self.x_axis_colors = x_axis_colors
self.y_axis_colors = y_axis_colors
self.tooltip_colors = tooltip_colors
self.data = data
self.x_show_interval = 1
self.x_plot_interval = 25
self.x_min = 0
self.x_max = 0
self.y_plot_interval = 15
self.y_max = 32767
self.y_min = -32768
self.y_plot_mid = None
self.y_scatters = []
self.drag_chart_flag = False
self.toolTip_index = 0
self.setMouseTracking(True)
def paintEvent(self, event) -> None:
painter = QPainter()
self.brush_background(painter)
self.calculate_y_scatters()
self.draw_xaxis(painter)
self.draw_yaxis(painter)
self.draw_points(painter)
self.draw_xaxis(painter)
self.show_tool_tip(painter)
def brush_background(self, painter: QPainter):
"""
填充背景颜色
:param painter:
:return:
"""
painter.begin(self)
painter.setPen(QColor(self.background_color))
painter.setBrush(QColor(self.background_color))
painter.drawRect(0, 0, self.width(), self.height())
painter.end()
def calculate_y_scatters(self):
"""
计算所有应该显示的y轴坐标的位置
:return:
"""
self.y_scatters.clear()
min_y = padding_top
max_y = self.size().height() - padding_bottom
mid_y = (min_y + max_y) // 2
index = mid_y - self.y_plot_interval
while index >= min_y:
self.y_scatters.append(index)
index -= self.y_plot_interval
index = mid_y + self.y_plot_interval
while index <= max_y:
self.y_scatters.append(index)
index += self.y_plot_interval
self.y_scatters.append(mid_y)
self.y_plot_mid = mid_y
self.y_scatters.sort()
def draw_yaxis(self, painter: QPainter):
pen = QPen(QColor(self.y_axis_colors), 2, Qt.SolidLine)
# 画y轴
painter.begin(self)
painter.setPen(pen)
painter.drawLine(padding_left, padding_top, padding_left, self.size().height() - padding_bottom)
painter.end()
# 画y轴的坐标点
painter.begin(self)
painter.setPen(pen)
for i in range(len(self.y_scatters)):
# 上半部分
if self.y_scatters[i] <= self.y_plot_mid:
number = int((self.y_plot_mid - self.y_scatters[i]) / (self.y_plot_mid - self.y_scatters[0]) * self.y_max)
# 下半部分
else:
ll = len(self.y_scatters) - 1
number = int((self.y_scatters[i] - self.y_plot_mid) / (self.y_scatters[ll] - self.y_plot_mid) * self.y_min)
painter.drawText(padding_left - 40, self.y_scatters[i], str(number))
painter.end()
def draw_xaxis(self, painter: QPainter):
pen = QPen(QColor(self.x_axis_colors), 2, Qt.SolidLine)
painter.begin(self)
painter.setPen(QColor(self.background_color))
painter.setBrush(QColor(self.background_color))
painter.drawRect(10, self.size().height() - padding_bottom, self.width(), padding_bottom)
painter.end()
painter.begin(self)
painter.setPen(pen)
painter.drawLine(padding_left, self.size().height() - padding_bottom, self.size().width() - padding_right,
self.size().height() - padding_bottom)
painter.end()
# 画x轴的坐标
# y_show_interval 每隔多少个点显示一个坐标
# y_plot_interval 每隔多少像素显示一个坐标
painter.begin(self)
painter.setPen(pen)
x = padding_left
index = self.x_min
while x <= self.size().width() - padding_right:
painter.drawText(x, self.size().height() - padding_bottom + 12, str(index))
index += self.x_show_interval
x += self.x_plot_interval
self.x_max = index - self.x_show_interval
painter.end()
def draw_points(self, painter: QPainter):
if len(self.data) == 0:
return
pen = QPen(QColor(self.line_color), 1, Qt.SolidLine)
painter.begin(self)
painter.setPen(pen)
x_plot_len = (self.x_max - self.x_min) // self.x_show_interval * self.x_plot_interval
last_x = padding_left
last_y = (self.y_max - self.data[self.x_min]) / (self.y_max - self.y_min) * (
self.y_scatters[len(self.y_scatters) - 1] - self.y_scatters[0]) + self.y_scatters[0]
for i in range(self.x_min, min(self.x_max + 1, len(self.data))):
x = int((i - self.x_min) / (self.x_max - self.x_min) * x_plot_len) + padding_left
y = (self.y_max - self.data[i]) / (self.y_max - self.y_min) * (
self.y_scatters[len(self.y_scatters) - 1] - self.y_scatters[0]) + self.y_scatters[0]
# painter.drawPoint(x, y)
painter.drawLine(last_x, last_y, x, y)
last_x = x
last_y = y
painter.end()
def show_tool_tip(self, painter: QPainter):
if len(self.data) == 0:
return
if self.toolTip_index == 0:
return
x = (self.toolTip_index - self.x_min) // self.x_show_interval * self.x_plot_interval + padding_left
y = int((self.y_max - self.data[self.toolTip_index]) / (self.y_max - self.y_min) * (
self.y_scatters[len(self.y_scatters) - 1] - self.y_scatters[0]) + self.y_scatters[0])
painter.begin(self)
pen = QPen(QColor(self.line_color), 1, Qt.SolidLine)
painter.setPen(pen)
painter.setBrush(QColor(self.tooltip_colors))
painter.drawLine(x, padding_top, x, self.height() - padding_bottom)
painter.drawRect(x, y, 40, 20)
painter.drawText(x + 5, y + 15, str(self.data[self.toolTip_index]))
painter.end()
def mousePressEvent(self, e: QtGui.QMouseEvent) -> None:
if e.button() == Qt.LeftButton and e.pos().x() >= padding_left and e.pos().y() <= self.size().height() - padding_bottom:
self.drag_chart_flag = True
self.drag_chart_x1 = e.pos().x()
self.drag_x_min = self.x_min
self.setCursor(QCursor(Qt.OpenHandCursor))
def mouseMoveEvent(self, e: QtGui.QMouseEvent) -> None:
# 拖拽
if self.drag_chart_flag:
bias = (self.drag_chart_x1 - e.pos().x()) // self.x_plot_interval * self.x_show_interval # 移动距离
self.x_min = bias + self.drag_x_min
if self.x_min < 0:
self.x_min = 0
if self.x_min >= len(self.data):
self.x_min = len(self.data) - 1
self.update()
return
# 鼠标移动,显示提示
if self.width() - padding_right >= e.pos().x() >= padding_left and self.size().height() - padding_bottom >= e.pos().y() >= padding_top:
tooltip_index = (e.pos().x() - padding_left) // self.x_plot_interval * self.x_show_interval + self.x_min
if self.toolTip_index != tooltip_index and tooltip_index < len(self.data):
self.toolTip_index = tooltip_index
self.update()
return
self.toolTip_index = 0
self.update()
def mouseReleaseEvent(self, e: QtGui.QMouseEvent) -> None:
if e.button() == Qt.LeftButton and self.drag_chart_flag:
self.drag_chart_flag = False
self.setCur
没有合适的资源?快使用搜索试试~ 我知道了~
基于python+JavaScript实现显示文件的二进制图表(软件构造大作业).zip
共22个文件
py:7个
data:6个
js:3个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 118 浏览量
2023-01-05
16:11:17
上传
评论 1
收藏 1.69MB ZIP 举报
温馨提示
基于python+JavaScript实现显示文件的二进制图表(软件构造大作业).zip基于基于python+JavaScript实现显示文件的二进制图表(软件构造大作业).zip基于python+JavaScript实现显示文件的二进制图表(软件构造大作业).zip基于python+JavaScript实现显示文件的二进制图表(软件构造大作业).zip基于python+JavaScript实现显示文件的二进制图表(软件构造大作业).zip基于python+JavaScript实现显示文件的二进制图表(软件构造大作业).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
资源推荐
资源详情
资源评论
收起资源包目录
基于python+JavaScript实现显示文件的二进制图表(软件构造大作业).zip (22个子文件)
项目说明.md 8B
wrong.json 19B
Main.py 242B
interact.py 364B
setting.py 3KB
view
MainView.py 5KB
js
bootstrap.min.js 57KB
qwebchannel.js 15KB
jquery.min.js 86KB
css
bootstrap.min.css 152KB
html
file_list.html 1KB
ChartView.py 9KB
ui
MainView.ui 3KB
MainView_ui.py 4KB
data.py 719B
test
channel3.data 6KB
2 - 副本.data 0B
1.data 0B
大创 - 副本.data 2.25MB
1 - 副本.data 0B
2.data 6KB
setting.json 315B
共 22 条
- 1
资源评论
onnx
- 粉丝: 9679
- 资源: 5598
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功