Ответы пользователя по тегу PyQt
  • Не выполняется функция, после обращения к ей, как решить?

    seven5674
    @seven5674
    Старый я уже что бы что-то в себе менять
    Думаю что проблема в том что метод init_UI нигде не вызывается
    Добавь вызов этого метода в __init__
    Ответ написан
  • Как правильно синхронизировать бд с pyqt (qt)?

    seven5674
    @seven5674
    Старый я уже что бы что-то в себе менять
    Слыхал про QSqlDatabase, но функционал у класа для меня будет маловато

    хм... и чего тебе там не хватает ?

    Реализация сохранение модифицированной таблицы

    con = QtSql.QSqlDatabase.addDatabase('QSQLITE') 
    con.setDatabaseName('data.sqlite') 
    con.open()
    stm = QtSql.QSqlTableModel() 
    stm.setTable('table_name') 
    stm.select() 
    tv = QtWidgets.QTableView() 
    tv.setModel(stm)

    Ответ написан
  • Почему не работают кнопки в диалоговом окне pyqt5?

    seven5674
    @seven5674
    Старый я уже что бы что-то в себе менять
    Все плохо...

    global Dialog
        Dialog = QtWidgets.QDialog()
        ui = Ui_Dialog()
        ui.setupUi(Dialog)
        Dialog.show()


    Создаем QDialog и пихаем его в Ui которое уже диалоговое окно...
    За global вам отдельное наказание надо придумать

    Простой пример из трех окон
    Структура
    spoiler

    629bb299224fb163064642.png

    start.py
    spoiler

    from PyQt5 import QtWidgets
    from modules.main_module import main_module
    import sys
    
    # ------------------------------------------------------------------------------- #
    #
    # ------------------------------------------------------------------------------- #
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        window = main_module()
        window.show_window()
        sys.exit(app.exec_())


    main_module.py
    spoiler

    629bb184ae40c744582105.png
    from PyQt5 import QtWidgets, QtSql, QtCore, QtGui
    import ui.ui_main as ui_main
    from modules.win1_module import win1_module
    from modules.win2_module import win2_module
    
    
    # ------------------------------------------------------------------------------- #
    #
    # ------------------------------------------------------------------------------- #
    class main_module(QtWidgets.QMainWindow):
        # --------------------------------------------------------------------------- #
        #
        # --------------------------------------------------------------------------- #
        def __init__(self, parent=None):
            """
            """
            QtWidgets.QMainWindow.__init__(self, parent)
            self.ui = ui_main.Ui_MainWindow()
            self.ui.setupUi(self)
    
            self.ui.btn_win1.clicked.connect(
                self.on_show_win1)
    
            self.ui.btn_win2.clicked.connect(
                self.on_show_win2)
    
        # --------------------------------------------------------------------------- #
        #
        # --------------------------------------------------------------------------- #
        def on_show_win1(self):
            """
            """
            self.win1 = win1_module(self)
            self.win1.show()
    
        # --------------------------------------------------------------------------- #
        #
        # --------------------------------------------------------------------------- #
        def on_show_win2(self):
            """
            """
            self.win2 = win2_module(self)
            self.win2.show()
    
        # --------------------------------------------------------------------------- #
        # Показывыет главное окно программы
        # Отображение по середине экрана
        # --------------------------------------------------------------------------- #
        def show_window(self):
            """
            """
            desktop = QtWidgets.QApplication.desktop()
            x = (desktop.width() - self.width()) // 2
            y = (desktop.height() - self.height()) // 2
            self.move(x, y)
            self.show()


    win1_module.py
    spoiler

    629bb19bdfdaf538965047.png
    from PyQt5 import QtWidgets, QtCore, QtSql, QtGui
    import ui.ui_win1 as ui_win1
    
    
    # ------------------------------------------------------------------------------- #
    #
    #
    # ------------------------------------------------------------------------------- #
    class win1_module(QtWidgets.QDialog):
        # --------------------------------------------------------------------------- #
        #
        # --------------------------------------------------------------------------- #
        def __init__(self, parent=None):
            """
            """
            super().__init__(parent=parent)
            self.setWindowModality(QtCore.Qt.WindowModal)
            self.setWindowFlags(self.windowFlags() |
                                QtCore.Qt.WindowMaximizeButtonHint)
    
            self.ui = ui_win1.Ui_Dialog()
            self.ui.setupUi(self)
    
            self.main = parent
    
            self.setWindowTitle("Окно №1")
    
    
            self.ui.btn_close.clicked.connect(
                self.on_close)
    
        # --------------------------------------------------------------------------- #
        #
        # --------------------------------------------------------------------------- #
        def on_close(self):
            """
            """
            self.close()


    win2_module.py
    spoiler

    629bb1dc7fc29353137696.png
    from PyQt5 import QtWidgets, QtCore, QtSql, QtGui
    import ui.ui_win2 as ui_win2
    
    
    # ------------------------------------------------------------------------------- #
    #
    #
    # ------------------------------------------------------------------------------- #
    class win2_module(QtWidgets.QDialog):
        # --------------------------------------------------------------------------- #
        #
        # --------------------------------------------------------------------------- #
        def __init__(self, parent=None):
            """
            """
            super().__init__(parent=parent)
            self.setWindowModality(QtCore.Qt.WindowModal)
            self.setWindowFlags(self.windowFlags() |
                                QtCore.Qt.WindowMaximizeButtonHint)
    
            self.ui = ui_win2.Ui_Dialog()
            self.ui.setupUi(self)
    
            self.main = parent
    
            self.setWindowTitle("Окно №2")
    
            self.ui.btn_close.clicked.connect(
                self.on_close)
    
        # --------------------------------------------------------------------------- #
        #
        # --------------------------------------------------------------------------- #
        def on_close(self):
            """
            """
            self.close()



    По аналогии реализации нажатия на кнопку "Закрыть" реализуете и свои варианты событий
    В целом конечно же надо вам заканчивать бездумно копировать код из инета и почитать чего-нибудь
    Ответ написан
    Комментировать
  • Как привязать функцию к кнопке после запуска приложения(функция exec) в PyQt5?

    seven5674
    @seven5674
    Старый я уже что бы что-то в себе менять
    Что делать?

    Читать со страницы 394
    Ответ написан
  • PyQt6 как настроить ивент кнопки и отображение приложения?

    seven5674
    @seven5674
    Старый я уже что бы что-то в себе менять
    Тут начиная со станицы 328 написано что да как надо делать что бы решить твою проблему
    Ответ написан
    Комментировать
  • Почему не работает .connect() из другого файла?

    seven5674
    @seven5674
    Старый я уже что бы что-то в себе менять
    Ну и зачем ты лезешь в UI файл ?
    Не нужно редактировать его потому как он меняется
    Импортируй UI и работай

    spoiler

    from PyQt5 import QtCore, QtWidgets
    import ui.ui_main as ui_main
    import sys
    
    class main_module(QtWidgets.QMainWindow):
        def __init__(self, parent=None):
            """
            """
            QtWidgets.QMainWindow.__init__(self, parent)
            self.ui = ui_main.Ui_MainWindow()
            self.ui.setupUi(self)
    
            self.ui.btn.clicked.connect(self.on_click)
    
        def on_click(self):
            """
            """
            pass
    
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        window = main_module()
        window.show()
        sys.exit(app.exec_())

    Ответ написан
    Комментировать
  • Почему слетает кодировка при загрузке ui-файла из ресурсов?

    seven5674
    @seven5674
    Старый я уже что бы что-то в себе менять
    хм... что ты пытаешься сделать вот этим file = QFile(":/ui/coordWidget.ui") я чето не понимаю

    Существует два способа загрузки ui файлов
    1. С использованием модуля uic
    spoiler

    from PyQt5 import QtWidgets, uic 
    import sys 
    app = QtWidgets.QApplication(sys.argv) 
    window = uic.loadUi("MyForm.ui") 
    window.show() 
    sys.exit(app.exec_())


    2. Преобразование UI-файла в PY-файл (pyuic5)
    spoiler

    pyuic5 MyForm.ui -o ui_MyForm.py
    from PyQt5 import QtWidgets 
    import sys, ui_MyForm 
    app = QtWidgets.QApplication(sys.argv) 
    window = QtWidgets.QWidget() 
    ui = ui_MyForm.Ui_MyForm() 
    ui.setupUi(window) 
    window.show() 
    sys.exit(app.exec_())

    Ответ написан
    4 комментария
  • Работа с QSqlQuery - как ускорить обновление записей?

    seven5674
    @seven5674
    Старый я уже что бы что-то в себе менять
    Обычно визуализация работы потоков происходит в рамках, например, QTableView без обращения к БД.

    Следовательно можно не делать запросы к БД на каждой итерации а добавлять / обновлять данные после того как отработают все потоки.

    Что бы это сделать просто храни результаты работы потоков в словаре или списке и после того как потоки отработают используй транзакции для обновления / вставки данных в БД

    Например,
    self.sqlite_con.open()
    self.sqlite_con.transaction()
    
    query = QtSql.QSqlQuery()
    
    for param in self.params:
        sql = ("UPDATE ...")
        query.exec(sql)
    
    self.sqlite_con.commit()
    self.sqlite_con.close()


    P.S. Sqlite не поддерживает пакетную вставку поэтому addBindValue и execBatch особого профита не даст... Разве что тормоза перейдет в конец выполнения программы
    Ответ написан
    Комментировать
  • Threads.wait() - долгое ожидание ожидание завершения потоков. Как ускорить?

    seven5674
    @seven5674
    Старый я уже что бы что-то в себе менять
    Это нормальное поведение данного метода
    Ускорить процесс можно предварительно вызвав метод terminate но следует понимать что данный вариант не снимает блокировки если таковые были и если есть работа в БД то может произойти что-нибудь непредвиденное

    Есть другой вариант а именно отказаться вообще от метода wait а использовать сигналы с дополнительной проверкой

    Например в thread можно переопределить сигнал finished и возвращать id потока в управляющий код с последующим удалением потока из, например, словаря.

    1. При создании потока в управляющем коде заносим данные о потоке в словарь
    self.threads["thread_{}".format(i)] = thread

    2. Для создаваемых потоков регистрируем событие finished
    thread.on_finished.connect(self.on_finished)

    3. В потоке переопределяем событие finished
    self.finished.connect(self.on_finished)

    4. При завершении потока генерим сигнал и передаем в управляющий код id потока
    self.on_finished.emit(self.thread_id)

    5. При срабатывании сигнала finished в управляющем коде удаляем поток из словаря self.threads
    self.threads.pop("thread_{}".format(thread_id))

    6. Ну а теперь ждем завершения потоков не через wait() а как-то так
    while self.threads:
        QtWidgets.qApp.processEvents()


    Сам использую этот механизм при визуализации работы потоков
    627f7062da0f5768127213.jpeg
    Ответ написан
  • PyQT. Почему не работает кнопка в дочернем окне?

    seven5674
    @seven5674
    Старый я уже что бы что-то в себе менять
    Если кратко то у тебя self и self.form ссылаются на разные объекты и соответственно не видят друг друга

    self - <class '__main__.childForm'>
    self.form - <class 'PyQt5.QtWidgets.QWidget'>


    Полный и немного измененный пример

    from PyQt5 import QtCore, QtWidgets
    import sys
    
    
    class child_form(QtWidgets.QWidget):
        def __init__(self, parent=None):
            QtWidgets.QWidget.__init__(self, parent)
            self.setWindowFlags(QtCore.Qt.Window)
            self.setWindowModality(QtCore.Qt.WindowModal)
            self.setAttribute(QtCore.Qt.WA_DeleteOnClose, True)
            self.setWindowTitle("Дочернее окно")
            self.resize(300, 70)
            btn_close = QtWidgets.QPushButton("&Закрыть дочернее окно")
            btn_close.clicked.connect(self.on_btn_close)
            vbox = QtWidgets.QVBoxLayout()
            vbox.addWidget(btn_close)
            self.setLayout(vbox)
    
        def show_window(self):
            self.show()
    
        def on_btn_close(self):
            self.close()
    
    
    class main_form(QtWidgets.QWidget):
        def __init__(self, parent=None):
            QtWidgets.QWidget.__init__(self, parent)
            self.setWindowTitle("Первая программа на PyQt")
            self.resize(500, 500)
            label = QtWidgets.QLabel("<center>Привет, мир!</center>")
            btn_modal = QtWidgets.QPushButton("Открыть &дочернее окно")
            btn_close = QtWidgets.QPushButton("&Закрыть программу")
            vbox = QtWidgets.QVBoxLayout()
            vbox.addWidget(label)
            vbox.addWidget(btn_modal)
            vbox.addWidget(btn_close)
            self.setLayout(vbox)
            btn_modal.clicked.connect(self.on_btn_modal)
            btn_close.clicked.connect(QtWidgets.qApp.quit)
    
        def show_window(self):
            self.show()
    
        def on_btn_modal(self):
            child = child_form(self)
            child.show_window()
    
    
    def main():
        app = QtWidgets.QApplication(sys.argv)
        form = main_form()
        form.show_window()
        sys.exit(app.exec_())
    
    
    if __name__ == '__main__':
        main()

    Ответ написан
    Комментировать
  • Почему не работает условие вызова функции при выборе радиокнопки?

    seven5674
    @seven5674
    Старый я уже что бы что-то в себе менять
    if self.radio_button_3.isChecked():
                    self.bth_vis.clicked.connect(self.function2)
                else:
                    self.bth_vis.clicked.connect(self.function1)

    Зачем ты тут вешаешь сигналы ? это не так работает
    Что меашет в function1 сделать выбор ?
    Например
    self.bth_vis.clicked.connect(self.make_choice)
    .
    .
    .
    def make_choice(sefl):
        if self.radio_button_3.isChecked():
            self.func_1()
        else:
            self.func_2()
    Ответ написан
    Комментировать
  • Как обнулить значения всех radiobutton сразу?

    seven5674
    @seven5674
    Старый я уже что бы что-то в себе менять
    я же тебе давал пример тут
    также в словаре и обнуляй/суммируй/умножай

    если значений по умолчанию нет то прогони по словарю и проставь
    radiobutton.setChecked(False)
    Ответ написан
  • Как проверить активность radiobutton в pyqt?

    seven5674
    @seven5674
    Старый я уже что бы что-то в себе менять
    Например так

    Для rb с разными значениями func
    rb_1.func = "func_1"
    rb_1.toggled.connect(self.on_rb_select)

    В on_rb_select
    rb = self.sender()
    if rb.isChecked():
        self.rb_selected = rb.func

    В self.on_btn_click
    def on_btn_click(self):
        if self.rb_selected == "func_1":
            self.func_1()
        if self.rb_selected == "func_2":
            self.func_2()


    Код

    from PyQt5.QtWidgets import *
    import sys
    
    class main_window(QWidget):
        def __init__(self):
            QWidget.__init__(self)
    
            self.rb_selected = 1
    
            layout = QVBoxLayout()
            self.setLayout(layout)
            self.label = QLabel()
            layout.addWidget(self.label)
    
            gb_layout = QHBoxLayout()
            gb_widget = QWidget()
            gb_widget.setLayout(gb_layout)
            gb = QButtonGroup(gb_widget)
    
            rb_1 = QRadioButton()
            rb_1.setChecked(True)
            rb_1.func = "func_1"
            rb_1.toggled.connect(self.on_rb_select)
            gb.addButton(rb_1)
            gb_layout.addWidget(rb_1)
    
            rb_2 = QRadioButton()
            rb_2.setChecked(False)
            rb_2.func = "func_2"
            rb_2.toggled.connect(self.on_rb_select)
            gb.addButton(rb_2)
            gb_layout.addWidget(rb_2)
    
            layout.addWidget(gb_widget)
    
            self.btn = QPushButton("Press me")
            self.btn.clicked.connect(self.on_btn_click)
            layout.addWidget(self.btn)
    
        def on_btn_click(self):
            if self.rb_selected == "func_1":
                self.func_1()
            if self.rb_selected == "func_2":
                self.func_2()
    
        def on_rb_select(self):
            rb = self.sender()
            if rb.isChecked():
                self.rb_selected = rb.func
    
        def func_1(self):
            self.label.setText("func_1")
    
        def func_2(self):
            self.label.setText("func_2")
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        screen = main_window()
        screen.show()
        sys.exit(app.exec_())

    Ответ написан
    Комментировать
  • Как сложить текстовые значения radiobutton?

    seven5674
    @seven5674
    Старый я уже что бы что-то в себе менять
    Вот пример для суммы
    Как перемножить думаю что сами догадаетесь

    Код

    from PyQt5.QtWidgets import *
    import sys
    
    class Window(QWidget):
        def __init__(self):
            QWidget.__init__(self)
            layout = QVBoxLayout()
            self.setLayout(layout)
            self.label = QLabel("Сумма = 0")
            layout.addWidget(self.label)
    
            self.sum = 0
            self.gb_list = {}
    
            for i in range(1, 10):
                gb_layout = QHBoxLayout()
                gb_widget = QWidget()
                gb_widget.setLayout(gb_layout)
                gb = QButtonGroup(gb_widget)
                for j in range(1, 10):
                    radiobutton = QRadioButton()
                    radiobutton.setChecked(False)
                    radiobutton.number = "{}".format(i)
                    radiobutton.value = "{}".format(j)
                    radiobutton.toggled.connect(self.onClicked)
                    gb.addButton(radiobutton)
                    gb_layout.addWidget(radiobutton)
                layout.addWidget(gb_widget)
    
        def onClicked(self):
            radioButton = self.sender()
            if radioButton.isChecked():
                self.gb_list[radioButton.number] = int(radioButton.value)
                self.label.setText("Сумма = {}".format(sum(self.gb_list.values())))
    
    app = QApplication(sys.argv)
    screen = Window()
    screen.show()
    sys.exit(app.exec_())



    6260e8f1e1e71034253044.png
    Ответ написан
    Комментировать
  • Почему терминал выдает ошибку ModuleNotFoundError: No module named 'PyQt5.QtWidgets'; 'PyQt5' is not a package?

    seven5674
    @seven5674
    Старый я уже что бы что-то в себе менять
    Пример рабочий
    Возможно не в том окружении идет запуск
    Ответ написан
    Комментировать