python programming作业10(仍有一点点小bug)
# -*- coding: utf-8 -*- 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.initData()
#清空画布
self.initView() '''
a="F:/ProgramData/我的python/python_programming/cat.jpg"
self.pixmap = QPixmap(a)
self.painter = QPainter(self.pixmap)
self.painter.setPen(self.pen)
self.imageLabel.setPixmap(self.pixmap)
''' #菜单栏
self.Menu = self.menuBar().addMenu("菜单") #清空
self.ClearAction = QAction(QIcon("images/file-new.gif"), "清空", self)
self.ClearAction.triggered.connect(self.initView)
self.Menu.addAction(self.ClearAction) #调画笔颜色
self.changeColor = QAction(QIcon("images/color.png"), "颜色", self)
self.changeColor.triggered.connect(self.showColorDialog)
self.Menu.addAction(self.changeColor) #调画笔粗细
self.changeWidth = QAction(QIcon("images/width.ico"), "宽度", 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,700)
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 painting(self):
self.painter.drawLine(1,1,200,200)
#画完图以后放回去
self.imageLabel.setPixmap(self.pixmap)
''' 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,700)
form.show()
app.exec_()
文件直接导图片画画会出bug,画几笔再导图片反而不会,还有就是导入图片再画画时,坐标可能需要做变化,望有大神能有所指点!!!
python programming作业10(仍有一点点小bug)的更多相关文章
- python programming作业11 Qt designer (打地鼠,不是很完美)
不导包的代码 from PyQt5 import QtCore, QtGui, QtWidgets import sys from PyQt5.QtWidgets import QApplicati ...
- python programming作业5
# -*- coding: utf-8 -*- class ageError(Exception): pass class salaryError(Exception): pass class s ...
- Building Python 2.7.10 with Visual Studio 2010 or 2015 - Google Chrome
您的浏览器(Chrome 33) 需要更新.该浏览器有诸多安全漏洞,无法显示本网站的所有功能. 了解如何更新浏览器 × p-nand-q.com C++ Python Programming L ...
- 【1414软工助教】团队作业10——复审与事后分析(Beta版本) 得分榜
题目 团队作业10--复审与事后分析(Beta版本) 往期成绩 个人作业1:四则运算控制台 结对项目1:GUI 个人作业2:案例分析 结对项目2:单元测试 团队作业1:团队展示 团队作业2:需求分析& ...
- 团队作业10——事后分析(Beta版本)
团队作业10--事后分析(Beta版本) 目录 一.设想与目标 二.计划 三.资源 四.变更管理 五.设计与实现 六.测试与发布 七.总结 八.图片和贡献分分配 一.设想和目标 1.我们的软件要解决什 ...
- 【集美大学1411_助教博客】团队作业10——项目复审与事后分析(Beta版本)
写在前面的话 软件工程课结束了,大家开心吗?是不是再也不用熬夜写代码了?如果这门课你真的熬夜写代码了,相信你一定有收获,如果这门课结束了你觉得是自己一个全新的开始,那么这门课的意义就实现了.团队作业全 ...
- 【2017集美大学1412软工实践_助教博客】团队作业10——项目复审与事后分析(Beta版本)
写在前面的话 转眼轰轰烈烈本学期的软工实践就结束了,这个过程中想必在熬夜敲代码,激烈讨论中留下诸多回忆的同时,也收获了不少.恭喜所有团队完成了本阶段冲刺,此外,由于大家的贡献分给的都很平均,将个人贡献 ...
- 团队作业10——项目复审与事后分析(Beta版本)
油炸咸鱼24点APP 团队作业10--事后诸葛亮分析; 团队作业10--Beta阶段项目复审;
- 团队作业10——复审和事后分析(Beta版本)
团队作业10--事后分析(Beta版本) http://www.cnblogs.com/newteam6/p/6953992.html 团队作业10--复审(Beta版本) http://www.cn ...
随机推荐
- 在RecyclerView中集成QQ汽泡二
上次已经将GooView集成到RecyclerView当中了[http://www.cnblogs.com/webor2006/p/7787511.html],但是目前还有很多问题,下面先来运行看一下 ...
- PAT乙级1024
题目链接 https://pintia.cn/problem-sets/994805260223102976/problems/994805297229447168 题解 第一遍也是没有全部AC,有3 ...
- Python 判断文件是否存在,不存在则将名称写入指定文件
import os filename = '15464657761111111.pdf' pathDir = 'F:/tqcs/sr' # 判断文件是否存在 if os.path.exists(pat ...
- bzoj3307 雨天的尾巴题解及改题过程(线段树合并+lca+树上差分)
题目描述 N个点,形成一个树状结构.有M次发放,每次选择两个点x,y对于x到y的路径上(含x,y)每个点发一袋Z类型的物品.完成所有发放后,每个点存放最多的是哪种物品. 输入格式 第一行数字N,M接下 ...
- 推荐系统系列(四):PNN理论与实践
背景 上一篇文章介绍了FNN [2],在FM的基础上引入了DNN对特征进行高阶组合提高模型表现.但FNN并不是完美的,针对FNN的缺点上交与UCL于2016年联合提出一种新的改进模型PNN(Produ ...
- Android UI编程之自定义控件初步——ImageButton
我想我们在使用一些App的时候,应该不会出现一些“裸控件”的吧.除非是一些系统中的软件,那是为了保持风格的一致性,做出的一些权衡.我这里并非是在指责Android原生的控件不好看,说实在的,我很喜欢A ...
- 访问zabbix首页无法正常登陆
访问: http://IP/zabbix/ (1) You should see the first screen of the frontend installation wizard. (2) 检 ...
- npm+cnpm+vuecli3打包相关
1,npm install和cnpm install时的不同 https://blog.csdn.net/csm0912/article/details/90264026 2,npm设置和查看仓库源 ...
- 分布式锁与实现--基于ZooKeeper实现
引言 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提 ...
- (十二)C语言之循环结构