В вашем коде qp
не существует в области действия makeline
.
Создание нового, такого как вы, не поможет по двум причинам:
- вы пытаетесь рисовать в классе, но QPainter может быть запущен только на экземпляре ;
- рисование должно работать на экземпляре QPainter, созданном в
paintEvent
и на виджет и запуск рисователя на виджете может только произойти в рамках paintEvent;
Просто добавьте художник в качестве параметра к функции makeline
, затем вызовите его с аргументом Painter.
class line():
def makeline(<b>qp</b>):
qp.drawLine(250,250,350,300)
class ShapeDrawer(QWidget):
# ...
def paintEvent(self, event):
qp = QPainter()
qp.begin(self)
line.makeline(<b>qp</b>)
qp.end()
Обратите внимание, что определение нового класса, который выполняет только то, что вы показываете, почти бесполезно, если только вы не хотите использовать общий объект, который сохраняет «набор» функций, так что вы можете просто поместить функцию в основной отступ.
Кроме того, даже в случае использования этого класса в качестве «коллекции», технически вы выполняете метод stati c (но вы не сделал так); если вы попытаетесь создать экземпляр, вы не сможете его вызвать. Давайте проверим это, используя makeline
на экземпляре test
:
test = line()
# ...
class ShapeDrawer(QWidget):
# ...
def paintEvent(self, event):
qp = QPainter()
qp.begin(self)
<b>test</b>.makeline(qp)
Это приведет к следующей ошибке:
TypeError: makeline() takes exactly 1 argument (2 given)
И это потому, что метод экземпляра всегда имеет Экземпляр класса (обычно называемый «self») в качестве первого аргумента.
Итак, вы либо добавляете декоратор метода stati c:
class line():
<b>@staticmethod</b>
def makeline(qp):
qp.drawLine(250,250,350,300)
, либо добавляете self
к нему:
class line():
def makeline(<b>self</b>, qp):
qp.drawLine(250,250,350,300)
Также помните, что распространено (и настоятельно рекомендуется) соглашение использовать заглавные имена для классов и строчные буквы только для функций и переменных (подробнее об этом в Руководство по стилю для Python Код , он же PEP 8).
Наконец, обратите внимание, что вы можете создать экземпляр QPainter непосредственно с объектом, на котором рисование будет использоваться в качестве первого аргумента, и если вы используете рисовальщик в paintEvent завершение не требуется, так как это произойдет автоматически, как только будет возвращено paintEvent:
def paintEvent(self, event):
qp = QPainter(self)
line.makeline(qp)