Форум сайта python.su
Суть - нужно, чтобы одно изображение постоянно двигалось по случайно-заданной траектории и, в тоже время, пользователь мог использовать кнопки, перемещающие другие изображения по клику.
Набросал, а дальше не знаю, куда сунуться. Не получается даже просто переместить изображение, чтобы экран не завис. (с помощью 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_())
Офлайн
Во-первых то, что находится в 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_())
Офлайн
Не хотелось бы создавать новую тему:
Как вывести анимированное изображение из спрайтов одного png файла?
В примерах для Qt этого нет, да и в google предпочитают пользоваться готовыми gif.
Офлайн
Примерно так:
# -*- 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_())
Отредактировано reclosedev (Сен. 28, 2012 09:05:02)
Офлайн