воскресенье, 28 августа 2016 г.

RaspberryPi3&Вокруг

Купил Raspberry Pi 3 B и к нему дисплей 5inch HDMI LCD (B). Что бы полноценно подключить дисплей много мучился. Подключил, и вот итог. Из документации следует, что если у вас дисплей с последней версией микропрограммы 2.1, то драйверов никаких не надо, он будет работать сразу с raspberian
Jessie с сайта https://www.raspberrypi.org/downloads/raspbian/. В магазине onpad.ru членораздельно ответить на вопрос какая версия не смогли. Теперь я знаю: версия 2.1.

Итак, берем microSD 16 Gb и вставляем в ПК через ридер. 
Скачиваем файл с операционнкой raspberian Jessi, разархивируем ее. Получаем файл с расширением .img.
Скачиваем приложение Win32DiskImager. Оно бесплатное. Я скачал в файле .zip чтобы не устанавливать. Запускаем программу Win32DiskImager и выбираем файл с операционкой. Программа сама найдет карту microSD. Нажимаем клавишу write. После окончания карта готова для работы с Raspberry. Но стоп!

Если сейчас начать загружаться с этой карты, то экран на дисплее будет с большой полосой справа. Поэтому Найдите на карте файл config.txt и при помощи редактора добавьте в конец файла следующие строчки:
max_usb_current=1
hdmi_group=2
hdmi_mode=1
hdmi_mode=87
hdmi_cvt 800 480 60 6 0 0 0
Вот теперь можно собирать Малинку. После старта вы сразу попадаете в удобный графический экран. Мышкой сверху выбираете иконку сети. Она просит ввести пароль доступа к Интернету. Если у вас нет доступа к Интернету по Wi-Fi, то это не ко мне. Подключается сразу. Я купил Pi3, она умеет на борте встроенный Wi-Fi.

После этого надо обновить ваш по на диске и установить программу calibrator для работы touchscreen.
Так как вы по умолчанию работаете под пользователем Pi/rasberry, то команду от администратора запускаете после команды sudo. 

Мышкой открываем терминал и вводим команду
sudo apt-get update
а затем
sudo apt-get upgrade
Мы обновили систему, теперь надо установить пакет с программой калибратором экрана
sudo apt-get install -y xinput-calibrator
После этого в терминале запускаем программу калибратор.
sudo DISPLAY=:0.0 xinput_calibrator
В ответ на это на экране поочередно появятся 4 креста. Надо быстро нажать 
на них стилусом. Как результат, программа выведет стоки калибрации. Начинаются они строкой Section и заканчиваются EndSection. Внимание: не закрывайте окно терминала. Эти строки надо выделить и выбрать в буфер.

Откройте новое окно терминала. Теперь надо создать директорию под файл конфигурации калибровки экрана.
Вводим команду
sudo mkdir /etc/X11/xorg.conf.d
Теперь в этой директории надо создать файл
sudo nano /etc/X11/xorg.conf.d/99-calibration.conf
У вас появиться пустой экран редактора. Вставьте выбранные строки из программы калибратора. Чтобы сохранить введите команду Ctrl+O и ввод. Потом Ctrl+X для выхода.
Теперь введите команду
sudo reboot
для перезагрузки и вуаля! Вы можете без мышки использовать стилус. Один порт USB свободен!

Для нормального доступа к USB устройствами с NTFS, можно ввести команду
sudo apt-get install ntfs-3g
Теперь втыкаете в PI3 устройство и работаете с ним. Кстати, блок питания я купил на 2.5 ампера, чего и всем желаю.  




 
  

среда, 10 августа 2016 г.

События и сигналы в PyQt5

События и сигналы в PyQt5

События

Все GUI приложения основаны на обработке событий. В основном события создаются пользователем приложения. Но могут создаваться и другими источниками: например интернет соединением, управлением окон или таймером. Когда мы вызываем метод приложения exec_(), приложение запускает основную цикл. Основной цикл загружает события и посылает их к объектам.
В модели событий существует три участника:
  • событие источник
  • событие объект
  • событие цель
Событие источник это объект, чей статус изменился. Этот объект генерирует события. Объект событие(Это и есть событие) включает в себя изменение статуса в объекте источнике. Цель события это объект, который хочет быть модифицированным. Источник события делегирует задачу управления любым событием цели события.
У PyQt5 уникальный механизм работы с событиями — это сигналы (signal) и слоты (slot). Сигналы и слоты используются для связи между объектами. Сигнал выпускается когда конкретное событие возникает. Слотом может быть все, что можно вызвать на языке Python. Слот вызывается когда связанный с ним сигнал появляется.

Сигналы и слоты

Это простой пример демонстрирующий сигналы и слоты в PyQt5.

#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
ZetCode PyQt5 tutorial 

В этом примере мы связываем сигнал от QSlider к слоту в QLCDNumber. 

author: Jan Bodnar
website: zetcode.com 
last edited: January 2015
"""

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (QWidget, QLCDNumber, QSlider, 
    QVBoxLayout, QApplication)


class Example(QWidget):
    
    def __init__(self):
        super().__init__()
        
        self.initUI()
        
        
    def initUI(self):
        
        lcd = QLCDNumber(self)
        sld = QSlider(Qt.Horizontal, self)

        vbox = QVBoxLayout()
        vbox.addWidget(lcd)
        vbox.addWidget(sld)

        self.setLayout(vbox)
        sld.valueChanged.connect(lcd.display)
        
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Signal & slot')
        self.show()
        

if __name__ == '__main__':
    
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
В примере мы выводим на экран QtGui.QLCDNumber и QtGui.QSlider. Мы изменяем число lcd перетаскивая мышкой кнопку ползунка.
sld.valueChanged.connect(lcd.display)
Здесь мы соединяем сигнал valueChanged ползунка со слотом ИЗОБРАЖЕНИЯ числа lcd.
Тот кто посылает это объект, посылающий сигнал. Получатель, это объект получающий сигнал. Слот это метод, который реагирует на сигнал.
Signal & slot Figure: Signal & slot

Переписывание обработчика событий

События в PyQt5 часто обрабатывают переделывая обработку событий.

#!/usr/bin/python3

# -*- coding: utf-8 -*-

"""
ZetCode PyQt5 tutorial 

В этом примере мы переделываем обработку событий. 

author: Jan Bodnar
website: zetcode.com 
last edited: January 2015
"""

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QWidget, QApplication


class Example(QWidget):
    
    def __init__(self):
        super().__init__()
        
        self.initUI()
        
        
    def initUI(self):      
        
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Event handler')
        self.show()
        
        
    def keyPressEvent(self, e):
        
        if e.key() == Qt.Key_Escape:
            self.close()
        
        
if __name__ == '__main__':
    
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
В нашем примере мы переписываем обработчик нажатия клавиш keyPressEvent().
def keyPressEvent(self, e):
    
    if e.key() == Qt.Key_Escape:
        self.close()
Если мы нажимаем клавишу Escape, то приложение закрывается.

Посылающий событие

Иногда очень удобно знать какое виджет послал сигнал. Для этого, PyQt5 имеет метод sender().

#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
ZetCode PyQt5 tutorial 

В этом примере мы определяем объект посылающий событие.

author: Jan Bodnar
website: zetcode.com 
last edited: January 2015
"""

import sys
from PyQt5.QtWidgets import QMainWindow, QPushButton, QApplication


class Example(QMainWindow):
    
    def __init__(self):
        super().__init__()
        
        self.initUI()
        
        
    def initUI(self):      

        btn1 = QPushButton("Button 1", self)
        btn1.move(30, 50)

        btn2 = QPushButton("Button 2", self)
        btn2.move(150, 50)
      
        btn1.clicked.connect(self.buttonClicked)            
        btn2.clicked.connect(self.buttonClicked)
        
        self.statusBar()
        
        self.setGeometry(300, 300, 290, 150)
        self.setWindowTitle('Event sender')
        self.show()
        
        
    def buttonClicked(self):
      
        sender = self.sender()
        self.statusBar().showMessage(sender.text() + ' was pressed')
        
        
if __name__ == '__main__':
    
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
Мы имеем две кнопки. В методе buttonClicked() мы определяем какая кнопка была нажата при помощи метода sender().
btn1.clicked.connect(self.buttonClicked)            
btn2.clicked.connect(self.buttonClicked)
Обе кнопки присоединены к одному и тому же слоту.
def buttonClicked(self):
  
    sender = self.sender()
    self.statusBar().showMessage(sender.text() + ' was pressed')
Мы определили источник сигнала вызывая метод sender(). В строке состояния мы показали наименование нажатой кнопки.
Event sender Figure: Event sender

Создание сигналов

Объекты, порожденные от QObject могут порождать сигналы. В следующем примере мы увидим как мы можем создать пользовательский сигнал.

#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
ZetCode PyQt5 tutorial 

В этом примере мы покажем как создать сигнал. 

author: Jan Bodnar
website: zetcode.com 
last edited: January 2015
"""

import sys
from PyQt5.QtCore import pyqtSignal, QObject
from PyQt5.QtWidgets import QMainWindow, QApplication


class Communicate(QObject):
    
    closeApp = pyqtSignal() 
    

class Example(QMainWindow):
    
    def __init__(self):
        super().__init__()
        
        self.initUI()
        
        
    def initUI(self):      

        self.c = Communicate()
        self.c.closeApp.connect(self.close)       
        
        self.setGeometry(300, 300, 290, 150)
        self.setWindowTitle('Emit signal')
        self.show()
        
        
    def mousePressEvent(self, event):
        
        self.c.closeApp.emit()
        
        
if __name__ == '__main__':
    
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
Мы создали новый сигнал с именем closeApp. Этот сигнал инициируется во время события нажатия мыши. Этот сигнал связывается со слотом close() объекта QMainWindow.
class Communicate(QObject):
    
    closeApp = pyqtSignal()     
Сигнал создается методом pyqtSignal() как атрибут расширения класса Communicate. Этот метод принадлежит классу Qobject.
self.c = Communicate()
self.c.closeApp.connect(self.close) 
Пользовательский сигнал closeApp подключается к слоту close() сласса QMainWindow.
def mousePressEvent(self, event):
    
    self.c.closeApp.emit()
Когда мы нажимаем на окне мышкой, создается сигнал closeApp. Приложение заканчивается.

X-Plane 11, 12 - любитель, Фото любитель со стажем

Постоянные читатели

Архив блога