Как сделать кнопку ненажимаемой pyqt5

Обновлено: 07.07.2024

В этом руководстве по PyQt5 будет показано, как использовать Python 3 и Qt для создания графического интерфейса пользователя в Windows, Mac или Linux. Мы даже расскажем, как самостоятельно написать установщик.

Что такое PyQt5?

PyQt — это библиотека, которая позволяет использовать фреймворк Qt GUI (GUI — это графический интерфейс пользователя) в Python. Сам Qt, как известно, написан на C++. Используя его в Python, вы можете создавать приложения намного быстрее, не жертвуя при этом значительной частью производительности C++.

PyQt5 это самая последняя, пятая версия Qt. Еще можно найти в интернете случайное упоминание PyQt4, но эта версия устарела и больше не поддерживается.

Новый интересный конкурент PyQt — это Qt for Python. Она обладает практически идентичным API, но в отличие от PyQt имеет лицензию LGPL и, следовательно, может использоваться бесплатно даже в коммерческих проектах. Она поддерживается компанией Qt, а значит, скорее всего, за ней будущее. Здесь мы используем PyQt, потому что она более зрелая. Но, так как их интерфейсы очень похожи, вы всегда можете перейти на Qt for Python позднее.

Установка PyQt

Лучший способ управлять зависимостями в Python — через виртуальную среду. Виртуальная среда — это просто локальный каталог, содержащий библиотеки для данного конкретного проекта. В отличии от общесистемной установки библиотек, это не не повлияет на другие ваши проекты.

Для создания виртуальной среды в текущем каталоге выполните следующую команду:

Эта команда создаст директорию venv/ . Чтобы активировать виртуальную среду в Windows, выполните следующую команду:

А для Mac и Linux вот эту:

То, что виртуальная среда активирована, вы можете увидеть по префиксу (venv) в командной строке:


Теперь, чтобы установить PyQt, выполните следующую команду:

Мы используем версию 5.9.2 , потому что не все версии PyQt одинаково стабильны. Данная версия гарантированно будет работать хорошо.

Итак, поздравляем! Вы только что успешно установили PyQt5.

Создание GUI (графического интерфейса пользователя)

Теперь самое время написать ваш первый графический интерфейс! В нашей виртуальной среде запустим Python и выполним следующие команды:


Сначала мы загружаем библиотеку PyQt при помощи оператора import :

Затем мы создаем QApplication при помощи следующей команды:

Это обязательное требование библиотеки Qt: каждое приложение с графическим интерфейсом пользователя должно иметь ровно один экземпляр класса QApplication . До выполнения данной строки многие вещи в Qt просто не работают. Поэтому такая команда будет присутствовать в каждом вашем Qt приложении.

Скобки [] в данной команде представляют аргументы командной строки, переданные приложению. Поскольку наше приложение не использует никаких параметров, мы оставляем скобки пустыми.

Затем мы даем команду вывести это на экран:

Эта команда покажет небольшое окошко (его вид зависит от вашей операционной системы):


Если все это сработало, как ожидалось, тогда супер! Вы только что создали при помощи Python и библиотеки Qt свое первое приложение с графическим интерфейсом.

Виджеты

На следующей картинке показаны наиболее распространенные виджеты Qt:


Они перечислены ниже в порядке сверху вниз и слева направо:

Отсюда вы можете загрузить, если хотите, код приложения, которое создает такое окно.

Макеты

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


Вот код, создающий интерфейс, изображенный на картинке выше:

Как и ранее, мы создали экземляр класса QApplication . Затем мы создаем само окно ( window ). Мы используем для него самый простой тип QWidget , так как он просто используется как контейнер, а никакого особого поведения нам задавать не нужно. Затем мы создаем макет ( layout ) и добавляем к нему две кнопки QPushButton . Наконец, мы говорим окну использовать именно этот макет (и, следовательно, его содержимое). Как и в нашем первом приложении, мы заканчиваем вызовами методов .show () и app.exec_ () .

Безусловно, существует большое количество разных макетов, например QHBoxLayout для размещения элементов в ряд. Более подробно с ними можно ознакомиться в документации Qt.

Пользовательские стили

Одной из сильных сторон Qt является поддержка пользовательских стилей. Существует множество механизмов, позволяющих настраивать внешний вид вашего приложения. В этом разделе описаны некоторые из них.

Встроенные стили

Самый грубый способ изменить внешний вид вашего приложения — установить глобальный стиль. Вспомните изображение виджетов, которое мы уже приводили выше:


Здесь используется стиль под названием Fusion . Если вместо этого использовать стиль Windows , это будет выглядеть следующим образом:


Чтобы применить стиль, нужно использовать метод app.setStyle (…) :

Пользовательские цвета

Если вам нравится стиль, но вы хотите изменить его цвета (например, на темную тему), вы можете использовать QPalette и app.setPalette (. ) . Например:

Это изменит цвет текста в кнопках на красный:

Как создать темную тему стиля Fusion, можно посмотреть вот здесь.

Таблицы стилей

В дополнение к вышесказанному вы можете изменить внешний вид своего приложения с помощью таблиц стилей. Это аналог CSS в Qt. Например, мы можем добавить некоторое пространство:


Для получения дополнительной информации о таблицах стилей смотрите документацию Qt.

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

Сигналы в Qt используются повсеместно. И, конечно, вы также можете определить свои собственные сигналы. Но это выходит за рамки данного руководства.

Компилируем наше приложение

Теперь у вас есть базовые знания для создания GUI, который реагирует на ввод пользователя. Допустим, вы написали приложение. Оно работает на вашем компьютере. Как передать его другим людям, чтобы они тоже могли его запустить?

Вы можете попросить пользователей вашего приложения установить Python и PyQt, как мы сделали выше, а затем предоставить им свой исходный код. Но это очень утомительно (и обычно непрактично). Вместо этого нам нужен отдельный вариант вашего приложения. То есть двоичный исполняемый файл, который другие люди могут запускать в своих системах, не устанавливая ничего.

В мире Python процесс превращения исходного кода в автономный исполняемый файл называется замораживанием (freezing). Несмотря на наличие множества библиотек, решающих эту проблему, например PyInstaller , py2exe , cx_Freeze , bbfreze , py2app и так далее, замораживание приложений PyQt всегда было на удивление непростой проблемой.

Мы будем использовать новую библиотеку под названием fbs , которая позволяет создавать автономные исполняемые файлы для приложений PyQt. Для ее установки введите команду:

Затем выполним следующую команду:

Вам будет предложено ввести несколько значений:


Когда вы введете предложенную команду run , должно открыться пустое окно:


Это приложение PyQt5, такое же, как и те, что мы видели раньше. Его исходный код находится в src/main/python/main.py в вашем текущем каталоге. Но вот что самое интересное: мы можем использовать fbs, чтобы превратить его в отдельный исполняемый файл!

Бонус: создаем установщик

Библиотека fbs также позволяет вам создать установщик для вашего приложения с помощью команды fbs installer :


(Если вы работаете в Windows, вам сначала нужно установить NSIS и поместить путь к нему в свой PATH.)

За дополнительной информацией по использованию библиотеки fbs обратитесь к ее документации.

Итоги

Если вы дошли до этого места — примите наши поздравления. Надеемся, теперь у вас есть хорошее представление о том, как для написания приложений Python можно использовать PyQt (и различные ее части). Мы также узнали, как можно создавать автономные исполняемые файлы и установщики при помощи fbs.

Лаборатория Django-разработки

За 3 месяца отработай навыки Django-разработки до профессионального уровня на серьезном проекте под руководством наставника.

хорошо, так что почти каждый учебник/понятный-письменный-на-человеческом-языке-документация для PyQt4. Но PyQt5 изменил, как работает вся кнопка подключения к слоту, и я до сих пор не могу понять, как это сделать.

Я сделал быстрый gui в QtDesigner, и у меня есть QPushButton и ярлык. Когда я нажимаю кнопку, Я хочу, чтобы текст на этикетке изменился. в C++ в QtDesigner их легко подключить. Но я должен написать все это на python.

I конвертировать.ui файл с pyuic5 к. файл py. Там, в классе Ui_MainWindow, я вижу метод setupUi, который инициализирует self.кнопка следующим образом

затем, в конце метода,

называется, но, честно говоря, я не могу понять, что он делает и с чем он связан.

В основном классе, наследуя от QMainWindow, я пишу следующий метод

пожалуйста, кто-нибудь может мне помочь с этим?

Я не знаю, откуда у вас возникла идея, что "PyQt5 изменил, как работает вся кнопка подключения к слоту", но это совершенно и совершенно неправильно. Таких изменений не было, что легко видно из официальной документации PyQt:

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

что касается других моментов: при вашем текущем состоянии знаний, я бы сказал, Вы можете смело игнорировать connectSlotsByName и pyqtSlot . Хотя они имеют свое использование (см. выше документы для деталей), очень редко есть реальная необходимость использовать их в 95% приложений.

Руководство по PyQt5 для начинающих

Программирование и разработка

PyQt5 — это модуль Python для разработки настольных приложений с графическим интерфейсом пользователя. Он доступен для нескольких платформ, таких как Windows, Mac, Linux, iOS и Android. Python предлагает несколько модулей, которые фактически поддерживают разработку графического интерфейса, например Tkinter, wxPython, PySide2 и другие. Однако PyQt5 использует более 1000 классов; на самом деле PyQt5 — это огромный модуль! Кроме того, PyQt5 включает Qt Designer, конструктор графического пользовательского интерфейса, который еще больше упрощает создание графического интерфейса. Его можно использовать для создания чего угодно, от медиаплееров до веб-браузеров. В этом руководстве мы изучим основы модуля PyQt5.

Сначала установим PyQt5

pip install pyqt5

pip install pyqt5-tools

ШАГ 1: СОЗДАНИЕ ПУСТОГО ОКНА

Первый шаг в создании чего-либо — установка пустого окна. Само пустое окно требует нескольких строк кода, так что давайте посмотрим на это.

from PyQt5 import QtWidgets

from PyQt5. QtWidgets import QApplication , QMainWindow

import sys

from PyQt5 import QtGui

class window ( QtWidgets. QWidget ) :

def __init__ ( self ) :

super ( ) . __init__ ( )

Задайте геометрию окна с помощью метода setGeometry (), который принимает четыре аргумента — начальную позицию по оси x, начальную позицию по оси y (другими словами, где на экране появляется верхний левый угол), ширину и высоту окна. окно.

self . setGeometry ( 350 , 100 , 800 , 600 )

Задайте заголовок окна с помощью метода setWindowTitle ().

Вы можете установить значок с помощью setWindowIcon (). Обратите внимание, что размер значка должен составлять 64 на 64 пикселя.

Каждому файлу PyQt5 требуется следующая строка, которая принимает в качестве аргумента sys.argv.

application = QApplication ( sys . argv )

Затем создайте экземпляр класса, который мы создали выше.

Для выхода из окна по нажатию кнопки X нам понадобится sys.exit (application.exec ()).

Этот код создаст пустое окно. Код в целом будет выглядеть так:

ШАГ 2: ВВОДНАЯ ПАНЕЛЬ

Далее давайте создадим панель ввода. Панель ввода — это место, где пользователи могут добавлять текст, который мы можем извлечь. Полосы ввода создаются с помощью QWidgets.QLineEdit (). Очевидно, мы задаем его геометрию с помощью метода setGeometry ().

def initUI ( self ) :

self . input_bar = QtWidgets. QLineEdit ( self )

self . input_bar . setGeometry ( 150 , 250 , 500 , 40 )

Имейте в виду; вам все равно нужно активировать функцию в методе __init__ следующим образом:

Полный код на этом этапе будет выглядеть так:

ШАГ 3: СОЗДАНИЕ КНОПОК

Теперь давайте добавим несколько кнопок на пустой холст. Итак, напишем код для кнопки. Для кнопки мы используем QtWidgets.QPushButton (). Как обычно, мы можем задать его геометрию с помощью метода setGeometry ().

Установите значок с помощью метода setIcon ().

Установите стиль текста с помощью метода setStyleSheet (). Вы можете, среди прочего, изменить цвет, толщину и размер шрифта.

Чтобы кнопка выполняла какие-либо действия при нажатии, вам необходимо сообщить кнопке, что при нажатии на нее необходимо активировать функцию. Это делается с помощью clicked.connect (), где активируемая функция передается в качестве аргумента. В моем случае это:

Затем мы определяем функцию, которая будет вызываться или активироваться при нажатии кнопки. А пока просто распечатаем его на консоли.

def button_clicked ( self ) :
url_value = self . input_bar . text ( )

print ( url_value )

Теперь код в целом будет выглядеть так:

ШАГ 4: СОЗДАНИЕ ЯРЛЫКОВ

Теперь давайте изменим команду нажатия кнопки с помощью QLabels. QLabels используются для добавления текста. Мы добавляем это в def initUI (self).

Устанавливаем текст на этикетке с помощью метода setText ().

Мы устанавливаем шрифт, размер и вес с помощью setStyleSheet (). Мы устанавливаем шрифт, размер и вес с помощью setStyleSheet ().

И, наконец, обновляем все с помощью метода update ().

Это создает следующее:

Теперь мы можем изменить содержимое в функции button_clicked ().

Мы можем получить то, что пользователь пишет в текстовой строке, используя метод text ().

Затем мы можем изменить метку при нажатии кнопки с помощью метода setText () и разместить их в нужном месте с помощью метода setGeometry ().

self . label . setText ( url_value )

self . label . setGeometry ( QtCore. QRect ( 200 , 80 , 500 , 100 ) )

Теперь код в целом будет выглядеть так:

ШАГ 5: QVBOXLAYOUT И QHBOXLAYOUT

Я не не т добавлять к QVBoxLayout или QHBoxLayout здесь, но вы можете, если вы хотите. QHBoxLayout расположит все по горизонтали, а QVBoxLayout расположит по вертикали. Если вы используете QHBoxLayout или QVBoxLayout, вы должны опустить метод setGeometry ().

Если бы вы хотели добавить его, вы бы написали следующее в def initUI (self). Сначала вы инициализируете макет с помощью QVBoxLayout ():

Затем вы добавляете в него нужные виджеты с помощью метода addWidget ().

self . design . addWidget ( self . label )

self . design . addWidget ( self . input_bar )

self . design . addWidget ( self . button1 )

Вы устанавливаете макет с помощью setLayout (), который принимает инициализированную переменную в качестве аргумента.

Мне это здесь не нужно, потому что я все настраиваю с помощью setGeometry (), поэтому я опущу это в своем коде. Однако, если вы хотите, чтобы это было в вашем коде, весь код будет выглядеть так:

application = QApplication(sys.argv)

ШАГ 6: ДИЗАЙНЕР QT

Что еще лучше с PyQt5, так это то, что он поставляется со своим собственным дизайнером. Дизайнер — это консоль, на которой вы можете создать желаемый графический интерфейс, а программа выбрасывает для него код Python. Qt Designer поставляется в пакете pyqt5-tools, поэтому его необходимо установить, чтобы он работал. В конструкторе Qt вы можете размещать кнопки, ползунки и т.д. После того, как вы разместите их, вы можете сохранить файл как файл.ui.

После того, как файл сохранен как файл.ui, вам все равно нужно

После того, как файл сохранен как файл.ui, вам все равно нужно преобразовать его в файл.py, чтобы PyCharm мог его отобразить. Для этого откройте терминал или cmd и введите:

Я сохранил свой файл как saved_file_name.ui. Терминал выдаст файл python и назовет его так, как вы просили. Затем вы можете открыть файл.py в PyCharm и добавить к нему логику.

Помните, что, хотя мы можем использовать конструктор для разработки макета графического интерфейса пользователя, нам все же необходимо добавить логику в код, что делается исключительно с помощью кода Python, а не дизайнера. К сожалению, Qt Designer не добавляет логики в код!

В этом руководстве мы узнали об основах PyQt5 и о том, как использовать конструктор Qt. Мы узнали, что можем создавать пустые экраны, добавлять кнопки с помощью QPushButton, добавлять панели ввода с помощью QLineEdit, добавлять текст с помощью QLabels и упорядочивать все с помощью QVBoxLayout / QHBoxLayout. Фактически, PyQt5 — это очень большой модуль, используемый для создания множества настольных приложений с графическим интерфейсом пользователя. Хотя в python есть много модулей для приложений с графическим интерфейсом, большинство людей выбирают PyQt5, потому что он предлагает огромный выбор дизайнов и дизайнера для облегчения задач. Действительно, PyQt5 стоит изучить!

Я должен упомянуть, что я прочитал их, но я все еще не могу достичь своей цели:

Моя цель - сделать приложение linux 'launcher'. Создание, размещение и т.д. Работает как шарм, но есть одна проблема - все кнопки запускают один и тот же обратный вызов - последний, который будет подключен в цикле создания кнопки.

Вот базовая версия сценария, иллюстрирующая то, что я пытаюсь сделать:

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

Читайте также: