Malen nach einer Aktion mit Mauszeiger in pyqt5

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Legizockt
User
Beiträge: 2
Registriert: Samstag 10. Juli 2021, 10:22

Hi,

Ich versuche mich seit paar Tagen hier dran:
Das Bild zeigen etc. klappt. Nur das Malen, sowie aktivieren und deaktivieren klappt nicht


Es wird ein Bild gezeigt, dann wartet das Programm 60 Sekunden.
Dann soll der Benutzer das Bild malen.

Ich möchte das Malen nach 60 Sekunden aktivieren und dann wieder deaktivieren.

Dann wird ein Vergleich angezeigt, bei dem das Malen auch nicht funktionieren soll.

Wie mache ich das Ganze nun? :?:

Ich habe viel mit diesen Dingen probiert:

https://github.com/PrajjwalDatir/PaintP ... r/paint.py
https://www.mfitzp.com/tutorials/bitmap-graphics/
https://zetcode.com/gui/pyqt5/painting/
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte *deinen* Code zeigen. Dann koenenn wir sehen, woran es hakt.
Legizockt
User
Beiträge: 2
Registriert: Samstag 10. Juli 2021, 10:22

__deets__ hat geschrieben: Samstag 10. Juli 2021, 10:55 Bitte *deinen* Code zeigen. Dann koenenn wir sehen, woran es hakt.
Ich habe keine Funktion zum malen etc.
Hier mein kompletter Code:

Code: Alles auswählen

##########################
#         Import         #
##########################

import sys, random, os, glob
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtCore import QCoreApplication
from PyQt5.QtGui import QPalette, QBrush, QPixmap, QPainter
from PyQt5.Qt import QEventLoop
from PyQt5.QtCore import QTimer
from PyQt5.QtCore import Qt, QPoint
from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5.QtGui import QPixmap, QPainter, QPen
from PyQt5.QtWidgets import QMainWindow, QApplication, QMenu, QMenuBar, QAction, QFileDialog
from PyQt5.QtGui import QIcon, QImage, QPainter, QPen, QBrush
from PyQt5.QtCore import Qt, QPoint
import sys


##########################
#         Color          #
##########################

Primary = '#A6BF4B'
Secondary = '#D95F69'
Bg700 = '#BfB99B'
Bg300 = '#B7D4E7'
Textcolor = 'black'

##########################
#         Code           #
###########################
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        MainWindow.setMinimumSize(QtCore.QSize(800, 600))
        MainWindow.setMaximumSize(QtCore.QSize(800, 600))
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("LOGO.gif"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        MainWindow.setWindowIcon(icon)
        MainWindow.setWindowTitle('SignMemory')
        MainWindow.setStyleSheet("background:rgb(r:239,g:251,b:255)")
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(0, 0, 801, 171))
        self.label.setStyleSheet("font: 75 18pt \"Averia Sans\";")
        self.label.setLineWidth(1)
        self.label.setMidLineWidth(1)
        self.label.setObjectName("label")



        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(280, 190, 231, 51))
        self.pushButton.setStyleSheet("background-color:rgb(255, 160, 0);\n"
"color: rgb(39, 140, 176);\n"
"font: 87 22pt \"Segoe UI Black\";\n"
"border-color: rgb(255, 251, 254);\n"
"\n"
"")
        self.label_7 = QtWidgets.QLabel(self.centralwidget)
        self.label_7.setGeometry(QtCore.QRect(-250, -10, 801, 61))
        self.label_7.setStyleSheet("font: 75 14pt \"Averia Sans\";")
        self.label_7.setLineWidth(1)
        self.label_7.setMidLineWidth(1)
        self.label_7.setObjectName("label_7")

        self.label_8 = QtWidgets.QLabel(self.centralwidget)
        self.label_8.setGeometry(QtCore.QRect(130, -10, 801, 61))
        self.label_8.setStyleSheet("font: 75 14pt \"Averia Sans\";")
        self.label_8.setLineWidth(1)
        self.label_8.setMidLineWidth(1)
        self.label_8.setObjectName("label_8")

        self.label_9 = QtWidgets.QLabel(self.centralwidget)
        self.label_9.setGeometry(QtCore.QRect(330, -30, 801, 741))
        self.label_9.setStyleSheet("font: 75 14pt \"Averia Sans\";")
        self.label_9.setLineWidth(1)
        self.label_9.setMidLineWidth(1)
        self.label_9.setObjectName("label_9")

        self.label_10 = QtWidgets.QLabel(self.centralwidget)
        self.label_10.setGeometry(QtCore.QRect(5, 75, 315, 61))
        self.label_10.setStyleSheet("font: 75 14pt \"Averia Sans\";")
        self.label_10.setLineWidth(1)
        self.label_10.setMidLineWidth(1)
        self.label_10.setObjectName("label_10")
        self.label_10.setHidden(True)

        self.label_11 = QtWidgets.QLabel(self.centralwidget)
        self.label_11.setGeometry(QtCore.QRect(5, 5, 390, 20))
        self.label_11.setStyleSheet("font: 75 14pt \"Averia Sans\";")
        self.label_11.setLineWidth(1)
        self.label_11.setMidLineWidth(1)
        self.label_11.setObjectName("label_10")
        self.label_11.setHidden(True)

        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(30, 40, 241, 21))
        self.lineEdit.setObjectName("lineEdit")

        self.label_7.setHidden(True)
        self.label_8.setHidden(True)
        self.label_9.setHidden(True)
        self.lineEdit.setHidden(True)

        self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_4.clicked.connect(self.Submit)
        self.pushButton_4.setGeometry(QtCore.QRect(50, 480, 231, 51))

        self.pushButton_4.setStyleSheet("background-color:        rgb(247, 234, 98);\n"
                                        "font: 87 22pt \"Segoe UI Black\";\n"
                                        "border-color: rgb(255, 251, 254);\n"
                                        "\n"
                                        "color: rgb(39, 140, 176);\n"
                                        "")
        self.pushButton_4.setHidden(True)

        self.pushButton_5 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_5.clicked.connect(self.Restart)
        self.pushButton_5.setGeometry(QtCore.QRect(50, 510, 231, 51))

        self.pushButton_5.setStyleSheet("background-color:        rgb(247, 200, 98);\n"
                                        "font: 87 22pt \"Segoe UI Black\";\n"
                                        "border-color: rgb(255, 251, 254);\n"
                                        "\n"
                                        "color: rgb(39, 140, 176);\n"
                                        "")
        self.pushButton_5.setHidden(True)

        self.Drawlabel = QtWidgets.QLabel()
        canvas = QtGui.QPixmap(400, 300)
        self.Drawlabel.setPixmap(canvas)
        self.Drawlabel.setHidden(True)
        self.Drawlabel.resize(250, 400)
        self.Drawlabel.move(300, 0)

        self.last_x, self.last_y = None, None

        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(280, 270, 231, 51))
        self.pushButton_2.setStyleSheet("background-color:     rgb(253, 101, 101);\n"
"font: 87 22pt \"Segoe UI Black\";\n"
"border-color: rgb(255, 251, 254);\n"
"\n"
"color: rgb(39, 140, 176);\n"
"")

        self.pushButton_2.setObjectName("pushButton_2")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(0, 110, 801, 61))
        self.label_2.setStyleSheet("font: 75 14pt \"Averia Sans\";")
        self.label_2.setLineWidth(1)
        self.label_2.setMidLineWidth(1)
        self.label_2.setObjectName("label_2")
        self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_3.clicked.connect(QCoreApplication.instance().quit)
        self.pushButton.clicked.connect(self.clickme)
        self.pushButton_3.setGeometry(QtCore.QRect(280, 350, 231, 51))

        self.pushButton_3.setStyleSheet("background-color:        rgb(100, 252, 128);\n"
"font: 87 22pt \"Segoe UI Black\";\n"
"border-color: rgb(255, 251, 254);\n"
"\n"
"color: rgb(39, 140, 176);\n"
"")


        self.pushButton_3.setObjectName("pushButton_3")
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

#Malen


    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label.setText(_translate("MainWindow", "<html><head/><body><p align=\"center\"><span style=\" font-size:26pt; color:#000000;\">Welcome to SignMemory!</span></p></body></html>"))
        self.pushButton.setText(_translate("MainWindow", "Singleplayer"))
        self.pushButton_2.setText(_translate("MainWindow", "Multiplayer"))
        self.label_2.setText(_translate("MainWindow", "<html><head/><body><p align=\"center\"><span style=\" font-size:14pt; color:#000000;\">To start choose a gamemode!</span></p></body></html>"))
        self.pushButton_3.setText(_translate("MainWindow", "Exit"))
        self.label_7.setText(_translate("MainWindow",
                                        "<html><head/><body><p align=\"center\"><span style=\" color:#000000;\">Enter the country name here:</span></p></body></html>"))

        self.label_8.setText(_translate("MainWindow",
                                    "<html><head/><body><p align=\"center\"><span style=\" color:#000000;\">Draw here</span></p></body></html>"))
        self.label_9.setText(_translate("MainWindow",
                                        "<html><head/><body><p><span style=\" font-family:\'arial,sans-serif\'; font-size:16px; font-weight:400; color:#202124; background-color:#ffffff;\">|</span></p><p><span style=\" font-family:\'arial,sans-serif\'; font-size:16px; font-weight:400; color:#202124; background-color:#ffffff;\">|</span></p><p><span style=\" font-family:\'arial,sans-serif\'; font-size:16px; font-weight:400; color:#202124; background-color:#ffffff;\">|</span></p><p><span style=\" font-family:\'arial,sans-serif\'; font-size:16px; font-weight:400; color:#202124; background-color:#ffffff;\">|</span></p><p><span style=\" font-family:\'arial,sans-serif\'; font-size:16px; font-weight:400; color:#202124; background-color:#ffffff;\">|</span></p><p><span style=\" font-family:\'arial,sans-serif\'; font-size:16px; font-weight:400; color:#202124; background-color:#ffffff;\">|</span></p><p><span style=\" font-family:\'arial,sans-serif\'; font-size:16px; font-weight:400; color:#202124; background-color:#ffffff;\">|</span></p><p><span style=\" font-family:\'arial,sans-serif\'; font-size:16px; font-weight:400; color:#202124; background-color:#ffffff;\">|</span></p><p><span style=\" font-family:\'arial,sans-serif\'; font-size:16px; font-weight:400; color:#202124; background-color:#ffffff;\">|</span></p><p><span style=\" font-family:\'arial,sans-serif\'; font-size:16px; font-weight:400; color:#202124; background-color:#ffffff;\">|</span></p><p><span style=\" font-family:\'arial,sans-serif\'; font-size:16px; font-weight:400; color:#202124; background-color:#ffffff;\">|</span></p><p><span style=\" font-family:\'arial,sans-serif\'; font-size:16px; font-weight:400; color:#202124; background-color:#ffffff;\">|</span></p><p><span style=\" font-family:\'arial,sans-serif\'; font-size:16px; color:#202124; background-color:#ffffff;\">|</span></p><p><span style=\" font-family:\'arial,sans-serif\'; font-size:16px; color:#202124; background-color:#ffffff;\">|</span></p><p><span style=\" font-family:\'arial,sans-serif\'; font-size:16px; color:#202124; background-color:#ffffff;\">|</span></p><p><span style=\" font-family:\'arial,sans-serif\'; font-size:16px; color:#202124; background-color:#ffffff;\">|</span></p><p><span style=\" font-family:\'arial,sans-serif\'; font-size:16px; color:#202124; background-color:#ffffff;\">|</span></p><p><span style=\" font-family:\'arial,sans-serif\'; font-size:16px; color:#202124; background-color:#ffffff;\">|</span></p><p><span style=\" font-family:\'arial,sans-serif\'; font-size:16px; color:#202124; background-color:#ffffff;\">|</span></p><p><span style=\" font-family:\'arial,sans-serif\'; font-size:16px; color:#202124; background-color:#ffffff;\">|</span></p><p><span style=\" font-family:\'arial,sans-serif\'; font-size:16px; color:#202124; background-color:#ffffff;\">|</span></p><p><span style=\" font-family:\'arial,sans-serif\'; font-size:16px; color:#202124; background-color:#ffffff;\">|</span></p><p><span style=\" font-family:\'arial,sans-serif\'; font-size:16px; color:#202124; background-color:#ffffff;\">|</span></p><p><span style=\" font-family:\'arial,sans-serif\'; font-size:16px; color:#202124; background-color:#ffffff;\">|</span></p><p><span style=\" font-family:\'arial,sans-serif\'; font-size:16px; color:#202124; background-color:#ffffff;\">|</span></p><p><br/></p><p><span style=\" font-family:\'arial,sans-serif\'; font-size:16px; font-weight:400; color:#202124; background-color:#ffffff;\">|</span></p><p><span style=\" font-family:\'arial,sans-serif\'; font-size:16px; font-weight:400; color:#202124; background-color:#ffffff;\">|</span></p></body></html>"))
        self.label_10.setText(_translate("MainWindow",
                                        "<html><head/><body><p align=\"center\"><span style=\" color:#000000;\">In english please!</span></p></body></html>"))
        self.pushButton_4.setText(_translate("MainWindow", "Submit"))

        self.pushButton_5.setText(_translate("MainWindow", "Back to Menu"))

        self.label_11.setText(_translate("MainWindow",
                                        "<html><head/><body><p align=\"center\"><span style=\" color:#000000;\">false</span></p></body></html>"))


    def Restart(self):
        self.label.setHidden(False)
        self.label_2.setHidden(False)
        self.pushButton.setHidden(False)
        self.pushButton_2.setHidden(False)
        self.pushButton_3.setHidden(False)
        self.Drawlabel.clear()

        self.label_11.setHidden(True)
        self.pushButton_5.setHidden(True)
        self.labelB.setHidden(True)
        self.Drawlabel.setHidden(True)

    def clickme(self):
        self.label.setHidden(True)
        self.label_2.setHidden(True)
        self.pushButton.setHidden(True)
        self.pushButton_2.setHidden(True)
        self.pushButton_3.setHidden(True)

        all_pngs = glob.glob("Umrisse/*.png")
        self.RandomPng1 = random.choice(all_pngs)

        self.labelB = QtWidgets.QLabel(MainWindow)
        self.labelB.setPixmap(QtGui.QPixmap(self.RandomPng1
                                            ))
        self.labelB.move(200, 0)
        self.labelB.resize(600, 600)


        self.labelB.show()

        sec = 20
        while sec > 0:

         loop = QEventLoop()
         QTimer.singleShot(1000, loop.quit)
         loop.exec_()
         sec -= 1

        if sec == 0:
         self.labelB.setHidden(True)
         self.label_7.setHidden(False)
         self.label_8.setHidden(False)
         self.label_9.setHidden(False)
         self.lineEdit.setHidden(False)
         self.pushButton_4.setHidden(False)
         self.label_10.setHidden(False)
         self.Drawlabel.setHidden(False)

        self.image.move(60, 100)

        sec2 = 60

        while sec2 > 0:
         loop = QEventLoop()
         QTimer.singleShot(1000, loop.quit)
         loop.exec_()
         sec2 -= 1
         print(sec2)

        if sec2 == 0:


            self.pushButton_4.setHidden(True)
            self.label_7.setHidden(True)
            self.label_8.setHidden(True)
            self.label_9.setHidden(True)
            self.lineEdit.setHidden(True)
            self.label_10.setHidden(True)
            self.Drawlabel.setHidden(True)

            finish = self.lineEdit.text()
            add = "Umrisse\\"
            finish2 = add + finish + '.png'
            self.falseorright = 'false'

            if finish2 == self.RandomPng1:
                self.label_11.setText("You named it right, here's your picture:)")
            else:
                self.label_11.setText('You named it wrong, but here is your picture :(')

            self.TheEnde()


    def Submit(self):

            self.pushButton_4.setHidden(True)
            self.label_7.setHidden(True)
            self.label_8.setHidden(True)
            self.label_9.setHidden(True)
            self.lineEdit.setHidden(True)
            self.label_10.setHidden(True)

            finish = self.lineEdit.text()
            add = "Umrisse\\"
            finish2 = add + finish + '.png'
            self.falseorright = 'false'

            if finish2 == self.RandomPng1:
                self.label_11.setText("You named it right, here's your picture:)")
            else:
                self.label_11.setText('You named it wrong, but here is your picture :(')

            #Malen deaktiveren

            self.TheEnde()


    def TheEnde(self):
        print("Started")
        self.label_11.setHidden(False)
        self.pushButton_5.setHidden(False)
        self.lineEdit.clear()
        self.labelB.setHidden(False)
        self.labelB.move(10, 75)
        self.labelB.resize(350, 400)
        self.Drawlabel.setHidden(False)
        self.Drawlabel.move(360, 75)
        self.Drawlabel.resize(350, 400)
        #Gemaltes so wie Zeile 293-295 hinzufügen und moven


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())


__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das sieht aber sehr nach dem generierten Code des UI-Designers aus, den du einfach manipuliert hast. Das macht man nicht, weil man damit die Moeglichkeit verliert, weiter an dem Code zu arbeiten und gleichzeitig das Design mal zu aendern. Stattdessen laedt man die ui-Datei mit loadUI.

Dann ist deine ganze Timing-Geschichte so sehr unuebersichtlich und auch schlicht schlecht geloest. Man baut keine solchen Event-Loops ein. Das funktioniert zwar in Qt, aber es macht riesen Probleme, weil es sich nicht vertraegt mit einem anderen Programmteil, der das genauso machen will. Dann ist naemlich ploetzlich ein anderer Loop eingeschoben, und alles zerfaellt.

Man berechnet auch keine Zeiten durch Subtraktion. Sondern man merkt sich, wann man mit etwas begonnen hat, und wenn man prueft, ob etwas weitergeht, dann berechnet man die Wanduhr-Differenz. Also zB beides mit time.monotonic(). Denn es ist nicht garantiert, dass die Wartezeit immer 1 Sekunde ist!

Aber du benutzt ja schon QTimer, und das ist auch die Loesung fuer die beiden Probleme: statt dieses absurden Konstrukts mit loop.quit setzt du einen QTimer mit einem slot "next_step", natuerlich mit einem bessern Namen. Und der feuert einfach nach 20 Sekunden.

Die Variable falseorright sieht definitiv falsch aus. Einen String "false" zu benutzen, statt dem richtigen False, ist immer ein Fehler. Und der Name ist total nichtssagend. Eine boolsche Variable ist immer False oder True (right..). Wozu wird dieser Wert sich gemerkt? So sollte die Variable heissen. ZB richtig_geraten oder aehnliches.

Zu deiner eigentlichen Frage: die offizielle Qt Dokumentation enthaelt das Scribble-Example: https://doc.qt.io/qt-5/qtwidgets-widget ... ample.html - das wurde hier uebersetzt: https://github.com/baoboa/pyqt5/blob/ma ... cribble.py
Antworten