DevGang
Авторизоваться

Python Pyqt5 - создайте простой графический интерфейс без усилий! 

PyQt - это пакет Python для работы с кроссплатформенным графическим интерфейсом Qt.

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

Я не программист с графическим интерфейсом пользователя, я не планирую им быть, и если вы планируете им стать, я бы не рекомендовал python в качестве основного языка, но! если вам нужно что-то «быстрое и грязное», для решения в команде или просто удобство графического интерфейса вместо терминала, этот модуль идеально подходит!

В конце этой статьи у вас будет графический интерфейс, который выбирает файл для работы!

Конструктор

Pyqt поставляется с дизайнером графического интерфейса пользователя, который значительно упрощает работу, экономя вам много времени по сравнению с Tkinter или другими языками графического интерфейса на python.

Вид конструктора<br>
Вид конструктора

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

Слева вы можете добавить объекты ввода, переменные и т.д.

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

python -m PyQt5.uic.pyuic -x [FILENAME].ui -o [FILENAME].py

Теперь мы создали файл python, который запускает пользовательский интерфейс!

Не трогай это!

Изменение нашего нового файла python является серьезной ошибкой, поскольку, если мы когда-либо захотим отредактировать наш графический интерфейс, мы запустим наши изменения, правильный способ - создать наш собственный класс, унаследованный от нашего графического интерфейса.

Просто скопируйте импорт и создайте новый класс, он будет выглядеть примерно так:

from file_choosing import Ui_Dialog
from PyQt5 import QtCore, QtGui, QtWidgets

# our class
class MainWindow(Ui_Dialog):
    def __init__(self):
        super(MainWindow).__init__()
def setupUi(self, Dialog):
    super(MainWindow, self).setupUi(Dialog)
    # Todo: add our own functions
# running GUI instance
if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    Dialog = QtWidgets.QDialog()
    ui = MainWindow()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())

Как же нам внести нужные изменения?

Нам нужно изменить важную функцию, setupUI.

Эта функция создает пользовательский интерфейс, и что нам нужно сделать, так это «подключить» наши рабочие функции к нашим кнопкам.

И это будет выглядеть так:

def setupUi(self, Dialog):
    super(MainWindow, self).setupUi(Dialog)

    # adding functions to buttons from here
    self.toolButton.clicked.connect(self._create_window)
    self.pushButton.clicked.connect(self._clicked_push_button)

Ваш Код вступает в игру

До сих пор у нас был обработанный графический интерфейс, но без каких-либо функций, в основном, функции подключения, позволяющие нам добавлять наш код в графический интерфейс, чтобы все происходило.
Как только мы подключим функции к кнопке, каждый щелчок будет запускать нашу функцию.

Примечание - это однопоточная программа, если ваш код работает в основном потоке, и это долгая операция, это приведет к тому, что графический интерфейс перестанет отвечать.

Функциональность

Чтобы сэкономить вам время на поиск в Интернете, вот несколько ключевых функций.

# setting text on a text box / line
[object].setText(file)

# reading text of text box / line
[object].text()

# adding functonality to button
[object].clicked.connect([your function])

И, наконец, как и было обещано, я опубликую здесь полный код выбора файла, я использовал документацию Pyqt5, и это здорово, и если вы хотите, чтобы ваш графический интерфейс выглядел и работал лучше, я рекомендую вам немного почитать.

Основной код

from file_choosing import Ui_Dialog
from PyQt5 import QtCore, QtGui, QtWidgets


class MainWindow(Ui_Dialog):
    def __init__(self):
        super(MainWindow).__init__()
        self.title = 'Choose file'
        self.left = 10
        self.top = 10
        self.width = 640
        self.height = 480

    def setupUi(self, Dialog):
        super(MainWindow, self).setupUi(Dialog)

        # adding functions to buttons from here
        self.toolButton.clicked.connect(self._create_window)
        self.pushButton.clicked.connect(self._clicked_push_button)
        #

    def _create_window(self):
        self._shared_memory = {}
        self.ex = App(self._shared_memory)
        self._clicked_tool_button()

    def _clicked_tool_button(self):
        file = self._shared_memory.get('filename')
        if file is not None:
            self.lineEdit.setText(file)

    def _clicked_push_button(self):
        # Todo: your script
        if self.lineEdit.text() != '':
            print('now your script should do something')
            self.textBrowser.setText(f'my scripts just did something with file: {self._shared_memory.get("filename")}')
            pass

        else:
            print('now your script should do something')
            self.textBrowser.setText(f'choose file, or my script wont do a thing')


# choosing file window
class App(QtWidgets.QWidget):

    def __init__(self, shared):
        super().__init__()
        self.title = 'PyQt5 file dialogs - pythonspot.com'
        self.left = 10
        self.top = 10
        self.width = 640
        self.height = 480
        self.shared = shared
        self.initUI()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)
        self.openFileNameDialog()

    def openFileNameDialog(self):
        options = QtWidgets.QFileDialog.Options()
        options |= QtWidgets.QFileDialog.DontUseNativeDialog
        fileName, _ = QtWidgets.QFileDialog.getOpenFileName(self, "QFileDialog.getOpenFileName()", "",
                                                            "All Files (*);;Python Files (*.py)", options=options)
        if fileName:
            self.shared['filename'] = fileName
            return fileName


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    Dialog = QtWidgets.QDialog()
    ui = MainWindow()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())

Код пользовательского интерфейса

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

# Form implementation generated from reading ui file 'file_choosing.ui'
#
# Created by: PyQt5 UI code generator 5.14.2
#
# WARNING! All changes made in this file will be lost!


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(677, 341)
        self.pushButton = QtWidgets.QPushButton(Dialog)
        self.pushButton.setGeometry(QtCore.QRect(530, 210, 101, 21))
        self.pushButton.setObjectName("pushButton")
        self.lineEdit = QtWidgets.QLineEdit(Dialog)
        self.lineEdit.setGeometry(QtCore.QRect(90, 32, 441, 31))
        self.lineEdit.setObjectName("lineEdit")
        self.label = QtWidgets.QLabel(Dialog)
        self.label.setGeometry(QtCore.QRect(40, 40, 31, 16))
        self.label.setObjectName("label")
        self.toolButton = QtWidgets.QToolButton(Dialog)
        self.toolButton.setGeometry(QtCore.QRect(540, 30, 81, 31))
        self.toolButton.setObjectName("toolButton")
        self.textBrowser = QtWidgets.QTextBrowser(Dialog)
        self.textBrowser.setGeometry(QtCore.QRect(40, 110, 391, 192))
        self.textBrowser.setObjectName("textBrowser")
        self.label_2 = QtWidgets.QLabel(Dialog)
        self.label_2.setGeometry(QtCore.QRect(220, 80, 59, 15))
        self.label_2.setObjectName("label_2")

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Main"))
        self.pushButton.setText(_translate("Dialog", "OK"))
        self.label.setText(_translate("Dialog", "File"))
        self.toolButton.setText(_translate("Dialog", "Choose File"))
        self.label_2.setText(_translate("Dialog", "results"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Dialog = QtWidgets.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())

Я использовал имена по умолчанию для простоты, поэтому воссоздать пользовательский интерфейс просто: одно поле для нажатия, одно поле для инструментов, одно текстовое поле и одно строковое поле.

Мысли

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

Иногда вы можете найти это полезным, я обычно использую это при компиляции кода Python, даже если он не такой эффективный или распространенный, иногда предоставление товарищу по команде EXE-файла с простым графическим интерфейсом может заставить его использовать небольшой инструмент, который вы создали, которые он бы не использовал, так как необходимо поддерживать окружающую среду.

Источник:

#Python #Qt #PyQt
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

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

Попробовать

Оплатив хостинг 25$ в подарок вы получите 100$ на счет

Получить