亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python鼠標(biāo)繪圖附代碼

 更新時(shí)間:2022年05月23日 10:46:56   作者:陳杉菜  
這篇文章主要為大家介紹了python鼠標(biāo)繪圖的實(shí)現(xiàn)完整示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

github指路

作業(yè)要求

友情提示

ldw老師給の友情提示(雖然感覺也還好/dbq其實(shí)還挺有用的)

課上講的例子是圖片展示器(能夠?qū)崿F(xiàn)打開圖片+鏡像顯示圖片+保存圖片+操作日志的功能)

講真那啥貓咪圖片還挺好看

演示之后差不多是這樣??

分析

然后按照上面這個(gè)樣例我們要做一個(gè)鼠標(biāo)繪圖的gui界面(這就有點(diǎn)難度了

先分析一下就是??

(我本來是想保留日志和水平翻轉(zhuǎn)垂直翻轉(zhuǎn)這種操作的/后來放棄了/有點(diǎn)難/而且……那啥……我做不到在現(xiàn)有的圖上繪制內(nèi)容就很抱歉)

老師上課其實(shí)有提到說那啥控件要改(但是我改完之后貌似不對

然后開始干活

結(jié)果呈現(xiàn)

懸浮狀態(tài)

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("寬度設(shè)置")
        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()
        #初始化參數(shù)
        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)
        #調(diào)畫筆顏色
        self.changeColor = QAction(QIcon("images/icon.png"), "顏色", self)
        self.changeColor.triggered.connect(self.showColorDialog)
        self.Menu.addAction(self.changeColor)
        #調(diào)畫筆粗細(xì)
        self.changeWidth = QAction(QIcon("images/width.png"), "寬度", self)
        self.changeWidth.triggered.connect(self.showWidthDialog)
        self.Menu.addAction(self.changeWidth)
        # #右側(cè)??看翱?
        # 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)
        #狀態(tài)欄
        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()  # 實(shí)例化畫筆對象
        self.pen.setColor(self.color)  #設(shè)置畫筆顏色
        self.pen = QPen(Qt.SolidLine)  #實(shí)例化畫筆對象.參數(shù):畫筆樣式
        self.pen.setWidth(self.width) #設(shè)置畫筆粗細(xì)
        #新建繪圖工具
        self.painter = QPainter(self.pixmap)
        self.painter.setPen(self.pen)
        #鼠標(biāo)位置
        self.__lastPos = QPoint(0,0)#上一次鼠標(biāo)位置
        self.__currentPos = QPoint(0,0)#當(dāng)前的鼠標(biāo)位置
        self.image = QImage()
    def initView(self):
        #設(shè)置界面的尺寸為__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):
        #鼠標(biāo)按下時(shí),獲取鼠標(biāo)的當(dāng)前位置保存為上一次位置
        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):
        #鼠標(biāo)移動時(shí),更新當(dāng)前位置,并在上一個(gè)位置和當(dāng)前位置間畫線
        self.__currentPos =  event.pos()
        #pointX = event.globalX()
        #pointY = event.globalY()
        #self.__currentPos = QPoint(pointX,pointY)
        #畫線
        #用begin和end抱起來,表示針對這個(gè)對象,就可以在pixmap有圖的情況下繼續(xù)畫畫 
        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)
    #調(diào)畫筆顏色
    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): #警告當(dāng)前圖像未保存
            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鼠標(biāo)繪圖附代碼的詳細(xì)內(nèi)容,更多關(guān)于python鼠標(biāo)繪圖的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Httprunner簡介、安裝及基本使用教程

    Httprunner簡介、安裝及基本使用教程

    httprunner是一款面向 HTTP(S) 協(xié)議的通用測試框架。只需編寫維護(hù)一份 YAML/JSON 腳本,即可實(shí)現(xiàn)自動化測試、性能測試、線上監(jiān)控、持續(xù)集成等多種測試需求,本文給大家介紹Httprunner安裝使用教程,感興趣的朋友一起看看吧
    2022-02-02
  • PYQT5設(shè)置textEdit自動滾屏的方法

    PYQT5設(shè)置textEdit自動滾屏的方法

    今天小編就為大家分享一篇PYQT5設(shè)置textEdit自動滾屏的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • python利用正則表達(dá)式提取字符串

    python利用正則表達(dá)式提取字符串

    相信大家在日常工作中經(jīng)常會遇見在文本中提取特定位置字符串的需求,python的正則性很好,很適合做這類字符串的提取,所以這篇文章就給大家詳細(xì)講一下提取的技巧,并通過示例代碼講解,對大家理解很有幫助,有需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧。
    2016-12-12
  • 解決Python內(nèi)層for循環(huán)如何break出外層的循環(huán)的問題

    解決Python內(nèi)層for循環(huán)如何break出外層的循環(huán)的問題

    今天小編就為大家分享一篇解決Python內(nèi)層for循環(huán)如何break出外層的循環(huán)的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • python中g(shù)event庫的用法詳情

    python中g(shù)event庫的用法詳情

    這篇文章主要介紹了python中g(shù)event庫的用法詳情,Greenlet全部運(yùn)行在主程序操作系統(tǒng)的過程中,但是它們是協(xié)作調(diào)度的,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值
    2022-07-07
  • Python實(shí)現(xiàn)為圖像添加下雪特效

    Python實(shí)現(xiàn)為圖像添加下雪特效

    這篇文章主要為大家介紹了通過Python為圖像添加下雪特效,文中的示例代碼講解詳細(xì),對學(xué)習(xí)Python有一定的幫助,感興趣的小伙伴可以了解一下
    2021-12-12
  • Python如何從txt文件中提取特定數(shù)據(jù)

    Python如何從txt文件中提取特定數(shù)據(jù)

    這篇文章主要給大家介紹了關(guān)于Python如何從txt文件中提取特定數(shù)據(jù)的相關(guān)資料,有時(shí)我們會遇到需要按行讀取文本的情況,我們要讀取txt文件獲得數(shù)據(jù),需要的朋友可以參考下
    2023-08-08
  • 詳細(xì)介紹Python中的set集合

    詳細(xì)介紹Python中的set集合

    本文詳細(xì)介紹了Python中set集合的基本概念和詳細(xì)用法,希望對讀者朋友們有所幫助。需要的朋友可以參考下面具體的文章內(nèi)容
    2021-09-09
  • python關(guān)于第三方日志的QA記錄詳解

    python關(guān)于第三方日志的QA記錄詳解

    這篇文章主要為大家介紹了python關(guān)于第三方日志的QA記錄詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • 基于fastapi框架的異步解讀

    基于fastapi框架的異步解讀

    這篇文章主要介紹了基于fastapi框架的異步解讀,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03

最新評論