pyqt5-pythonで簡単なお絵描きツールを作っています。
今、mainwindow内に、canvas,predictcanvas,button類(tools)を並列させて、表示させようとしているのですが、なぜかpredictcanvasだけ表示されません。。。
表示できる解決策、よろしくお願いいたします。
以下は実行したコードです
環境:windows10
python
1import sys 2from PyQt5.QtWidgets import ( 3 QWidget, QApplication, QMainWindow, QAction, 4 QFileDialog, QColorDialog, QInputDialog, QPushButton,QHBoxLayout, QVBoxLayout, QApplication) 5from PyQt5.QtGui import QPainter, QImage, QPen, qRgb 6from PyQt5.QtCore import Qt, QPoint, QRect, QSize, QDir 7from collections import deque 8from PyQt5.QtCore import pyqtSlot 9from PyQt5.QtGui import QIcon 10 11class MainWindow(QMainWindow): 12 def __init__(self): 13 super(MainWindow, self).__init__() 14 self.setupUI() 15 self.setCentralWidget(self.initUI()) 16 #クラスを呼び出す。 17 18 def initUI(self): 19 frame = QWidget(self) 20 self.canvas = Canvas(frame) 21 tools = ToolFrame(frame) 22 predict=PredictCanvas(frame) 23 hbox = QHBoxLayout(frame) 24 #vbox=QVBoxLayout() 25 #vbox.addStretch(0) 26 #vbox.addWidget(tools) 27 #vbox.addWidget(predict) 28 hbox.addWidget(self.canvas) 29 hbox.addWidget(predict) 30 hbox.addWidget(tools) 31 return frame 32 33 def setupUI(self): 34 menubar = self.menuBar() 35 36 openAct = QAction('&Open', self) 37 openAct.setShortcut('Ctrl+O') 38 openAct.triggered.connect(self.openFile) 39 40 exitAct = QAction('&Exit', self) 41 exitAct.setShortcut('Ctrl+Q') 42 exitAct.triggered.connect(self.close) 43 44 saveAct = QAction('&Save', self) 45 saveAct.setShortcut('Ctrl+S') 46 saveAct.triggered.connect(self.saveFile) 47 48 fileMenu = menubar.addMenu('&File') 49 #fileMenu.addAction(resetAct) 50 fileMenu.addAction(openAct) 51 fileMenu.addAction(saveAct) 52 fileMenu.addAction(exitAct) 53 54 # 画像付き Pencolor selectするアクションオブジェクト作成 55 selectColorAction = QAction( QIcon('sample/white-bear.png'),'Pen Color', self) 56 selectColorAction.setShortcut('Ctrl+A') 57 selectColorAction.triggered.connect(self.selectColor) 58 self.toolbar = self.addToolBar('Pen Color') 59 self.toolbar.addAction(selectColorAction) 60 61 # ツールバー作成 62 selectwidthAction = QAction( QIcon('sample/white-bear.png'),'Selecwidth', self) 63 selectwidthAction.triggered.connect(self.selectWidth) 64 self.toolbar = self.addToolBar('Width') 65 self.toolbar.addAction(selectwidthAction) 66 67 # ツールバー作成 68 backAction = QAction( QIcon('sample/white-bear.png'),'Back', self) 69 backAction.setShortcut('Ctrl+Z') 70 backAction.triggered.connect(self.on_back) 71 self.toolbar = self.addToolBar('Undo') 72 self.toolbar.addAction(backAction) 73 74 # ツールバー作成 75 clearAction = QAction( QIcon('sample/white-bear.png'),'Clear', self) 76 clearAction.setShortcut('Ctrl+B') 77 clearAction.triggered.connect(self.on_reset) 78 self.toolbar = self.addToolBar('Undo') 79 self.toolbar.addAction(clearAction) 80 81 @pyqtSlot() 82 def on_back(self): 83 print('PyQt5 button click') 84 self.canvas.backImage() 85 86 @pyqtSlot() 87 def on_reset(self): 88 self.canvas.resetImage() 89 90 @pyqtSlot() 91 def on_run(self): 92 fileName, _ = QFileDialog.getOpenFileName(self, "Open File", QDir.currentPath()) 93 94 if fileName: 95 self.predict_canvas.PredictImage(fileName) 96 #self.canvas.openImage(fileName) 97 98 def selectColor(self): 99 newColor = QColorDialog.getColor(self.canvas.penColor()) 100 self.canvas.setPenColor(newColor) 101 102 def selectWidth(self): 103 newWidth, ok = QInputDialog.getInt( 104 self, "select", 105 "select pen width: ", self.canvas.penWidth(), 1, 100, 1) 106 if ok: 107 self.canvas.setPenWidth(newWidth) 108 109 def openFile(self): 110 fileName, _ = QFileDialog.getOpenFileName(self, "Open File", QDir.currentPath()) 111 if fileName: 112 self.canvas.openImage(fileName) 113 114 def saveFile(self): 115 path = QDir.currentPath() 116 print(path) 117 fileName, _ = QFileDialog.getSaveFileName(self, "Save as",path) 118 fileName=fileName+'.png' 119 if fileName: 120 print(fileName) 121 return self.canvas.saveImage(fileName) 122 else: 123 print("you couldnt save the file") 124 return False 125 126class ToolFrame(QWidget): 127 def __init__(self, parent=None, *args, **kw): 128 super().__init__(parent, *args, **kw) 129 self.predict=PredictCanvas() 130 self.initUI() 131 132 def initUI(self): 133 button_predict = QPushButton('predict', self) 134 button_predict.clicked.connect(self.on_run) 135 136 137 button_reset = QPushButton('Reset', self) 138 139 vbox = QVBoxLayout(self) 140 vbox.addStretch(1) 141 vbox.addWidget(button_predict) 142 vbox.addWidget(button_reset) 143 144 @pyqtSlot() 145 def on_run(self): 146 fileName, _ = QFileDialog.getOpenFileName(self, "Open File", QDir.currentPath()) 147 148 if fileName: 149 self.predict.PredictImage(fileName) 150 #self.canvas.openImage(fileName) 151 152class Canvas(QWidget): 153 def __init__(self, parent = None): 154 super(Canvas, self).__init__(parent) 155 156 self.myPenWidth = 2 157 self.myPenColor = Qt.black 158 self.image = QImage() 159 self.check = False 160 self.back = deque(maxlen = 10) 161 self.image = QImage(300, 300, QImage.Format_RGB32) 162 self.image.fill(qRgb(255, 255, 255)) 163 #self.next = deque(maxlen = 10) 164 # initUIはもう必要ないから消しておこうね 165 166 167 def mousePressEvent(self, event): 168 if event.button() == Qt.LeftButton: 169 self.back.append(self.resizeImage(self.image, self.image.size())) 170 self.lastPos = event.pos() 171 self.check = True 172 173 def mouseMoveEvent(self, event): 174 if event.buttons() and Qt.LeftButton and self.check: 175 self.drawLine(event.pos()) 176 177 def mouseReleaseEvent(self, event): 178 if event.button() == Qt.LeftButton and self.check: 179 self.drawLine(event.pos()) 180 self.check = False 181 182 def drawLine(self, endPos): 183 painter = QPainter(self.image) 184 painter.setPen( 185 QPen(self.myPenColor, self.myPenWidth, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin) 186 ) 187 painter.drawLine(self.lastPos, endPos) 188 self.update() 189 self.lastPos = QPoint(endPos) 190 191 def paintEvent(self, event): 192 painter = QPainter(self) 193 rect = event.rect() 194 painter.drawImage(rect, self.image, rect) 195 196 def resizeEvent(self, event): 197 if self.image.width() < self.width() or self.image.height() < self.height(): 198 changeWidth = max(self.width(), self.image.width()) 199 changeHeight = max(self.height(), self.image.height()) 200 self.image = self.resizeImage(self.image, QSize(changeWidth, changeHeight)) 201 self.update() 202 203 def resizeImage(self, image, newSize): 204 changeImage = QImage(newSize, QImage.Format_RGB32) 205 changeImage.fill(qRgb(255, 255, 255)) 206 painter = QPainter(changeImage) 207 painter.drawImage(QPoint(0, 0), image) 208 return changeImage 209 210 def saveImage(self, filename): 211 if self.image.save(filename): 212 return True 213 else: 214 return False 215 216 def openImage(self, filename): 217 image = QImage() 218 if not image.load(filename): 219 return False 220 221 self.image = image 222 self.update() 223 return True 224 225 def penColor(self): 226 return self.myPenColor 227 228 def penWidth(self): 229 return self.myPenWidth 230 231 def setPenColor(self, newColor): 232 self.myPenColor = newColor 233 234 def setPenWidth(self, newWidth): 235 self.myPenWidth = newWidth 236 237 def resetImage(self): 238 self.image.fill(qRgb(255, 255, 255)) 239 self.update() 240 241 def backImage(self): 242 if self.back: 243 back_ = self.back.pop() 244 #self.next.append(back_) 245 self.image = QImage(back_) 246 self.update() 247 248 249class PredictCanvas(QWidget): 250 def __init__(self, parent = None): 251 super(PredictCanvas, self).__init__(parent) 252 253 self.image_predict = QImage() 254 self.image_predict.fill(qRgb(255, 0, 255)) 255 256 def PredictImage(self, filename): 257 image = QImage() 258 if not image.load(filename): 259 return False 260 261 self.image_predict = image 262 self.update() 263 return True 264 265def main(): 266 app = QApplication(sys.argv) 267 ex = MainWindow() 268 ex.setWindowTitle('Paint Tools') 269 ex.setGeometry(50, 50, 1400, 800) 270 ex.show() 271 sys.exit(app.exec_()) 272 273if __name__ == '__main__': 274 main() 275
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。