Browse Source

painter and graphics

runningwater 6 years ago
parent
commit
4aefb33466
8 changed files with 295 additions and 18 deletions
  1. 27 16
      .idea/workspace.xml
  2. 43 0
      MainWindow.py
  3. 26 0
      load_uifile.py
  4. 48 0
      mainwindow.ui
  5. 89 0
      paint_app.py
  6. 33 0
      pixmap.py
  7. 28 0
      signal_data.py
  8. 1 2
      widgets_stacklayout.py

+ 27 - 16
.idea/workspace.xml

@@ -2,9 +2,14 @@
 <project version="4">
 <project version="4">
   <component name="ChangeListManager">
   <component name="ChangeListManager">
     <list default="true" id="c4ea2cee-1e7b-4a07-b2da-95f789e91944" name="Default Changelist" comment="">
     <list default="true" id="c4ea2cee-1e7b-4a07-b2da-95f789e91944" name="Default Changelist" comment="">
-      <change afterPath="$PROJECT_DIR$/widgets_stacklayout.py" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/MainWindow.py" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/load_uifile.py" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/mainwindow.ui" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/paint_app.py" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/pixmap.py" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/signal_data.py" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/toolbars_and_menus.py" beforeDir="false" afterPath="$PROJECT_DIR$/toolbars_and_menus.py" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/widgets_stacklayout.py" beforeDir="false" afterPath="$PROJECT_DIR$/widgets_stacklayout.py" afterDir="false" />
     </list>
     </list>
     <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
     <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
     <option name="SHOW_DIALOG" value="false" />
     <option name="SHOW_DIALOG" value="false" />
@@ -23,10 +28,13 @@
     <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
     <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
   </component>
   </component>
   <component name="ProjectId" id="1S3C7QSmQQMddbKsyuhpr0hmxLm" />
   <component name="ProjectId" id="1S3C7QSmQQMddbKsyuhpr0hmxLm" />
-  <component name="ProjectLevelVcsManager" settingsEditedManually="true" />
+  <component name="ProjectLevelVcsManager" settingsEditedManually="true">
+    <ConfirmationsSetting value="2" id="Add" />
+  </component>
   <component name="PropertiesComponent">
   <component name="PropertiesComponent">
+    <property name="ASKED_ADD_EXTERNAL_FILES" value="true" />
     <property name="last_opened_file_path" value="$PROJECT_DIR$" />
     <property name="last_opened_file_path" value="$PROJECT_DIR$" />
-    <property name="settings.editor.selected.configurable" value="preferences.externalTools" />
+    <property name="settings.editor.selected.configurable" value="preferences.keymap" />
   </component>
   </component>
   <component name="RecentsManager">
   <component name="RecentsManager">
     <key name="CopyFile.RECENT_KEYS">
     <key name="CopyFile.RECENT_KEYS">
@@ -45,8 +53,8 @@
       </list>
       </list>
     </option>
     </option>
   </component>
   </component>
-  <component name="RunManager" selected="Python.toolbars_and_menus">
-    <configuration name="MyApp_window" type="PythonConfigurationType" factoryName="Python" temporary="true">
+  <component name="RunManager" selected="Python.paint_app">
+    <configuration name="paint_app" type="PythonConfigurationType" factoryName="Python" temporary="true">
       <module name="pyqt" />
       <module name="pyqt" />
       <option name="INTERPRETER_OPTIONS" value="" />
       <option name="INTERPRETER_OPTIONS" value="" />
       <option name="PARENT_ENVS" value="true" />
       <option name="PARENT_ENVS" value="true" />
@@ -58,7 +66,7 @@
       <option name="IS_MODULE_SDK" value="true" />
       <option name="IS_MODULE_SDK" value="true" />
       <option name="ADD_CONTENT_ROOTS" value="true" />
       <option name="ADD_CONTENT_ROOTS" value="true" />
       <option name="ADD_SOURCE_ROOTS" value="true" />
       <option name="ADD_SOURCE_ROOTS" value="true" />
-      <option name="SCRIPT_NAME" value="$PROJECT_DIR$/MyApp_window.py" />
+      <option name="SCRIPT_NAME" value="$PROJECT_DIR$/paint_app.py" />
       <option name="PARAMETERS" value="" />
       <option name="PARAMETERS" value="" />
       <option name="SHOW_COMMAND_LINE" value="false" />
       <option name="SHOW_COMMAND_LINE" value="false" />
       <option name="EMULATE_TERMINAL" value="false" />
       <option name="EMULATE_TERMINAL" value="false" />
@@ -67,7 +75,7 @@
       <option name="INPUT_FILE" value="" />
       <option name="INPUT_FILE" value="" />
       <method v="2" />
       <method v="2" />
     </configuration>
     </configuration>
-    <configuration name="toolbars_and_menus" type="PythonConfigurationType" factoryName="Python" temporary="true">
+    <configuration name="pixmap" type="PythonConfigurationType" factoryName="Python" temporary="true">
       <module name="pyqt" />
       <module name="pyqt" />
       <option name="INTERPRETER_OPTIONS" value="" />
       <option name="INTERPRETER_OPTIONS" value="" />
       <option name="PARENT_ENVS" value="true" />
       <option name="PARENT_ENVS" value="true" />
@@ -79,7 +87,7 @@
       <option name="IS_MODULE_SDK" value="true" />
       <option name="IS_MODULE_SDK" value="true" />
       <option name="ADD_CONTENT_ROOTS" value="true" />
       <option name="ADD_CONTENT_ROOTS" value="true" />
       <option name="ADD_SOURCE_ROOTS" value="true" />
       <option name="ADD_SOURCE_ROOTS" value="true" />
-      <option name="SCRIPT_NAME" value="$PROJECT_DIR$/toolbars_and_menus.py" />
+      <option name="SCRIPT_NAME" value="$PROJECT_DIR$/pixmap.py" />
       <option name="PARAMETERS" value="" />
       <option name="PARAMETERS" value="" />
       <option name="SHOW_COMMAND_LINE" value="false" />
       <option name="SHOW_COMMAND_LINE" value="false" />
       <option name="EMULATE_TERMINAL" value="false" />
       <option name="EMULATE_TERMINAL" value="false" />
@@ -88,7 +96,7 @@
       <option name="INPUT_FILE" value="" />
       <option name="INPUT_FILE" value="" />
       <method v="2" />
       <method v="2" />
     </configuration>
     </configuration>
-    <configuration name="widgets" type="PythonConfigurationType" factoryName="Python" temporary="true">
+    <configuration name="signal_data" type="PythonConfigurationType" factoryName="Python" temporary="true">
       <module name="pyqt" />
       <module name="pyqt" />
       <option name="INTERPRETER_OPTIONS" value="" />
       <option name="INTERPRETER_OPTIONS" value="" />
       <option name="PARENT_ENVS" value="true" />
       <option name="PARENT_ENVS" value="true" />
@@ -100,7 +108,7 @@
       <option name="IS_MODULE_SDK" value="true" />
       <option name="IS_MODULE_SDK" value="true" />
       <option name="ADD_CONTENT_ROOTS" value="true" />
       <option name="ADD_CONTENT_ROOTS" value="true" />
       <option name="ADD_SOURCE_ROOTS" value="true" />
       <option name="ADD_SOURCE_ROOTS" value="true" />
-      <option name="SCRIPT_NAME" value="$PROJECT_DIR$/widgets.py" />
+      <option name="SCRIPT_NAME" value="$PROJECT_DIR$/signal_data.py" />
       <option name="PARAMETERS" value="" />
       <option name="PARAMETERS" value="" />
       <option name="SHOW_COMMAND_LINE" value="false" />
       <option name="SHOW_COMMAND_LINE" value="false" />
       <option name="EMULATE_TERMINAL" value="false" />
       <option name="EMULATE_TERMINAL" value="false" />
@@ -109,7 +117,7 @@
       <option name="INPUT_FILE" value="" />
       <option name="INPUT_FILE" value="" />
       <method v="2" />
       <method v="2" />
     </configuration>
     </configuration>
-    <configuration name="widgets_gridlayout" type="PythonConfigurationType" factoryName="Python" temporary="true">
+    <configuration name="toolbars_and_menus" type="PythonConfigurationType" factoryName="Python" temporary="true">
       <module name="pyqt" />
       <module name="pyqt" />
       <option name="INTERPRETER_OPTIONS" value="" />
       <option name="INTERPRETER_OPTIONS" value="" />
       <option name="PARENT_ENVS" value="true" />
       <option name="PARENT_ENVS" value="true" />
@@ -121,7 +129,7 @@
       <option name="IS_MODULE_SDK" value="true" />
       <option name="IS_MODULE_SDK" value="true" />
       <option name="ADD_CONTENT_ROOTS" value="true" />
       <option name="ADD_CONTENT_ROOTS" value="true" />
       <option name="ADD_SOURCE_ROOTS" value="true" />
       <option name="ADD_SOURCE_ROOTS" value="true" />
-      <option name="SCRIPT_NAME" value="$PROJECT_DIR$/widgets_gridlayout.py" />
+      <option name="SCRIPT_NAME" value="$PROJECT_DIR$/toolbars_and_menus.py" />
       <option name="PARAMETERS" value="" />
       <option name="PARAMETERS" value="" />
       <option name="SHOW_COMMAND_LINE" value="false" />
       <option name="SHOW_COMMAND_LINE" value="false" />
       <option name="EMULATE_TERMINAL" value="false" />
       <option name="EMULATE_TERMINAL" value="false" />
@@ -153,11 +161,11 @@
     </configuration>
     </configuration>
     <recent_temporary>
     <recent_temporary>
       <list>
       <list>
+        <item itemvalue="Python.paint_app" />
+        <item itemvalue="Python.pixmap" />
+        <item itemvalue="Python.signal_data" />
         <item itemvalue="Python.toolbars_and_menus" />
         <item itemvalue="Python.toolbars_and_menus" />
         <item itemvalue="Python.widgets_stacklayout" />
         <item itemvalue="Python.widgets_stacklayout" />
-        <item itemvalue="Python.widgets_gridlayout" />
-        <item itemvalue="Python.widgets" />
-        <item itemvalue="Python.MyApp_window" />
       </list>
       </list>
     </recent_temporary>
     </recent_temporary>
   </component>
   </component>
@@ -187,4 +195,7 @@
       </map>
       </map>
     </option>
     </option>
   </component>
   </component>
+  <component name="VcsManagerConfiguration">
+    <option name="ADD_EXTERNAL_FILES_SILENTLY" value="true" />
+  </component>
 </project>
 </project>

+ 43 - 0
MainWindow.py

@@ -0,0 +1,43 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'mainwindow.ui'
+#
+# Created by: PyQt5 UI code generator 5.13.1
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_MainWindow(object):
+    def setupUi(self, MainWindow):
+        MainWindow.setObjectName("MainWindow")
+        MainWindow.resize(536, 578)
+        self.centralwidget = QtWidgets.QWidget(MainWindow)
+        self.centralwidget.setObjectName("centralwidget")
+        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.label = QtWidgets.QLabel(self.centralwidget)
+        self.label.setObjectName("label")
+        self.verticalLayout.addWidget(self.label)
+        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
+        self.pushButton.setObjectName("pushButton")
+        self.verticalLayout.addWidget(self.pushButton)
+        MainWindow.setCentralWidget(self.centralwidget)
+        self.menubar = QtWidgets.QMenuBar(MainWindow)
+        self.menubar.setGeometry(QtCore.QRect(0, 0, 536, 22))
+        self.menubar.setObjectName("menubar")
+        MainWindow.setMenuBar(self.menubar)
+        self.statusbar = QtWidgets.QStatusBar(MainWindow)
+        self.statusbar.setObjectName("statusbar")
+        MainWindow.setStatusBar(self.statusbar)
+
+        self.retranslateUi(MainWindow)
+        QtCore.QMetaObject.connectSlotsByName(MainWindow)
+
+    def retranslateUi(self, MainWindow):
+        _translate = QtCore.QCoreApplication.translate
+        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
+        self.label.setText(_translate("MainWindow", "TextLabel"))
+        self.pushButton.setText(_translate("MainWindow", "PushButton"))

+ 26 - 0
load_uifile.py

@@ -0,0 +1,26 @@
+import sys
+
+from PyQt5 import QtWidgets, uic
+from PyQt5.QtWidgets import QMainWindow
+
+from MainWindow import Ui_MainWindow
+
+
+class MainWindow(QMainWindow, Ui_MainWindow):
+    def __init__(self, *args, **kwargs):
+        super(MainWindow, self).__init__(*args, **kwargs)
+        self.setupUi(self)
+
+
+def mainwindow_setup(w):
+    w.setTitle("MainWindow Title")
+
+
+if __name__ == '__main__':
+    app = QtWidgets.QApplication(sys.argv)
+
+    # window = uic.loadUi("mainwindow.ui")
+    # mainwindow_setup(window)
+    window = MainWindow()
+    window.show()
+    app.exec()

+ 48 - 0
mainwindow.ui

@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MainWindow</class>
+ <widget class="QMainWindow" name="MainWindow">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>536</width>
+    <height>578</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>MainWindow</string>
+  </property>
+  <widget class="QWidget" name="centralwidget">
+   <layout class="QVBoxLayout" name="verticalLayout">
+    <item>
+     <widget class="QLabel" name="label">
+      <property name="text">
+       <string>TextLabel</string>
+      </property>
+     </widget>
+    </item>
+    <item>
+     <widget class="QPushButton" name="pushButton">
+      <property name="text">
+       <string>PushButton</string>
+      </property>
+     </widget>
+    </item>
+   </layout>
+  </widget>
+  <widget class="QMenuBar" name="menubar">
+   <property name="geometry">
+    <rect>
+     <x>0</x>
+     <y>0</y>
+     <width>536</width>
+     <height>22</height>
+    </rect>
+   </property>
+  </widget>
+  <widget class="QStatusBar" name="statusbar"/>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>

+ 89 - 0
paint_app.py

@@ -0,0 +1,89 @@
+import random
+import sys
+
+from PyQt5 import QtWidgets, QtGui, QtCore
+
+COLORS = [
+    # 17undertoneshttps://lospec.com/palette-list/17undertones
+    '#000000', '#141923', '#414168', '#3A7FA7', '#35E3E3', '#8FD970', '#5EBB49',
+    '#458352', '#DCD37B', '#FFFEE5', '#FFD035', '#CC9245', '#A15C3E', '#A42F3B',
+    '#F45B7A', '#C24998', '#81588D', '#BCB0C2', '#FFFFFF', ]
+SPRAY_PARTICLES = 100
+SPRAY_DIAMMETER = 10
+
+
+class Canvas(QtWidgets.QLabel):
+    def __init__(self):
+        super().__init__()
+        pixmap = QtGui.QPixmap(600, 300)
+        self.setPixmap(pixmap)
+
+        self.last_x, self.last_y = None, None
+        self.pen_color = QtGui.QColor('#000000')
+
+    def set_pen_color(self, c):
+        self.pen_color = QtGui.QColor(c)
+
+    def mouseMoveEvent(self, e):
+        if self.last_x is None:
+            self.last_x = e.x()
+            self.last_y = e.y()
+            return
+
+        painter = QtGui.QPainter(self.pixmap())
+        p = painter.pen()
+        p.setWidth(1)
+        p.setColor(self.pen_color)
+        painter.setPen(p)
+
+        for n in range(SPRAY_PARTICLES):
+            xo = random.gauss(0, SPRAY_DIAMMETER)
+            yo = random.gauss(0, SPRAY_DIAMMETER)
+            painter.drawPoint(e.x() + xo, e.y() + yo)
+
+        self.update()
+
+        self.last_x = e.x()
+        self.last_y = e.y()
+
+    def mouseReleaseEvent(self, e):
+        self.last_x, self.last_y = None, None
+
+
+class QPaletteButton(QtWidgets.QPushButton):
+    def __init__(self, color):
+        super().__init__()
+        self.setFixedSize(QtCore.QSize(24, 24))
+        self.color = color
+        self.setStyleSheet("background-color: %s;" % color)
+
+
+class MainWindow(QtWidgets.QMainWindow):
+    def __init__(self):
+        super().__init__()
+
+        self.canvas = Canvas()
+
+        w = QtWidgets.QWidget()
+        l = QtWidgets.QVBoxLayout()
+        w.setLayout(l)
+        l.addWidget(self.canvas)
+
+        palette = QtWidgets.QHBoxLayout()
+        self.add_palette_buttons(palette)
+        l.addLayout(palette)
+
+        self.setCentralWidget(w)
+
+    def add_palette_buttons(self, layout):
+        for c in COLORS:
+            b = QPaletteButton(c)
+            b.pressed.connect(lambda color=c: self.canvas.set_pen_color(color))
+            layout.addWidget(b)
+
+
+if __name__ == '__main__':
+    app = QtWidgets.QApplication(sys.argv)
+    window = MainWindow()
+    window.show()
+    app.exec_()

+ 33 - 0
pixmap.py

@@ -0,0 +1,33 @@
+import sys
+
+from PyQt5 import QtWidgets, QtGui
+
+
+class MainWindow(QtWidgets.QMainWindow):
+    def __init__(self):
+        super().__init__()
+
+        self.label = QtWidgets.QLabel()
+        canvas = QtGui.QPixmap(400, 300)
+        self.label.setPixmap(canvas)
+        self.setCentralWidget(self.label)
+        self.draw_something()
+
+    def draw_something(self):
+        painter = QtGui.QPainter(self.label.pixmap())
+        pen = QtGui.QPen()
+        pen.setWidth(3)
+        pen.setColor(QtGui.QColor(204, 0, 0))  # r, g, b
+        painter.setPen(pen)
+
+        painter.drawEllipse(10, 10, 100, 100)
+        painter.drawEllipse(10, 10, 150, 200)
+        painter.drawEllipse(10, 10, 200, 300)
+        painter.end()
+
+
+if __name__ == '__main__':
+    app = QtWidgets.QApplication(sys.argv)
+    window = MainWindow()
+    window.show()
+    app.exec_()

+ 28 - 0
signal_data.py

@@ -0,0 +1,28 @@
+from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QPushButton, QWidget
+
+
+class MainWindow(QMainWindow):
+    def __init__(self, *args, **kwargs):
+        super(MainWindow, self).__init__(*args, **kwargs)
+        self.setWindowTitle("My Awesome App")
+
+        layout = QVBoxLayout()
+        for n in range(10):
+            btn = QPushButton(str(n))
+            btn.pressed.connect(lambda val=n: self.my_custom_fn(val))
+            layout.addWidget(btn)
+
+        widget = QWidget()
+        widget.setLayout(layout)
+
+        self.setCentralWidget(widget)
+
+    def my_custom_fn(self, n):
+        print("Button %d was clicked" % n)
+
+
+if __name__ == '__main__':
+    app = QApplication([])
+    window = MainWindow()
+    window.show()
+    app.exec_()

+ 1 - 2
widgets_stacklayout.py

@@ -1,8 +1,7 @@
 # Only needed for access to command line arguments
 # Only needed for access to command line arguments
 import sys
 import sys
 
 
-from PyQt5.QtCore import *
-from PyQt5.QtGui import QPixmap, QPalette, QColor
+from PyQt5.QtGui import QPalette, QColor
 from PyQt5.QtWidgets import *
 from PyQt5.QtWidgets import *