使用QPainter绘制子手

问题描述 投票:0回答:1

我使用的是python,对PyQt来说是新手(对python也很新)。我想创建一个基本的子手游戏,我想出了所有控件,只是当按下错误的字母时我不知道如何绘制头部,身体等。我尝试过以某种方式使用QPainter,但是它无法正常工作,而且经过研究,有人说我必须使用之前从未听说过的QPix映射,所以我有些困惑。这是代码的主要部分(我跳过了为字母配置按钮的操作):

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QInputDialog, QWidget
from PyQt5.QtGui import QPainter, QBrush, QPen
from PyQt5.QtCore import Qt
import re

allowed = re.compile('[a-zA-Z ]')


class Ui_MainWindow(object):
    answer = [] #list of correct charcters they have inputted
    required = '' #string containing the solution
    indicies = {} #indicies mapping the index of each correct character in solution to the actual character
    wrong_count = 0

    def setupUi(self, MainWindow):
        ### sets up all the buttons for letters of the alphabet, lines, etc. I have this figured out.
        self.newgame = QtWidgets.QPushButton(self.centralwidget)
        self.newgame.setGeometry(QtCore.QRect(800, 290, 231, 51))
        font = QtGui.QFont()
        font.setPointSize(20)
        self.newgame.setFont(font)
        self.newgame.setObjectName("newgame")
        self.newgame.setText('New game')
        self.newgame.clicked.connect(self.restart)
        self.newgame.hide()

        self.start = QtWidgets.QPushButton(self.centralwidget)
        self.start.setGeometry(QtCore.QRect(480, 380, 231, 51))
        font = QtGui.QFont()
        font.setPointSize(20)
        self.start.setFont(font)
        self.start.setObjectName("start")
        self.start.setText("Begin")
        self.start.clicked.connect(self.get_name)

        self.answerbox = QtWidgets.QLabel(self.centralwidget)
        self.answerbox.setGeometry(QtCore.QRect(340, 480, 601, 91))
        font = QtGui.QFont()
        font.setPointSize(28)
        self.answerbox.setFont(font)
        self.answerbox.setText("")
        self.answerbox.setObjectName("answerbox")

        self.win = QtWidgets.QLabel(self.centralwidget)
        self.win.setGeometry(QtCore.QRect(340, 400, 601, 91))
        font = QtGui.QFont()
        font.setPointSize(28)
        self.win.setFont(font)
        self.win.setText("")
        self.win.setObjectName("win")

        self.wrongtext = QtWidgets.QLabel(self.centralwidget)
        self.wrongtext.setGeometry(QtCore.QRect(340, 500, 601, 91))
        font = QtGui.QFont()
        font.setPointSize(28)
        self.wrongtext.setFont(font)
        self.wrongtext.setText("Sorry, please type a valid string, without any special characters")
        self.wrongtext.adjustSize()
        self.wrongtext.setObjectName("wrongtext")
        self.wrongtext.hide()

        self.lost = QtWidgets.QLabel(self.centralwidget)
        self.lost.setGeometry(QtCore.QRect(340, 500, 601, 91))
        font = QtGui.QFont()
        font.setPointSize(28)
        self.lost.setFont(font)
        self.lost.setText("Sorry, you lost")
        self.lost.adjustSize()
        self.lost.setObjectName("lost")
        self.lost.hide()

    def get_name(self):
        text = App().text ##prompts user input for word
        if text == '':
            return
        elif allowed.match(text):
            Ui_MainWindow.required = text
            self.answerbox.setText('_ '*len(text))
            self.wrongtext.hide()
            self.check_space(text)
            self.answerbox.adjustSize()
            self.start.hide()
        else:
            self.wrongtext.show()


    def check_space(self, text):
        list1 = list(text)
        for ch in list1:
            if ch == ' ':
                self.revealer(ch)
                Ui_MainWindow.answer.append(ch)

    def clicked(self, ans): ### connected to letter buttons
        if ans.lower() in Ui_MainWindow.required:
            for _ in range(Ui_MainWindow.required.count(ans.lower())):
                Ui_MainWindow.answer.append(ans.lower())
            self.revealer(ans.lower())
            self.checker()
        else:
            Ui_MainWindow.wrong_count += 1
            self.paintEvent()

    def paintEvent(self): ##### this is what doesn't work but I want it to be something like this
        if Ui_MainWindow.wrong_count == 1: ### face
            painter = QPainter(self)
            painter.setPen(QPen(Qt.black, 10, Qt.SolidLine))
            painter.drawEllipse(250, 320, 20, 20)
            return
        if Ui_MainWindow.wrong_count == 2: ### body
            painter = QPainter(self)
            painter.begin(self)
            painter.setRenderHint(QPainter.Antialiasing)
            painter.setPen(QtCore.Qt.black)
            painter.setBrush(QtCore.Qt.black)
            painter.drawLine(250, 340, 250, 360)
            return
        if Ui_MainWindow.wrong_count == 3: ###legs
            painter = QPainter(self)
            painter.begin(self)
            painter.setRenderHint(QPainter.Antialiasing)
            painter.setPen(QtCore.Qt.black)
            painter.setBrush(QtCore.Qt.black)
            painter.drawLine(250, 360, 260, 370)
            return
        if Ui_MainWindow.wrong_count == 4:
            painter = QPainter(self)
            painter.begin(self)
            painter.setRenderHint(QPainter.Antialiasing)
            painter.setPen(QtCore.Qt.black)
            painter.setBrush(QtCore.Qt.black)
            painter.drawLine(250, 360, 240, 370)
            return
        if Ui_MainWindow.wrong_count == 5: ####arms
            painter = QPainter(self)
            painter.begin(self)
            painter.setRenderHint(QPainter.Antialiasing)
            painter.setPen(QtCore.Qt.black)
            painter.setBrush(QtCore.Qt.black)
            painter.drawLine(250, 350, 260, 340)
            return
        if Ui_MainWindow.wrong_count == 6:
            painter = QPainter(self)
            painter.begin(self)
            painter.setRenderHint(QPainter.Antialiasing)
            painter.setPen(QtCore.Qt.black)
            painter.setBrush(QtCore.Qt.black)
            painter.drawLine(250, 350, 240, 340)
            self.lost.show()
            self.newgame.show()


    def revealer(self, ans):
        index = Ui_MainWindow.required.index(ans) #find the index of a character from answer list in required list
        Ui_MainWindow.indicies[index*2] = ans #assigns index to the character, to be used for displayed
        try:
            while True: ##checks if clicked character appears multiple times in the answer string and appends all of them
                index = Ui_MainWindow.required.index(ans, index+1)
                Ui_MainWindow.indicies[index*2] = ans
        except:
            pass
        displayed = '_ '*len(Ui_MainWindow.required)
        temp_list = list(displayed)
        for index, ch in Ui_MainWindow.indicies.items():
            temp_list[index] = ch
        str2 = ''
        displayed = str2.join(temp_list)
        self.answerbox.setText(displayed)

    def checker(self):
        if sorted(Ui_MainWindow.answer) == sorted(list(Ui_MainWindow.required)):
            self.win.setText("You won!")
            self.newgame.show()
    def restart(self):
        Ui_MainWindow.answer = []
        Ui_MainWindow.required = ''
        Ui_MainWindow.indicies = {}
        Ui_MainWindow.wrong_count = 1
        self.win.setText("")
        self.answerbox.setText("")
        self.newgame.hide()
        self.lost.hide()
        self.start.show()

class App(QWidget):

    def __init__(self):
        super().__init__()
        self.title = 'PyQt5 input dialogs - pythonspot.com'
        self.initUI()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(380, 280, 640, 480)
        self.get_name()

    def get_name(self):
        text, ok = QInputDialog.getText(self, 'Text Input Dialog', 'Enter your word:')
        self.text = text
        if text and ok:
            return str(text)

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

抱歉,很长。基本上,当我运行它时,一切都会按照我想要的方式运行,除非我按错字母,否则什么也不会发生。它不会引发任何错误。我尝试仅单独使用QPainter来查看其工作原理,并使其绘制了圆,线等,但并没有按照我想要的方式逐一绘制。感谢您的阅读,我将不胜感激。抱歉,如果我的问题的布局不好,我昨天才开始使用此网站,所以还不熟悉它的工作原理。

python pyqt5 drawing qpainter
1个回答
0
投票

paintEvent应该是您的QMainWindow实例的一部分,而不是您用于设置ui的对象的一部分。实际上,Ui_MainWindow中的大多数方法实际上都属于您的MainWindow实例,因此解决此问题的最简单方法可能是使Ui_MainWindow成为QMainWindow的子类,即

© www.soinside.com 2019 - 2024. All rights reserved.