Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » PyQt4 перемещение компонентов в реальном времени [RSS Feed]

#1 Сен. 27, 2012 04:12:03

Guljaca
От:
Зарегистрирован: 2011-07-11
Сообщения: 93
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt4 перемещение компонентов в реальном времени

Суть - нужно, чтобы одно изображение постоянно двигалось по случайно-заданной траектории и, в тоже время, пользователь мог использовать кнопки, перемещающие другие изображения по клику.

Набросал, а дальше не знаю, куда сунуться. Не получается даже просто переместить изображение, чтобы экран не завис. (с помощью time.sleep(0.1))

from PyQt4.QtGui import *
from PyQt4.QtCore import *
import sys, time
app = QApplication(sys.argv)
class Window(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        self.setMinimumSize(500,500)
        self.setMaximumSize(500,500)
        pal = self.palette()
        pal.setBrush(QPalette.Normal, QPalette.Window, QBrush(QPixmap('room.jpg')))
        self.setPalette(pal)
        self.imgxPos = 10
        self.imgyPos = 10
        self.label = QLabel()
        self.hbox = QHBoxLayout()
        self.txt = u'<TR><TD WIDTH=50 rowspan=4 ><img src=image Width=50 VSPACE=0 HSPACE=0</TD</TR>'
        self.label.setText(self.txt)
        self.hbox.addWidget(self.label)
        self.setLayout(self.hbox)
    def pos(self, xpos, ypos):
        self.label.move(xpos,ypos)
if __name__ == '__main__':
    window = Window()
    window.show()
    window.pos(10,10) #Тут использовался time.sleep(0.1)
    sys.exit(app.exec_())



Офлайн

#2 Сен. 27, 2012 07:12:02

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

PyQt4 перемещение компонентов в реальном времени

Во-первых то, что находится в Layout'е подвинуть нельзя.
Во-вторых, обновление не происходит потому что блокируется цикл обработки событий.

Для передвижения и анимаций есть несколько вариантов: таймеры, qt animation framework, или в цикле, с добавлением QApplication.processEvents() - чтобы ГУИ не замораживалась.
Первые два варианта загуглите, информации море.
Код с циклом:

# -*- coding: utf-8 -*-
import sys
import time
from PyQt4 import QtGui
 
 
class Window(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.resize(500, 500)
        self.label = QtGui.QLabel(self)
        self.label.setPixmap(QtGui.QPixmap('33.png'))
        self.label.move(10, 10)
        
    def move_label(self):
        for x in range(0, 500, 10):
            self.label.move(x, 10)
            QtGui.QApplication.processEvents()
            time.sleep(0.01)
 
 
if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.show()
    window.move_label()
    sys.exit(app.exec_())

Офлайн

#3 Сен. 27, 2012 15:10:00

Guljaca
От:
Зарегистрирован: 2011-07-11
Сообщения: 93
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt4 перемещение компонентов в реальном времени

Не хотелось бы создавать новую тему:
Как вывести анимированное изображение из спрайтов одного png файла?
В примерах для Qt этого нет, да и в google предпочитают пользоваться готовыми gif.



Офлайн

#4 Сен. 27, 2012 18:22:25

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

PyQt4 перемещение компонентов в реальном времени

Примерно так:

# -*- coding: utf-8 -*-
import sys
import time
 
from PyQt4 import QtGui, QtCore
 
 
class SpriteAnimation(object):
    def __init__(self, image_path, sprite_width, sprite_height, label):
        pixmap = QtGui.QPixmap(image_path)
        
        width, height = pixmap.width(), pixmap.height()
        self.pixmaps = []
        for x in range(0, width, sprite_width):
            for y in range(0, height, sprite_height):
                self.pixmaps.append(pixmap.copy(x, y, 
                                                sprite_width, sprite_height))
        self._current_frame = 0
        self.label = label
    
    def play(self, interval=100):
        self._timer = QtCore.QTimer(interval=interval,
                                    timeout=self._animation_step)
        self._timer.start()
    def _animation_step(self):
        self.label.setPixmap(self.pixmaps[self._current_frame])
        self.label.update()
        self._current_frame += 1
        if self._current_frame >= len(self.pixmaps):
            self._current_frame = 0
        
    
class Window(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.resize(100, 100)
        layout = QtGui.QVBoxLayout(self)
        label = QtGui.QLabel()
        layout.addWidget(label)
        # http://content.makeyourflashgame.com/pbe/tutorials/star-green.png
        self.animation = SpriteAnimation('star-green.png', 80, 80, label)
        self.animation.play()
 
 
if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())
Еще добавить опциональную нецикличность, остановку анимации, вывод не только на Label и т.п., и можно пользоваться.

upd: sprite_width, sprite_height перепутаны местами

Отредактировано reclosedev (Сен. 28, 2012 09:05:02)

Офлайн

  • Начало
  • » GUI
  • » PyQt4 перемещение компонентов в реальном времени[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version