python鼠标绘图附代码

目录
  • 作业要求
  • 友情提示
  • 分析
  • 结果呈现
  • 悬浮状态
  • 2020/02/04 更新code

github指路

作业要求

友情提示

ldw老师给の友情提示(虽然感觉也还好/dbq其实还挺有用的)

课上讲的例子是图片展示器(能够实现打开图片+镜像显示图片+保存图片+操作日志的功能)

讲真那啥猫咪图片还挺好看

演示之后差不多是这样

分析

然后按照上面这个样例我们要做一个鼠标绘图的gui界面(这就有点难度了

先分析一下就是

(我本来是想保留日志和水平翻转垂直翻转这种操作的/后来放弃了/有点难/而且……那啥……我做不到在现有的图上绘制内容就很抱歉)

老师上课其实有提到说那啥控件要改(但是我改完之后貌似不对

然后开始干活

结果呈现

悬浮状态

2020/02/04 更新code

大声说话,文件路径&命名(((小声逃走

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2019/12/3 14:22
# @Author : Chen Shan
# Function :GUI programming - a naive Sketchpad tool
import os
import platform
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class PenWidthDlg(QDialog):
    def __init__(self, parent=None):
        super(PenWidthDlg, self).__init__(parent)
        widthLabel = QLabel("宽度:")
        self.widthSpinBox = QSpinBox()
        widthLabel.setBuddy(self.widthSpinBox)
        self.widthSpinBox.setAlignment(Qt.AlignRight|Qt.AlignVCenter)
        self.widthSpinBox.setRange(0, 50)
        okButton = QPushButton("ok")
        cancelButton = QPushButton("cancle")
        layout = QGridLayout()
        layout.addWidget(widthLabel,0,0)
        layout.addWidget(self.widthSpinBox,0,1)
        layout.addWidget(okButton,1,0)
        layout.addWidget(cancelButton,1,1)
        self.setLayout(layout)
        self.setWindowTitle("宽度设置")
        okButton.clicked.connect(self.accept)
        cancelButton.clicked.connect(self.reject)
class myMainWindow(QMainWindow):
    def __init__(self,parent=None):
        super().__init__(parent)
        self.setWindowTitle("draw")
        self.pix=QPixmap()
        self.lastPoint=QPoint()
        self.endPoint=QPoint()
        #初始化参数
        self.initData()
        #清空画布
        self.initView()
        #菜单栏
        self.Menu = self.menuBar().addMenu("菜单")
        #清空
        self.ClearAction = QAction(QIcon("images/clear.png"), "清空", self)
        self.ClearAction.triggered.connect(self.initView)
        self.Menu.addAction(self.ClearAction)
        #调画笔颜色
        self.changeColor = QAction(QIcon("images/icon.png"), "颜色", self)
        self.changeColor.triggered.connect(self.showColorDialog)
        self.Menu.addAction(self.changeColor)
        #调画笔粗细
        self.changeWidth = QAction(QIcon("images/width.png"), "宽度", self)
        self.changeWidth.triggered.connect(self.showWidthDialog)
        self.Menu.addAction(self.changeWidth)
        # #右侧停靠窗口
        # logDockWidget=QDockWidget("Log",self)
        # logDockWidget.setAllowedAreas(Qt.LeftDockWidgetArea|Qt.RightDockWidgetArea)
        # self.listWidget=QListWidget()
        # logDockWidget.setWidget(self.listWidget)
        # self.addDockWidget(Qt.RightDockWidgetArea,logDockWidget)
        #各种动作
        self.fileOpenAction = QAction(QIcon("images/fileopen.png"), "&Open", self)
        self.fileOpenAction.setShortcut(QKeySequence.Open)
        self.fileOpenAction.setToolTip("Open an image.")
        self.fileOpenAction.setStatusTip("Open an image.")
        self.fileOpenAction.triggered.connect(self.fileOpen)
        self.fileSaveAction = QAction(QIcon("images/filesave.png"), "&Save", self)
        self.fileSaveAction.setShortcut(QKeySequence.Save)
        self.fileSaveAction.setToolTip("Save an image.")
        self.fileSaveAction.setStatusTip("Save an image.")
        self.fileSaveAction.triggered.connect(self.fileSaveAs)
        #工具栏
        fileToolbar = self.addToolBar("文件")
        fileToolbar.addAction(self.fileOpenAction)
        fileToolbar.addAction(self.fileSaveAction)
        editToolbar = self.addToolBar("清空")
        editToolbar.addAction(self.ClearAction)
        colorToolbar = self.addToolBar("颜色")
        colorToolbar.addAction(self.changeColor)
        widthToolbar = self.addToolBar("宽度")
        widthToolbar.addAction(self.changeWidth)
        #状态栏
        self.sizeLabel=QLabel()
        self.sizeLabel.setFrameStyle(QFrame.StyledPanel|QFrame.Sunken)
        status=self.statusBar()
        status.setSizeGripEnabled(False)
        status.addPermanentWidget(self.sizeLabel)
        status.showMessage("Ready",5000)
    def initData(self):
        self.size = QSize(1000,1040)
        self.pixmap = QPixmap(self.size)
        self.dirty = False
        self.filename = None
        self.recentFiles = []
        #新建画笔
        self.width = 5
        self.color = QColor(0, 0, 0)
        self.pen = QPen()  # 实例化画笔对象
        self.pen.setColor(self.color)  #设置画笔颜色
        self.pen = QPen(Qt.SolidLine)  #实例化画笔对象.参数:画笔样式
        self.pen.setWidth(self.width) #设置画笔粗细
        #新建绘图工具
        self.painter = QPainter(self.pixmap)
        self.painter.setPen(self.pen)
        #鼠标位置
        self.__lastPos = QPoint(0,0)#上一次鼠标位置
        self.__currentPos = QPoint(0,0)#当前的鼠标位置
        self.image = QImage()
    def initView(self):
        #设置界面的尺寸为__size
        self.Clear()
        self.imageLabel = QLabel()
        self.imageLabel.setPixmap(self.pixmap)
        self.setCentralWidget(self.imageLabel)
    def Clear(self):
        #清空画板
        self.pixmap.fill(Qt.white)
        self.update()
        self.dirty = False
    def mousePressEvent(self,event):
        #鼠标按下时,获取鼠标的当前位置保存为上一次位置
        pointX = event.globalX()
        pointY = event.globalY()
        self.__currentPos = QPoint(pointX,pointY)
        self.dirty = True
        self.__currentPos =  event.pos()
        self.__lastPos = self.__currentPos
    def mouseMoveEvent(self,event):
        #鼠标移动时,更新当前位置,并在上一个位置和当前位置间画线
        self.__currentPos =  event.pos()
        #pointX = event.globalX()
        #pointY = event.globalY()
        #self.__currentPos = QPoint(pointX,pointY)
        #画线
        #用begin和end抱起来,表示针对这个对象,就可以在pixmap有图的情况下继续画画
        self.painter.begin(self.pixmap)
        self.painter.setPen(self.pen)
        self.painter.drawLine(self.__lastPos, self.__currentPos)
        self.__lastPos = self.__currentPos
        self.painter.end()
        self.update() #更新显示
        self.imageLabel.setPixmap(self.pixmap)
    #调画笔颜色
    def showColorDialog(self):
        col = QColorDialog.getColor()
        self.pen.setColor(col)
        self.painter.setPen(self.pen)
    def updateWidth(self):
        self.pen.setWidth(self.width)
        self.painter.setPen(self.pen)
    def showWidthDialog(self):
        dialog = PenWidthDlg(self)
        dialog.widthSpinBox.setValue(self.width)
        if dialog.exec_():
            self.width = dialog.widthSpinBox.value()
            self.updateWidth()
    ###########################################################
    def okToContinue(self): #警告当前图像未保存
            if self.dirty:
                reply = QMessageBox.question(self,
                        "Image Changer - Unsaved Changes",
                        "图片已被更改,请问要保存吗?",
                        QMessageBox.Yes|QMessageBox.No|QMessageBox.Cancel)
                if reply == QMessageBox.Cancel:
                    return False
                elif reply == QMessageBox.Yes:
                    return self.fileSaveAs()
            return True
    def fileOpen(self):
            if not self.okToContinue():
                  return
            dir = (os.path.dirname(self.filename)
                   if self.filename is not None else ".")
            formats = (["*.{}".format(format.data().decode("ascii").lower())
                  for format in QImageReader.supportedImageFormats()])
            fname = QFileDialog.getOpenFileName(self,
                  "Image Changer - Choose Image", dir,
                  "Image files ({})".format(" ".join(formats)))
            if fname:
                  print(fname[0])
                  self.loadFile(fname[0])
                  self.updateFileMenu()
    def loadFile(self, fname=None):
            if fname is None:
                  action = self.sender()
                  if isinstance(action, QAction):
                        fname = action.data()
                        if not self.okToContinue():
                            return
                  else:
                        return
            if fname:
                  self.filename = None
                  image = QImage(fname)
                  if image.isNull():
                        message = "Failed to read {}".format(fname)
                  else:
                        self.addRecentFile(fname)
                        self.image = QImage()
                        #self.editUnMirrorAction.setChecked(True)
                        self.image = image
                        self.filename = fname
                        self.showImage()
                        self.dirty = False
                        self.sizeLabel.setText("{} x {}".format(
                                               image.width(), image.height()))
                        message = "Loaded {}".format(os.path.basename(fname))
                  self.updateStatus(message)
    def updateStatus(self, message):
            self.statusBar().showMessage(message, 5000)
            #self.listWidget.addItem(message)
            if self.filename:
                  self.setWindowTitle("Image Changer - {}[*]".format(
                        os.path.basename(self.filename)))
            elif not self.image.isNull():
                  self.setWindowTitle("Image Changer - Unnamed[*]")
            else:
                  self.setWindowTitle("Image Changer[*]")
            self.setWindowModified(self.dirty)
    def updateFileMenu(self):
            self.Menu.clear()
            self.Menu.addAction(self.fileOpenAction)
            self.Menu.addAction(self.fileSaveAction)
            current = self.filename
            recentFiles = []
            print(self.recentFiles)
            for fname in self.recentFiles:
                if fname != current and QFile.exists(fname):
                    recentFiles.append(fname)
            if recentFiles:
                self.fileMenu.addSeparator()
                for i, fname in enumerate(recentFiles):
                    action = QAction(QIcon("images/icon.png"),
                            "&{} {}".format(i + 1, QFileInfo(
                            fname).fileName()), self)
                    action.setData(fname)
                    action.triggered.connect(lambda: self.loadFile(fname))
                    self.fileMenu.addAction(action)
    def addRecentFile(self, fname):
            if fname is None:
                  return
            if fname not in self.recentFiles:
                  if len(self.recentFiles) < 10:
                        self.recentFiles = [fname] + self.recentFiles
                  else:
                        self.recentFiles = [fname] + self.recentFiles[:8]
                  print(len(self.recentFiles))
    def fileSaveAs(self):
        savePath = QFileDialog.getSaveFileName(self, 'Save Your Paint', '.\\', '*.png')
        print(savePath)
        if savePath[0] == "":
            print("Save cancel")
            return
        image = self.pixmap
        print("save...")
        image.save(savePath[0])
        self.updateStatus("Saved as {}".format(savePath))
    def showImage(self, percent=None):
        if self.image.isNull():
            return
        self.pixmap = QPixmap.fromImage(self.image)
        self.imageLabel.setPixmap(self.pixmap)
app=QApplication(sys.argv)
form=myMainWindow()
form.setMinimumSize(1000,1000)
form.show()
app.exec_()

以上就是python鼠标绘图附代码的详细内容,更多关于python鼠标绘图的资料请关注我们其它相关文章!

(0)

相关推荐

  • python GUI库图形界面开发之PyQt5简单绘图板实例与代码分析

    在PyQt中常用的图像类有四种,QPixmap,QImage,QPicture,QBitmap 类型 描述 QPixmap 专门为绘图设计的,在绘制图片时需要使用QPixmap QImage 提供了一个与硬件无关的图像表示函数,可以用于图片像素级访问 QPicture 是一个绘图设备类,它继承自QPainter类,可以使用QPainter的begin()函数在QPicture上绘图,使用end()函数结束绘图,使用QPicture的save()函数将QPainter所使用的绘图指令保存在文件中

  • Python使用pyautogui模块实现自动化鼠标和键盘操作示例

    本文实例讲述了Python使用pyautogui模块实现自动化鼠标和键盘操作.分享给大家供大家参考,具体如下: 一.pyautogui模块简要说明 ## 使用 pyautogui 模块相关函数,可以模拟鼠标及键盘操作, 完整说明文档见: http://pyautogui.readthedocs.org/ # pip install pyautogui # 要注意的是,模拟移动鼠标与击键可能太快,导致其他程序跟不上,并且程序可能失去控制, # 需要掌握如何从问题中恢复,至少要能中止它. # 防止或

  • python开发之tkinter实现图形随鼠标移动的方法

    本文实例讲述了python开发之tkinter实现图形随鼠标移动的方法.分享给大家供大家参考,具体如下: 做这个东西的时候,灵感源自于一个js效果: 两个眼睛随鼠标移动而移动 运行效果: 代码部分: from tkinter import * #1.获取到小圆当前的圆心坐标(x1, y1) #2.获取到小圆移动的圆心坐标(x2, y2) #3.把小圆从坐标(x1, y1)移动到坐标(x2, y2) __author__ = {'name' : 'Hongten', 'mail' : 'hongt

  • python 基于opencv 实现一个鼠标绘图小程序

    需求 在画布上用鼠标画图,可以画圆或矩形,按m键在两种模式下切换.左键按下时开始画图,移动到哪儿画到哪儿,左键释放时结束画图. 实现思想 用鼠标画图:需要定义鼠标的回调函数mouse_event 画圆或矩形:需要定义一个画图的模式mode 左键单击.移动.释放:需要捕获三个不同的事件 开始画图,结束画图:需要定义一个画图的标记位drawing 实现代码 import cv2 as cv import numpy as np drawing = False # 是否开始画图 mode = True

  • Python matplotlib绘图时使用鼠标滚轮放大/缩小图像

    目录 思路: 示例: 输出效果: 总结 思路: 使用fig.canvas.mpl_connect()函数来绑定相关fig的滚轮事件 利用事件event的inaxes属性获取当前鼠标所在坐标系ax 使用get_xlim()函数获取坐标系ax的x/y轴坐标刻度范围 使用set()函数对坐标系ax进行放大/缩小 示例: import matplotlib.pyplot as plt import numpy as np fig = plt.figure() def call_back(event):

  • python鼠标绘图附代码

    目录 作业要求 友情提示 分析 结果呈现 悬浮状态 2020/02/04 更新code github指路 作业要求 友情提示 ldw老师给の友情提示(虽然感觉也还好/dbq其实还挺有用的) 课上讲的例子是图片展示器(能够实现打开图片+镜像显示图片+保存图片+操作日志的功能) 讲真那啥猫咪图片还挺好看 演示之后差不多是这样 分析 然后按照上面这个样例我们要做一个鼠标绘图的gui界面(这就有点难度了 先分析一下就是 (我本来是想保留日志和水平翻转垂直翻转这种操作的/后来放弃了/有点难/而且……那啥…

  • VB实现鼠标绘图实例代码

    本文所述为VB实现鼠标绘图的实例,该实例实现线条颜色和线宽可自设,当按下鼠标按键时绘图开始并记录最初的起点,如果不是处在绘图状态则退出该过程,如果处在绘图状态则从起点到目前鼠标所在点绘制直线,然后将当前鼠标所在点作为新的起点,当释放鼠标按键时绘图结束. 具体的功能代码如下: VERSION 5.00 Object = "{F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.2#0"; "comdlg32.ocx" Begin VB.For

  • 基于python实现的百度音乐下载器python pyqt改进版(附代码)

    前言 之前写过一个用python实现的百度新歌榜.热歌榜下载器的文章,实现了百度新歌.热门歌曲的爬取与下载.但那个采用的是单线程,网络状况一般的情况下,扫描前100首歌的时间大概得到40来秒.而且用Pyqt做的界面,在下载的过程中进行窗口操作,会出现UI阻塞的现象. 前两天有时间调整了一下,做了几方面的改进: 1.修改了UI界面阻塞的问题,下载的过程中可以进行其它的UI操作; 2.爬虫程序采用一个主线程,8个子线程的方式快速爬取,网络状况一致的情况下,将扫描100首歌曲的时间提高到了8.9秒左右

  • Python超越函数积分运算以及绘图实现代码

    编译环境:ubuntu17.04 Python3.5 所需库:numpy.scipy.matplotlib 下面是理想平面的辐射强度计算(课程大作业---) 1.超越函数积分运算 def integral(x,c1,c2,T): return ((c1*0.98)/(x**5))*(1/((np.e**(c2/(x*T)))-1)) resut,err = integrate.quad(integral, 3, 5, args=(c1,c2,T)) 2.绘图实现 plt.figure(1) ax

  • Python实现疫情通定时自动填写功能(附代码)

    自疫情始,学校就要求学生每天在学校内系统填写个人每日疫情相关情况,称为疫情通. 但是,由于个人原因,出现了下图情况. 记性太差,人又懒,于是决定用Python实现自动化定时任务. 1.核心模块 打开IEChrome. 打开网页按下F12拿到请求头和请求体. (假装此处有图片) Pycharm启动! 根据拿到的请求头和请求体,完成核心代码编写. url = "https://xxcapp.xidian.edu.cn/ncov/wap/default/save" headers = {'C

  • python海龟绘图之画国旗实例代码

    画之前肯定要知道规格图,我找了一个大致的图. 参考图片: 绘制大星的方法很简单,五角星的补角是144度. 绘制小五角星有点麻烦,因为我国国旗上的小五角星并不是平放的(美帝曾经这样把我们的国旗搞错过),而是总有一个角正对着大五角星的中心!我的方法是,定位到小五角星的中心点,然后根据角度后退一定的长度.这个角度可以根据反勾股定理算出来(这有计算工具),长度我是按照大五角星的中心点到角尖的距离除以3得到的. 代码: from turtle import * screensize(2000,2000,'

  • 五个Python迷你版小程序附代码

    一.石头剪刀布游戏 目标:创建一个命令行游戏,游戏者可以在石头.剪刀和布之间进行选择,与计算机PK.如果游戏者赢了,得分就会添加,直到结束游戏时,最终的分数会展示给游戏者. 提示:接收游戏者的选择,并且与计算机的选择进行比较.计算机的选择是从选择列表中随机选取的.如果游戏者获胜,则增加1分. import random choices = ["Rock", "Paper", "Scissors"] computer = random.choice

  • Python实现修改图片分辨率(附代码)

    目录 前言 环境依赖 代码 验证一下 前言 本文提供将图片分辨率调整的python代码,一如既往的实用主义. 环境依赖 ffmpeg环境安装,可以参考:windows ffmpeg安装部署 ffmpy安装: pip install ffmpy -i https://pypi.douban.com/simple 代码 不废话,上代码. #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2021/12/11 21:43 # @Author

随机推荐