Найти - Пользователи
Полная версия: Отрисовка в PyQt4 работает после того, как окно становится неактивным
Начало » GUI » Отрисовка в PyQt4 работает после того, как окно становится неактивным
1
kostya74
Здравствуйте, собственно вопрос в заголовке темы. paintEvent рисует в зависимости от значений в листе. Лист изменяется, и хотелось бы новый рисунок получить. И я его получаю, но как только щёлкаю на другое окно или рабочий стол(в общем как только оно становится неактивным).
import sys
from PyQt4 import QtGui, QtCore, uic
import random
class Window(QtGui.QWidget):
    def __init__(self, parent=None):
        super(Window, self).__init__()
        QtGui.QWidget.__init__(self, parent)
        QtGui.QMainWindow.__init__(self)
    def paintEvent(self, event):
        paint = QtGui.QPainter(self)
        pen = QtGui.QPen(QtCore.Qt.black, 1, QtCore.Qt.SolidLine)
        paint.setPen(pen)
        for i in range(len(field)+1):
            paint.drawLine(150, (i+1)*24+10, 540, (i+1)*24+10)
        for i in range(len(field[0])+1):
            paint.drawLine((i+1)*30+120, 34, (i+1)*30+120, 562)
        color = QtGui.QColor(0, 0, 0)
        color.setNamedColor('#d4d4d4')
        paint.setPen(color)
        paint.setBrush(QtGui.QColor(255, 0, 0, 100))
        self.drawrectangles(paint)
        paint.end()
    def drawrectangles(self, paint):
        for i in range(len(field)):
            for j in range(len(field[i])):
                if field[i][j] == 1:
                    paint.drawRect((j+1)*30+122, (i+1)*24+12, 26, 20)
app = QtGui.QApplication(sys.argv)
wd = Window()
wd.show()  
sys.exit(app.exec_())

это кусок кода, лишнее убрал, что никак не может влиять.
Заранее спасибо за помощь!
Rodegast
> это кусок кода, лишнее убрал, что никак не может влиять.

Этот кусок кода как раз правильно работает. Выкладывай “всё лишнее”.
kostya74
Хорошо, вот весь код
import sys
from PyQt4 import QtGui, QtCore, uic
import random
field = [[1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1],[0,1,0,1,0,1,0,1,0,1,0,1,0],[0,1,0,1,0,1,0,1,0,1,0,1,0],[0,1,0,1,0,1,0,1,0,1,0,1,0],[0,1,0,1,0,1,0,1,0,1,0,1,0],[0,1,0,1,0,1,0,1,0,1,0,1,0],[0,1,0,1,0,1,0,1,0,1,0,1,0],[0,1,0,1,0,1,0,1,0,1,0,1,0],[0,1,0,1,0,1,0,1,0,1,0,1,0],[0,1,0,1,0,1,0,1,0,1,0,1,0],[0,1,0,1,0,1,0,1,0,1,0,1,0],[0,1,0,1,0,1,0,1,0,1,0,1,0],[0,1,0,1,0,1,0,1,0,1,0,1,0],[0,1,0,1,0,1,0,1,0,1,0,1,0],[0,1,0,1,0,1,0,1,0,1,0,1,0],[0,1,0,1,0,1,0,1,0,1,0,1,0],[0,1,0,1,0,1,0,1,0,1,0,1,0],[0,1,0,1,0,1,0,1,0,1,0,1,0],[0,1,0,1,0,1,0,1,0,1,0,1,0],[0,1,0,1,0,1,0,1,0,1,0,1,0]]
class Window(QtGui.QWidget):
    def __init__(self, parent=None):
        super(Window, self).__init__()
        QtGui.QWidget.__init__(self, parent)
        QtGui.QMainWindow.__init__(self)
        self.setGeometry(300, 100, 250, 150)
        self.setFixedHeight(600)
        self.setFixedWidth(600)
        self.center()
        self.setWindowTitle('Пентикс')
        self.setWindowIcon(QtGui.QIcon('ico.png'))
        label = QtGui.QLabel('Следующая фигура:', self)
        label.move(15, 10)
        Figure(self)
        Button(self)
    def drawall(self):
        for i in range(len(field)):
            for j in range(len(field[0])):
                field[i][j] = random.randint(0,1)
        return field
    def paintEvent(self, event):
        paint = QtGui.QPainter(self)
        pen = QtGui.QPen(QtCore.Qt.black, 1, QtCore.Qt.SolidLine)
        paint.setPen(pen)
        for i in range(len(field)+1):
            paint.drawLine(150, (i+1)*24+10, 540, (i+1)*24+10)
        for i in range(len(field[0])+1):
            paint.drawLine((i+1)*30+120, 34, (i+1)*30+120, 562)
        color = QtGui.QColor(0, 0, 0)
        color.setNamedColor('#d4d4d4')
        paint.setPen(color)
        paint.setBrush(QtGui.QColor(255, 0, 0, 100))
        self.drawrectangles(paint)
        paint.end()
    def drawrectangles(self, paint):
        for i in range(len(field)):
            for j in range(len(field[i])):
                if field[i][j] == 1:
                    paint.drawRect((j+1)*30+122, (i+1)*24+12, 26, 20)
    def center(self):
        screen = QtGui.QDesktopWidget().screenGeometry()
        size = self.geometry()
        self.move((screen.width()-size.width())/2, (screen.height()-size.height())/2)
class Figure(QtGui.QWidget):
    def __init__(self, parent):
        QtGui.QWidget.__init__(self, parent)
class Button(QtGui.QWidget):
    def __init__(self, parent):
        QtGui.QWidget.__init__(self, parent)
        quit = QtGui.QPushButton('Выход', self)
        quit.setGeometry(10, 550, 70, 35)
        self.connect(quit, QtCore.SIGNAL('clicked()'),
            QtGui.qApp, QtCore.SLOT('quit()'))
        pause = QtGui.QPushButton('Пауза', self)
        pause.setGeometry(10,500,70,35)
        self.connect(pause, QtCore.SIGNAL("clicked()"),
            self.pause)
        newGame = QtGui.QPushButton('Новая игра', self)
        newGame.setGeometry(10,450,70,35)
        self.connect(newGame, QtCore.SIGNAL("clicked()"),
            self.newGame)
    def pause(self):
        print('пауза')
        Window().drawall()
    def newGame(self):
        print('Новая игра')
        
app = QtGui.QApplication(sys.argv)
wd = Window()
wd.show()  
sys.exit(app.exec_())
Rodegast
paintEvent срабатывает когда метод update дёргают. Дёргай его по таймеру и всё будет работать:

self.timer = QtCore.QTimer(self)
self.connect(self.timer, QtCore.SIGNAL("timeout()"), self.update)
self.timer.start(100)
kostya74
Rodegast, спаcибо, всё заработало)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB