355 500 произведений, 25 200 авторов.

Электронная библиотека книг » Сергей Талипов » Программирование на Python3 с PyQt5 » Текст книги (страница 1)
Программирование на Python3 с PyQt5
  • Текст добавлен: 7 июня 2021, 15:01

Текст книги "Программирование на Python3 с PyQt5"


Автор книги: Сергей Талипов



сообщить о нарушении

Текущая страница: 1 (всего у книги 2 страниц)

Сергей Талипов
Программирование на Python3 с PyQt5

ЛЕКЦИЯ 1 – УСТАНОВКА PYTHON, БИБЛИОТЕК И IDE

1.1 Установка Python3


C:Python35

C:Python35Scripts

1.2 Установка в Python библиотек Qt5, Spyder3 и других модулей

pip install PyQt5

pip install PyQt5-tools

pip install spyder

pip install pyperclip

pip install requests

pip install html2text

pip install beautifulsoup4

pip install wget

pip install python-docx

pip install XlsxWriter

pip install openpyxl

pip install Pillow

pip install selenium

pip install wheel

pip install pyinstaller

pip install pypiwin32

pip install pywin32-ctypes



1.3 Запуск стандартной графической оболочки IDLE

IDLE.bat:

@start /b C:Python35pythonw.exe "C:Python35Libidlelibidle.pyw"


1.4 Запуск графической оболочки Spyder3

Spyder3.bat

@start /b C:Python35Scriptsspyder3.exe

1.5 Использование сторонней IDE PyCharm

JetBrains32.bat:

@start /b C:PyCharm2018binpycharm.exe

JetBrains64.bat:

@start /b C:PyCharm2018binpycharm64.exe


1.5.1 Настройка в PyCharm мастера для создания QtForm


 Form

 

  

   

    0

    0

    640

    480

   

  

  

   Form

  

 

 

 


1.5.2 Настройка для вызова внешнего редактора QtForm

C:Python35Libsite-packagespyqt5-toolsdesigner.exe

"$FilePath$"

$FileDir$


1.6 Компиляция в exe-файл

Чтобы перенести программу на другой компьютер, где не установлен Python, её нужно скомпилировать в .exe файл. Для этого есть несколько способов, и сегодня мы рассмотрим наиболее простой – библиотеку pyinstaller

Дадим в командной строке две команды:

pip install wheel

pip install pyinstaller

pip install pypiwin32

pip install pywin32-ctypes

Допустим, мы имеем .py файл под названием 1.py, который успешно запускается и работает в качестве скрипта Python. И теперь мы хотим сделать из него .exe файл, чтобы мы могли просто дать его другу, и не переживать об установке питона и модулей на другом компьютере.

Положим наш скрипт на диск D: далее откроем командную строку и введем следующие команды


D:

pyinstaller –onedir –onefile –name=myprogram "D:1.py" –paths C:Python35Libsite-packagesPyQt5Qtbin


Через некоторое время компиляция завершится и в подкаталоге dist появится EXE-шник

Некоторые ключи для компиляции:

–onefile – сборка в один файл, т.е. файлы .dll не пишутся

–windowed -при запуске приложения, будет появляться консоль

–noconsole – при запуске приложения, консоль появляться не будет

–icon=app.ico – добавляем иконку в окно

–paths – возможность вручную прописать путь к необходимым файлам, если pyinstaller

не может их найти (например: –paths C:Python35Libsite-packagesPyQt5Qtbin)


1.7 Если поломался Python и не работает pip, spyder3 или pyinstaller

cmd

python -m pip install pip==9.0.1

pip uninstall spyder

pip install spyder

pip uninstall pyinstaller

pip install pyinstaller


1.8 Установка PyQt5 в Linux

sudo apt-get install qt5-default

sudo apt-get install qtcreator


ЛЕКЦИЯ 2 – ОСНОВНЫЕ ТИПЫ ДАННЫХ, УСЛОВИЯ И ОПЕРАЦИИ

К неизменяемым (immutable) типам относятся: целые числа (int),  числа с плавающей точкой (float), комплексные числа (complex), логические переменные (bool), кортежи (tuple), строки (str) и неизменяемые множества (frozen set).

К изменяемым (mutable) типам относятся: списки (list), множества (set), словари (dict).

2.1 Числовые и строковые переменные

Целые числа могут быть любой длины, они ограничиваются лишь доступной памятью.

Числа с плавающей запятой имеют ограниченную точность. Визуально разницу между целым числом и числом с плавающей запятой можно заметить в консоли по наличию точки: 1 – целое число, 1.0 – с плавающей запятой.

Комплексные числа записываются в форме x+yj, где x – действительная часть числа, а y – мнимая: c = 1+2j

Мы можем преобразовывать значения из одного типа в другой с помощью таких функций, как int(), float(), str().

Строка представляет собой последовательность символов. Можно использовать одинарные или двойные кавычки для создания строки.

# Это комментарий

box1 = 15

box2 = 25

box3 = box1 + box2

print(box3)

s1 = 'Вам: '

s2 = ' лет'

name = input('Введите ваше имя: ')

age = input('Введите сколько вам лет: ')

name = 'Вас зовут: ' + name

age2 = s1 + age + s2

print(name)

print(age2)

b = 100 – int(age)

f = 100.5 – float(age)

print('Вам осталось жить где-то: ' + str(b))

print('А точнее где-то: ' + str(f))

40

Введите ваше имя: tsn

Введите сколько вам лет: 43

Вас зовут: tsn

Вам: 43 лет

Вам осталось жить где-то: 57

А точнее где-то: 57.5

Список использованных команд:

   • print('Какой то текст') – печатает текст;

   • print(a) – печатает значение переменной a (вместо a может быть любое имя переменной);

   • a=input('Пояснение что надо ввести') – ожидает от пользователя ввода какого то значения и помещает его в переменную с типом строка (вместо a может быть любое имя переменной);

   • int(a) – преобразовывает переменную типа строка в число (вместо a может быть любое имя переменной);

   • str(i) – преобразовывает переменную числового типа в строку (вместо i может быть любое имя переменной).

2.1.1 Встроенные функции

Язык Python включает много уже определенных, т. е. встроенных в него, функций. Программист не видит их определений, они скрыты в "недрах" языка. Достаточно знать, что эти функции принимают и что возвращают, то есть их интерфейс.

Ряд встроенных функций, касающихся ввода-вывода и типов данных, мы уже использовали. Это print(), input(), int(), float(), str(). Рассмотрим другие встроенные функции:

print(ord('z')) # Код символа: 122

print(ord('ф')) # 1092

print(chr(87)) # Символ по коду: W

print(chr(10045)) # ✽

print(len('abc')) # Длина строки: 3

print(abs(-2.2)) # Модуль числа: 2.2

a = 10 / 3 # Вещественное деление: 3.3333333333333335

b = 10 % 3 # Остаток от целочисленного деления: 1

c = 10 // 3 # Деление нацело. Целая часть при делении: 3

print(a) # 3.3333333333333335

print(b) # 1

print(c) # 3

print(round(a, 2)) # Округление для двух знаков: 3.33

print(round(a)) # Округление до целого числа: 3

print(«Number: %.2f» % a) # Number: 3.33

print(divmod(10, 3)) # Целая часть и остаток при целочисленном делении: (3, 1)

print(pow(2, 4)) # 2 в степени 4: 16

print(max(10, 12, 3)) # Макимальное число в списке: 12

print(min(10, 12, 3, 9)) # Манимальное число в списке: 3

print(sum((10, 12, 3, 10))) # Сумма чисел в списке: 35

2.1.2 Собственные функции

Иногда, набор каких-то повторяющихся команд нужно выполнять несколько раз. Такие блоки команд обычно выносят в отдельные кусочки программы. Именно из функций состоят внешние модули, которые можно подключать к программам. У функции могут быть входные параметры, называемые аргументами – это одна или несколько переменных, которые пишутся в скобках после имени функции. Также функция может возвращать одно или несколько значений с помощью команды return. Объявление функции начинается с ключевого слова def, далее следует имя функции, аргументы в скобках, и программный код отделённый четырьмя пробелами.

def pribavka(zarplata, avto):

    k = 0

    if (avto > 10):

        k = round((avto – 10) * 0.02 * zarplata)

    return k

a = int(input('Введите зарплату сотрудника: '))

b = int(input('Введите количество автомобилей проданных за месяц: '))

c = pribavka(a, b)

print('В этом месяце прибавка к зарплате составит: ' + str(c))

2.1.3 Функции математического модуля math

math.acos(X) – арккосинус X. В радианах

math.acosh(X) – вычисляет обратный гиперболический косинус

math.asin(X) – арксинус X. В радианах

math.asinh(X) – вычисляет обратный гиперболический синус

math.atan(X) – арктангенс X. В радианах

math.atan2(Y, X) – арктангенс Y/X. В радианах. С учетом четверти, в которой находится точка (X, Y)

math.atanh(X) – вычисляет обратный гиперболический тангенс

math.ceil(X) – округление до ближайшего большего числа

math.copysign(X, Y) – возвращает число, имеющее модуль такой же, как и у числа X, а знак – как у числа Y

math.cos(X) – косинус X (X указывается в радианах)

math.cosh(X) – вычисляет гиперболический косинус

math.degrees(X) – конвертирует радианы в градусы

math.e – e = 2,718281…

math.erf(X) – функция ошибок

math.erfc(X) – дополнительная функция ошибок (1 – math.erf(X))

math.exp(X) – eX

math.expm1(X) – eX – 1. При X → 0 точнее, чем math.exp(X)-1

math.fabs(X) – модуль X

math.factorial(X) – факториал числа X

math.floor(X) – округление вниз

math.fmod(X, Y) – остаток от деления X на Y

math.frexp(X) – возвращает мантиссу и экспоненту числа

math.fsum(последовательность) – сумма всех членов последовательности. Эквивалент встроенной функции sum(), но math.fsum() более точна для чисел с плавающей точкой

math.gamma(X) – гамма-функция X

math.hypot(X, Y) – вычисляет гипотенузу треугольника с катетами X и Y (math.sqrt(x * x + y * y))

math.isfinite(X) – является ли X числом

math.isinf(X) – является ли X бесконечностью

math.isnan(X) – является ли X NaN (Not a Number – не число)

math.ldexp(X, I) – X * 2i. Функция, обратная функции math.frexp()

math.lgamma(X) – натуральный логарифм гамма-функции X

math.log(X, [base]) – логарифм X по основанию base. Если base не указан, вычисляется натуральный логарифм

math.log10(X) – логарифм X по основанию 10

math.log1p(X) – натуральный логарифм (1 + X). При X → 0 точнее, чем math.log(1+X)

math.log2(X) – логарифм X по основанию 2

math.modf(X) – возвращает дробную и целую часть числа X. Оба числа имеют тот же знак, что и X

math.pi – pi = 3,1415926…

math.pow(X, Y) – XY

math.radians(X) – конвертирует градусы в радианы

math.sin(X) – синус X (X указывается в радианах)

math.sinh(X) – вычисляет гиперболический синус

math.sqrt(X) – квадратный корень из X

math.tan(X) – тангенс X (X указывается в радианах)

math.tanh(X) – вычисляет гиперболический тангенс

math.trunc(X) – усекает значение X до целого

import math

print(math.sin(22))

-0.008851309290403876


2.1.4 Функции и методы строк


S = 'str'; S = «str»; S = '''str'''; S = «„„str““»Литералы строк
S = «snptanbbb»Экранированные последовательности
S = r"C:tempnew"Неформатированные строки (подавляют экранирование)
S = b"byte"Строка байтов
S1 + S2Конкатенация (сложение строк)
S1 * 3Повторение строки
S[i]Обращение по индексу
S[i:j:step]Извлечение среза
len(S)Длина строки
S.find(str, [start],[end])Поиск подстроки в строке. Возвращает номер первого вхождения или -1
S.rfind(str, [start],[end])Поиск подстроки в строке. Возвращает номер последнего вхождения или -1
S.index(str, [start],[end])Поиск подстроки в строке. Возвращает номер первого вхождения или вызывает ValueError
S.rindex(str, [start],[end])Поиск подстроки в строке. Возвращает номер последнего вхождения или вызывает ValueError
S.replace(шаблон, замена)Замена шаблона
S.split(символ)Разбиение строки по разделителю
S.isdigit()Состоит ли строка из цифр
S.isalpha()Состоит ли строка из букв
S.isalnum()Состоит ли строка из цифр или букв
S.islower()Состоит ли строка из символов в нижнем регистре
S.isupper()Состоит ли строка из символов в верхнем регистре
S.isspace()Состоит ли строка из неотображаемых символов (пробел, символ перевода страницы ('f'), «новая строка» ('n'), «перевод каретки» ('r'), «горизонтальная табуляция» ('t') и «вертикальная табуляция» ('v'))
S.istitle()Начинаются ли слова в строке с заглавной буквы
S.upper()Преобразование строки к верхнему регистру
S.lower()Преобразование строки к нижнему регистру
S.startswith(str)Начинается ли строка S с шаблона str
S.endswith(str)Заканчивается ли строка S шаблоном str
S.join(список)Сборка строки из списка с разделителем S
ord(символ)Символ в его код ASCII
chr(число)Код ASCII в символ
S.capitalize()Переводит первый символ строки в верхний регистр, а все остальные в нижний
S.center(width, [fill])Возвращает отцентрованную строку, по краям которой стоит символ fill (пробел по умолчанию)
S.count(str, [start],[end])Возвращает количество непересекающихся вхождений подстроки в диапазоне [начало, конец] (0 и длина строки по умолчанию)
S.expandtabs([tabsize])Возвращает копию строки, в которой все символы табуляции заменяются одним или несколькими пробелами, в зависимости от текущего столбца. Если TabSize не указан, размер табуляции полагается равным 8 пробелам
S.lstrip([chars])Удаление пробельных символов в начале строки
S.rstrip([chars])Удаление пробельных символов в конце строки
S.strip([chars])Удаление пробельных символов в начале и в конце строки
S.partition(шаблон)Возвращает кортеж, содержащий часть перед первым шаблоном, сам шаблон, и часть после шаблона. Если шаблон не найден, возвращается кортеж, содержащий саму строку, а затем две пустых строки
S.rpartition(sep)Возвращает кортеж, содержащий часть перед последним шаблоном, сам шаблон, и часть после шаблона. Если шаблон не найден, возвращается кортеж, содержащий две пустых строки, а затем саму строку
S.swapcase()Переводит символы нижнего регистра в верхний, а верхнего – в нижний
S.title()Первую букву каждого слова переводит в верхний регистр, а все остальные в нижний
S.zfill(width)Делает длину строки не меньшей width, по необходимости заполняя первые символы нулями
S.ljust(width, fillchar=" ")Делает длину строки не меньшей width, по необходимости заполняя последние символы символом fillchar
S.rjust(width, fillchar=" ")Делает длину строки не меньшей width, по необходимости заполняя первые символы символом fillchar
S.format(*args, **kwargs)Форматирование строки



2.2 Условный оператор

sun = input('Введите 1 если погода солнечная, и 2 если пасмурная: ')

if sun == '1':

    d = 'Нужно загорать'

else:

    d = 'Загорать не выйдет'

print(d)

myname = input('Введите логин: ')

mypass = input('Введите пароль: ')

if ((myname == 'tsn') and (mypass == 'superpassword123')) or ((myname == 'boss') and (mypass == '777')):

    print('Привет, ' + myname + '. Добро пожаловать!')

else:

    print('Ты хто такой, тавай дасвидания…')

v = int(input('Введите сколько вам лет: '))

if (v < 18):

    print('Привет, юный кодер')

elif (v < 30):

    print('Здравствуйте, молодой человек')

elif (v < 65):

    print('Добрый день. Как семья, дети?')

elif (v < 100):

    print('Здорово, Михалыч. Пенсию уже дали?')

elif (v < 100000):

    print('Клан бессмертных приветствует тебя!')

Введите 1 если погода солнечная, и 2 если пасмурная: 1

Нужно загорать

Введите логин: tsn

Введите пароль: 123

Ты хто такой, тавай дасвидания…

Введите сколько вам лет: 43

Добрый день. Как семья, дети?



2.2.1 Пример решения квадратного уравнения с защищенными блоками

# Пример решения квадратного уравнения

import math # Подключение математического модуля

try: # Защищенный блок 1

    a = float(input("Введите A="))

    b = float(input("Введите B="))

    c = float(input("Введите C="))

    try: # Защищенный блок 2

        d = b * b – 4 * a * c

        x1 = (-b + math.sqrt(d)) / (2 * a)

        x2 = (-b – math.sqrt(d)) / (2 * a)

        print('d = ', d)

        print('x1 = ', round(x1, 2))

        print("x2 = " + format(x2, "#.2f"))

    except: # Обработчик ошибок для защищенного блока 1

        print("Нет решения!")

except: # Обработчик ошибок для защищенного блока 2

    print("Неверные входные данные!")

input("Нажмите Enter для выхода") # Задержка перед выходом из программы


Введите A=1

Введите B=2

Введите C=-33

d = 136.0

x1 = 4.83

x2 = -6.83

Нажмите Enter для выхода


2.2.2 Практический пример с условием

# Программа получает ввод чисел X A B, затем выводит значение Y согласно

# y = (10 * (x + a^2)) / (b + a) если x >= 4

# y = 5 * (x + a^2 + b) если x < 4

def main(): # основная функция

    # Получаем ввод X A B используя raw_input. Так как данный оператор всегда

    # возвращает тип str, преобразовываем его в int используя оператор int()

    # В питоне не обязательно объявлять переменные заранее, можно их объявлять

    # сразу же присваивая значение. Тип переменной интерпретатор определяет сам

    a = int(input('Введите A: '))

    b = int(input('Введите B: '))

    x = int(input('Введите X: '))

    if x >= 4:

        y = (10 * (x + a ** 2)) / (b + a)

    else:

        y = 5 * (x + a ** 2 + b)

    # В питоне ' и " равнозначны. Выводим результат на экран. %.1f выводит

    # значение типа float с точностью до одной десятой

    print("y = %.1f" % y)

# Следующее условие предотвращает запуск программы, если она была импортирована

# в качестве модуля (к примеру import lab1)

if __name__ == '__main__':

    main() # вызов основной функции


Введите A: 1

Введите B: 2

Введите X: 3

y = 30.0



2.3 Тернарный условный оператор

a = 10

b = 20

maximum = a if a > b else b

minimum = a if a < b else b

print(minimum, maximum)

10 20


ЛЕКЦИЯ 3 – ОСНОВНЫЕ КОМПОНЕНТЫ PYQT5

3.1 QWidget и QDialog

Окно


СвойствоНазначение
Имя окна
Доступность
Размеры окна, запрет изменения размера
Шрифт, размер шрифта
Вид курсора
Заголовок окна
Иконка окна
Модальность окна (только у QDialog)

self.setWindowTitle('Создание простейшей визуальной программы')

self.setWindowIcon(QtGui.QIcon('images/logo.png'))

class Main(QWidget) или class Main(QDialog)

 app = QApplication(sys.argv)

window = Main()

window.show()

sys.exit(app.exec_())

3.2 QPushButton

Кнопка


СвойствоНазначение
Имя компонента
Доступность
Положение компонента и его размеры
Шрифт, размер шрифта
Вид курсора
Стиль рамки
Надпись

def solve(self):

self.btn_solve.clicked.connect(self.solve)


3.3 QLabel

Текстовая метка


СвойствоНазначение
Имя компонента
Доступность
Положение компонента и его размеры
Шрифт, размер шрифта
Вид курсора
Надпись
Картинка
Масштабирование картинки

self.label_img.setPixmap(QPixmap('images/main.png'))

self.label_img.setScaledContents(True)

self.label_answer.setText('Ответ: ' + str(format(answer, '.12f')))

print (QtGui.QtextDocument(self.label_answer.text()).toPlainText())


3.4 QLineEdit

Текстовое поле для ввода/вывода


СвойствоНазначение
Имя компонента
Доступность
Положение компонента и его размеры
Шрифт, размер шрифта
Вид курсора
Стиль рамки
Надпись

        a = self.lineEdit_a.text()

        self.lineEdit_a.setText('')

3.5 Практический пример

Вид при использовании QWidget

Вид при использовании QDialog

import sys

from PyQt5 import QtGui

from PyQt5.QtGui import QPixmap

from PyQt5.QtWidgets import *

from PyQt5.uic import loadUi


class Main(QDialog):

    def __init__(self):

        super(Main, self).__init__()

        loadUi('uis/main.ui', self) # загрузка формы в py-скрипт

        self.setWindowTitle('Создание простейшей визуальной '

                            'программы на Python')

        self.setWindowIcon(QtGui.QIcon('images/logo.png'))

        self.label_img.setPixmap(QPixmap('images/main.png'))

        self.label_img.setScaledContents(True)

        self.btn_solve.clicked.connect(self.solve) # Связь кнопки с методом

        self.btn_clear.clicked.connect(self.clear) # Связь кнопки с методом

        self.btn_exit.clicked.connect(self.exit) # Связь кнопки с методом

    def solve(self):

        a = self.lineEdit_a.text()

        b = self.lineEdit_b.text()

        x = self.lineEdit_x.text()

        if validation_of_data(a, b, x):

            a = float(a)

            b = float(b)

            x = float(x)

            if x > 6:

                answer = a / x + b / x ** 2

            else:

                answer = a ** 2 * (x + b)

            self.label_answer.setText('Ответ: ' + str(format(answer, '.2f')))

        else:

            self.label_answer.setText(

                'Ошибка!')

    def clear(self):

        self.lineEdit_a.setText('')

        self.lineEdit_b.setText('')

        self.lineEdit_x.setText('')

        self.label_answer.setText('Ответ: ')

    def exit(self):

        self.close()


def validation_of_data(a, b, x):

    """

    проверяем валидность наших данных, с помощью перехвата исключения

    :param a: число, полученное из lineEdit_a

    :param b: число, полученное из lineEdit_b

    :param x: число, полученное из lineEdit_x

    :return: True – прошло валидацию, False – нет

    """

    try:

        float(a)

        float(b)

        float(x)

        return True

    except Exception:

        return False


def main():

    # каждое приложение должно создать объект QApplication

    # sys.argv – список аргументов командной строки

    app = QApplication(sys.argv)

    window = Main() # базовый класс для всех объектов интерфейса пользователя

    window.show() # отобразить окно на экране

    sys.exit(app.exec_()) # запуск основного цикла приложения


if __name__ == '__main__':

    main()


    Ваша оценка произведения:

Популярные книги за неделю