Сегодня расскажу как я делал бегущую строку на PyQt5 и Python 3.
На момент написания этого приложения я раздумывал как устроены компьютерные игры. Основная часть большинства графических игр это движение. А раз есть движение то есть таймер который отмеряет время для всего что происходит на экране. Мне это хотелось рассмотреть подробней, протестировать и в итоге родилось такое забавное приложение как бегущая строка. Благодаря ему я понял как работает таймер. Удалось закрепить такую тему как сигналы и слоты, а также узнавать какая кнопка нажата через метод sender.
Сначала рассмотрим импорты:
#!/usr/bin/python3 # -*- coding:utf-8 -*- import sys from PyQt5.QtWidgets import QWidget, QApplication, QLabel, QPushButton from PyQt5.QtCore import Qt, QTimer
QWidget - это базовый класс для всех объектов интерфейса пользователя в PyQt5
QApplication - каждое приложение написанное на PyQt5 должно создать объект приложения.
QLabel - текстовая метка.
QPushButton - позволяет создавать кнопки.
QTimer - таймер.
Само приложение содержит всего один класс.
Для начала рассмотрим ту часть в которой происходит инициализация интерфейса.
В приведенном ниже коде я постарался дать подробные коментарии:
class myApp(QWidget): def __init__(self): QWidget.__init__(self) self.init_ui() # вызов метода в котором задается интерфейс и начальные параметры def init_ui(self): self.speed = 10 # каждые 10 мс будет обновляться таймер self.timer = QTimer(self) # создаем таймер btn_left = QPushButton("влево", self) # создаем кнопку "влево" btn_right = QPushButton("вправо", self) # создаем кнопку "вправо" btn_stop = QPushButton("stop", self) # создаем кнопку "стоп" btn_left.move(10, 10) # абсолютное позиционирование: btn_right.move(350, 10) # задаем расположение кнопок btn_stop.move(180, 10) # надписей путем указания координат x, y self.x = 200 # начальные координаты self.y = 150 # бегущей строки self.setWindowTitle("бегущая строка") # задаем заголовок окна self.label = QLabel("бегущая строка", self) # создаем метку которая # содержит текст "бегущая строка" self.label.move(self.x, self.y) # устанавливаем бегущую строку # в координаты self.setGeometry(300, 300, 450, 300) # задаем размеры окна и его координаты btn_right.clicked.connect(self.buttonClicked) # подключаем сигнал кнопок btn_left.clicked.connect(self.buttonClicked) # clicked к методу btn_stop.clicked.connect(self.buttonClicked) # buttonClicked self.show() # отображает виджет
Если рассмотреть параметр self.speed, то если начать его уменьшать скорость бегущей строки будет увеличиватьсяи наоборот при увеличении этого параметра скорость бегущей строки будет замедляться.
Далее рассмотрим каждый метод по отдельности, сначала buttonClicked(self):
def buttonClicked(self): # метод обработки нажатых кнопок sender = self.sender() # создаем экземпляр sender if sender.text() == "вправо": # вызываем метод text() который возвратит надпись на # кнопке if self.timer.isActive(): # проверяем включен ли таймер self.timer.stop() # если включен - останавливаем self.timer.timeout.disconnect() # отсоединяем таймер от сигнала timeout self.timer.start(self.speed) # запускаем таймер со значением self.speed self.timer.timeout.connect(self.move_label_right) # подключаем событие # timeout к методу # self.move_label_right else: self.timer.start(self.speed) self.timer.timeout.connect(self.move_label_right) # ниже всё аналогично верхнему блоку кода elif sender.text() == "влево": if self.timer.isActive(): self.timer.stop() self.timer.timeout.disconnect() self.timer.start(self.speed) self.timer.timeout.connect(self.move_label_left) else: self.timer.start(self.speed) self.timer.timeout.connect(self.move_label_left) elif sender.text() == "stop": # если нажата кнопка стоп self.stop_move() # вызываем метод # self.stop_move()
Метод move_label_left(self) аналогичен методу move_label_right(self) рассмотрим на
примере move_label_left(self):
def move_label_left(self): if self.x == -100: # проверяем не вышла ли бегущая строка далеко влево за # пределы окна self.x = 500 # если вышла за пределы то устанавливаем исходную координату # self.x self.x = self.x - 0.5 # отнимаем от текущего значения координаты х 0.5 self.label.move(self.x, self.y) # передвигаем бегущую строку else: self.x = self.x - 0.5 self.label.move(self.x, self.y)
Далее привожу полностью весь код:
#!/usr/bin/python3 # -*- coding:utf-8 -*- import sys from PyQt5.QtWidgets import QWidget, QApplication, QLabel, QPushButton #from PyQt5.QtGui import QPainter, QColor, QPen, QBrush from PyQt5.QtCore import Qt, QTimer class myApp(QWidget): def __init__(self): QWidget.__init__(self) self.init_ui() def init_ui(self): self.speed = 10 self.timer = QTimer(self) btn_left = QPushButton("влево", self) btn_right = QPushButton("вправо", self) btn_stop = QPushButton("stop", self) btn_left.move(10, 10) btn_right.move(350, 10) btn_stop.move(180, 10) self.x = 200 self.y = 150 self.setWindowTitle("бегущая строка") self.label = QLabel("бегущая строка", self) self.label.move(self.x, self.y) self.setGeometry(300, 300, 450, 300) btn_right.clicked.connect(self.buttonClicked) btn_left.clicked.connect(self.buttonClicked) btn_stop.clicked.connect(self.buttonClicked) self.show() def buttonClicked(self): sender = self.sender() if sender.text() == "вправо": if self.timer.isActive(): self.timer.stop() self.timer.timeout.disconnect() self.timer.start(self.speed) self.timer.timeout.connect(self.move_label_right) else: self.timer.start(self.speed) self.timer.timeout.connect(self.move_label_right) elif sender.text() == "влево": if self.timer.isActive(): self.timer.stop() self.timer.timeout.disconnect() self.timer.start(self.speed) self.timer.timeout.connect(self.move_label_left) else: self.timer.start(self.speed) self.timer.timeout.connect(self.move_label_left) elif sender.text() == "stop": self.stop_move() def move_label_left(self): if self.x == -100: self.x = 500 self.x = self.x - 0.5 self.label.move(self.x, self.y) else: self.x = self.x - 0.5 self.label.move(self.x, self.y) def move_label_right(self): if self.x == 500: self.x = -100 self.x = self.x + 0.5 self.label.move(self.x, self.y) else: self.x = self.x + 0.5 self.label.move(self.x, self.y) def stop_move(self): if self.timer.isActive(): self.timer.stop() self.timer.timeout.disconnect() if __name__ == '__main__': app = QApplication(sys.argv) ex = myApp() sys.exit(app.exec_())
Всем спасибо за внимание. Если будут вопросы пишите.
Комментариев нет:
Отправить комментарий