Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/25: Рейтинг темы: голосов - 25, средняя оценка - 4.56
 Аватар для Telnow
10 / 10 / 1
Регистрация: 08.04.2022
Сообщений: 187
PyQt6

Работа с QMessageBox

21.07.2022, 10:43. Показов 5474. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!

Каким образом я могу создать объект класса Message и работать уже с ним вызывая его в нужных местах программы и изменяя текст сообщения, можете поправить мой код?


Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from PyQt6 import QtWidgets
import sys
 
class Message(QtWidgets.QMessageBox):
 
    def __init__(self):
        super(Message, self).__init__()
        self.setText("Пример")
 
 
app = QtWidgets.QApplication(sys.argv)
w = Message()
w.show()
sys.exit(app.exec())
 
 
# msg = Message() - не видит созданный выше класс, невозможно создать объект класса.
Добавлено через 24 минуты
Вот что я имею ввиду, хочу реализовать тоже самое, но через классы.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from PyQt6 import QtWidgets
 
class Programm(QtWidgets.QMainWindow):
 
    def __init__(self):
        super().__init__()
        self.button_one = QtWidgets.QPushButton(self)
        self.button_one.setText("Сообщение 1")
        self.button_two = QtWidgets.QPushButton(self)
        self.button_two.move(50, 50)
        self.button_two.setText("Сообщение 2")
 
        self.button_one.clicked.connect(lambda: self.message("Первое сообщние"))
        self.button_two.clicked.connect(lambda: self.message("Второе сообщние"))
 
    def message(self, txt):
        msg = QtWidgets.QMessageBox(self)
        msg.setText(txt)
        msg.show()
 
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = Programm()
    window.show()
    sys.exit(app.exec())
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.07.2022, 10:43
Ответы с готовыми решениями:

QMessageBox
Нужно ввести радиус и посчитать площадь и длину, выдает ошибку. В чем проблема? { QMessageBox* msgBox = new QMessageBox; ...

QMessageBox
При выборе файла который нельзя открыть должно быть окно с ошибкой, но ошибка происходит только в еомпиляции причем вместо этой ошибки...

QMessageBox и QSS
Добрый день, надо сделать чтобы QMessageBox был обычный (без стиля, потому что он со стилем выглядит ужасно), просто я в программе...

30
172 / 112 / 65
Регистрация: 26.06.2020
Сообщений: 334
21.07.2022, 14:26
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
from PyQt6 import QtWidgets
 
class Message(QtWidgets.QMessageBox):
 
    def __init__(self):
        super(Message, self).__init__()
        
 
class Programm(QtWidgets.QMainWindow):
 
    def __init__(self):
        super().__init__()
        self.button_one = QtWidgets.QPushButton(self)
        self.button_one.setText("Сообщение 1")
        self.button_two = QtWidgets.QPushButton(self)
        self.button_two.move(50, 50)
        self.button_two.setText("Сообщение 2")
        self.msg = Message()
        self.button_one.clicked.connect(lambda: self.message("Первое сообщние"))
        self.button_two.clicked.connect(lambda: self.message("Второе сообщние"))
 
    def message(self, txt):
        self.msg.setText(txt)
        self.msg.show()
 
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = Programm()
    window.show()
    sys.exit(app.exec())
1
 Аватар для Telnow
10 / 10 / 1
Регистрация: 08.04.2022
Сообщений: 187
21.07.2022, 14:33  [ТС]
Как мне в данном случае открыть класс внутри другого класса? Появляется окно на долю секунды и сразу исчезает.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from PyQt6 import QtWidgets
 
class Message(QtWidgets.QMessageBox):
 
    def __init__(self):
        super(Message, self).__init__()
        self.setText("тест")
 
class Programm(QtWidgets.QMainWindow):
 
    def __init__(self):
        super().__init__()
        self.button_one = QtWidgets.QPushButton(self)
        self.button_one.setText("Сообщение 1")
        self.button_two = QtWidgets.QPushButton(self)
        self.button_two.move(50, 50)
        self.button_two.setText("Сообщение 2")
 
        self.button_one.clicked.connect(self.message)
 
    def message(self):
        a = Message() # Не открывается
        a.show()
 
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = Programm()
    window.show()
    sys.exit(app.exec())
0
290 / 205 / 68
Регистрация: 18.09.2019
Сообщений: 407
Записей в блоге: 58
21.07.2022, 14:52
Лучший ответ Сообщение было отмечено telnofff как решение

Решение

telnofff, дайте ему родителя, сирота сразу загибается после show()
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from PyQt6 import QtWidgets
 
class Message(QtWidgets.QMessageBox):
 
    def __init__(self, parent=None):
        super(Message, self).__init__(parent)
        self.setText("тест")
 
class Programm(QtWidgets.QMainWindow):
 
    def __init__(self):
        super().__init__()
        self.button_one = QtWidgets.QPushButton(self)
        self.button_one.setText("Сообщение 1")
        self.button_two = QtWidgets.QPushButton(self)
        self.button_two.move(50, 50)
        self.button_two.setText("Сообщение 2")
 
        self.button_one.clicked.connect(self.message)
 
    def message(self):
        a = Message(self) # Не открывается
        a.show()
 
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = Programm()
    window.show()
    sys.exit(app.exec())
2
 Аватар для Telnow
10 / 10 / 1
Регистрация: 08.04.2022
Сообщений: 187
21.07.2022, 15:09  [ТС]
iamvic, Благодарю Вас! Очень доходчиво объяснили про parent=None в конструкторе я не знал, у меня еще тогда будет к Вам вопрос. Как мне в этом случае обратиться к методу другого класса, но уже без конструктора, чтобы появилось сообщение с текстом внутри, пока у меня всплывает только пустое сообщение, что я делаю не так?

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from PyQt6 import QtWidgets
 
class Message(QtWidgets.QMessageBox):
 
    def msg(self):
        self.setText("Тест")
 
class Programm(QtWidgets.QMainWindow):
 
    def __init__(self):
        super().__init__()
        self.button_one = QtWidgets.QPushButton(self)
        self.button_one.setText("Сообщение 1")
        self.button_two = QtWidgets.QPushButton(self)
        self.button_two.move(50, 50)
        self.button_two.setText("Сообщение 2")
 
        self.button_one.clicked.connect(self.message)
 
    def message(self):
        a = Message(self)
        a.show()
 
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = Programm()
    window.show()
    sys.exit(app.exec())
0
290 / 205 / 68
Регистрация: 18.09.2019
Сообщений: 407
Записей в блоге: 58
21.07.2022, 17:36
Варианты-то разные.

С одной стороны можно так:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from PyQt6 import QtWidgets
 
class Message(QtWidgets.QMessageBox):
 
    def msg(self):
        self.setText("Тест")
 
class Programm(QtWidgets.QMainWindow):
 
    def __init__(self):
        super().__init__()
        self.button_one = QtWidgets.QPushButton(self)
        self.button_one.setText("Сообщение 1")
        self.button_two = QtWidgets.QPushButton(self)
        self.button_two.move(50, 50)
        self.button_two.setText("Сообщение 2")
 
        self.button_one.clicked.connect(self.message)
 
    def message(self):
        a = Message(self)
        a.msg()  #  <-- этот метод надо где-то вызвать
        a.show()
 
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = Programm()
    window.show()
    sys.exit(app.exec())
А с другой стороны можно и так:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from PyQt6 import QtWidgets
 
class Message(QtWidgets.QMessageBox):
 
    def msg(client):
        # сляпать исключительно для наружного потребления что-то типа
        # Static Public Members (QMessageBox.critical и подобные)
        a = Message(client)
        a.setText("Тест")
        a.show()
 
class Programm(QtWidgets.QMainWindow):
 
    def __init__(self):
        super().__init__()
        self.button_one = QtWidgets.QPushButton(self)
        self.button_one.setText("Сообщение 1")
        self.button_two = QtWidgets.QPushButton(self)
        self.button_two.move(50, 50)
        self.button_two.setText("Сообщение 2")
 
        self.button_one.clicked.connect(lambda: Message.msg(self))
 
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = Programm()
    window.show()
    sys.exit(app.exec())
1
290 / 205 / 68
Регистрация: 18.09.2019
Сообщений: 407
Записей в блоге: 58
22.07.2022, 09:57
С утра чего-то озарило , что во всех предложенных решениях есть один существенный недостаток. Ведь по факту получается такая последовательность:
- пользователь нажимает на кнопку в главном окне
- рождается окно сообщения
- пользователь закрывает его
- этот отработавший виджет никуда не пропадает, он так и остаётся среди детей главного окна. И за счёт этих отработавших виджетов количество детей у главного окна неуклонно растёт в процессе работы, что грозит, наверное, перенаселением в конце концов .

Если обратить внимание на происхождение класса виджета, то можно увидеть, что среди его предков числится QDialog (Message <-- QMessageBox <-- QDialog <-- и т.д.)

Принимая во внимание особенности QDialog, можно предложить решить проблему утилизации отработавших виджетов следующим образом:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
from PyQt6 import QtWidgets
 
class Message(QtWidgets.QMessageBox):
 
    def hideEvent(self, e):
        # повторная реализация для борьбы с перенаселением
        # реакция на элементы управления QMessageBox:
        # клавиши (Enter, Escape и т.д.), кнопки диалога (Ok, No и т.д.)
        self.deleteLater()
        e.accept()
 
    def closeEvent(self, e):
        # повторная реализация для борьбы с перенаселением
        # реакция на значок закрытия в полосе заголовка
        self.deleteLater()
        e.accept()
 
    def msg(client):
        # исключительно для наружного применения что-то типа
        # Static Public Members (см. QMessageBox.critical и ему подобные)
        a = Message(client)
        a.setText("Тест")
        a.show()
 
class Programm(QtWidgets.QMainWindow):
 
    def __init__(self):
        super().__init__()
        self.button_one = QtWidgets.QPushButton(self)
        self.button_one.setText("Сообщение 1")
        self.button_two = QtWidgets.QPushButton(self)
        self.button_two.move(50, 50)
        self.button_two.setText("Сообщение 2")
 
        self.button_one.clicked.connect(lambda: Message.msg(self))
 
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = Programm()
    window.show()
    sys.exit(app.exec())
С другой стороны, ничто не мешает использовать exec() вместо show(), что выглядит даже предпочтительнее на мой взгляд. Тогда даже окна верхнего уровня будут работать:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from PyQt6 import QtWidgets
 
class Message(QtWidgets.QMessageBox):
 
    def msg(client=None):
        # исключительно для наружного применения что-то типа
        # Static Public Members (см. QMessageBox.critical и ему подобные)
        a = Message(client)
        a.setText("Тест")
        a.exec()
        a.deleteLater()
 
 
class Programm(QtWidgets.QMainWindow):
 
    def __init__(self):
        super().__init__()
        self.button_one = QtWidgets.QPushButton(self)
        self.button_one.setText("Сообщение 1")
        self.button_two = QtWidgets.QPushButton(self)
        self.button_two.move(50, 50)
        self.button_two.setText("Сообщение 2")
 
        self.button_one.clicked.connect(lambda: Message.msg(self))
        self.button_two.clicked.connect(lambda: Message.msg())
 
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = Programm()
    window.show()
    sys.exit(app.exec())
1
 Аватар для Telnow
10 / 10 / 1
Регистрация: 08.04.2022
Сообщений: 187
27.07.2022, 12:46  [ТС]
iamvic, Этот вариант больше нравится, минимум кода, получается метод exec() перехватывает весь поток. Скажите, откуда у Вас столько знаний по PyQt, посоветуйте ресурс, или книгу.
0
 Аватар для Telnow
10 / 10 / 1
Регистрация: 08.04.2022
Сообщений: 187
28.07.2022, 14:10  [ТС]
iamvic,

Я немного поправил Ваш код в двух местах, работает также, скажите, это не будет ошибкой?

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from PyQt6 import QtWidgets
 
class Message(QtWidgets.QMessageBox):
 
    def msg(self): # Вместо client=None написал self
        a = Message(self) # Вместо client написал self.
        a.setText("Тест")
        a.exec()
        a.deleteLater()
 
class Programm(QtWidgets.QMainWindow):
 
    def __init__(self):
        super().__init__()
        self.button_one = QtWidgets.QPushButton(self)
        self.button_one.setText("Сообщение 1")
        self.button_two = QtWidgets.QPushButton(self)
        self.button_two.move(50, 50)
        self.button_two.setText("Сообщение 2")
        self.button_one.clicked.connect(lambda: Message.msg(self))
 
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = Programm()
    window.show()
    sys.exit(app.exec())
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
28.07.2022, 15:26
telnofff, Это какое то лютое извращение по моему мнению, т. к. создавать класс QMessageBox, а в методе экземпляра создавать новый экземпляр, для чего нужно выносить QMessageBox в отдельный класс?
0
 Аватар для Telnow
10 / 10 / 1
Регистрация: 08.04.2022
Сообщений: 187
28.07.2022, 15:31  [ТС]
Fudthhh, Хотите сказать этот код тоже неверный?
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
28.07.2022, 15:41
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from PySide6 import QtWidgets, QtCore, QtGui
 
 
 
class Example(QtWidgets.QWidget):
    """..."""
 
    def __init__(self, parent: QtWidgets.QWidget = None) -> None:
        QtWidgets.QWidget.__init__(self, parent, QtCore.Qt.Widget)
 
        self.btn1_PushButton = QtWidgets.QPushButton("Message 1", self)
        self.btn2_PushButton = QtWidgets.QPushButton("Message 2", self)
        self.btn3_PushButton = QtWidgets.QPushButton("Message 3", self)
 
        self.btn1_PushButton.clicked.connect(self.btn1ClickedEvent)
        self.btn2_PushButton.clicked.connect(
            lambda: QtWidgets.QMessageBox.warning(self, "Warning", "MESSAGE 2")
        )
 
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.btn1_PushButton)
        layout.addWidget(self.btn2_PushButton)
        layout.addWidget(self.btn3_PushButton)
 
        if not parent:
            self.show()
 
    def btn1ClickedEvent(self) -> None:
        QtWidgets.QMessageBox.information(self, "Information", "MESSAGE 1")
 
    
if __name__ == "__main__":
    app = QtWidgets.QApplication()
    main = Example()
    app.exec()
Добавлено через 8 минут
Зачем держать QMessageBox в памяти, вызывай где его нужно и всё, если вызов повторяется много раз, то тут проблема в алгоритме, а если нет, то на крайний случай можно создать функцию, хотя я использую такой метод:

Выносим все сообщения в отдельный файл:
Python
1
2
3
WARNING_OLD_HEAD = "WARNING_OLD_HEAD", "MESSAGE"
 
ERROR_MESSAGE_EMPTY = "ERROR_MESSAGE_EMPTY", "MESSAGE"
Тогда вызовы будут такими:
Python
1
2
3
QtWidgets.QMessageBox.warning(self, *WARNING_OLD_HEAD)
 
QtWidgets.QMessageBox.critical(self, *ERROR_MESSAGE_EMPTY )
1
 Аватар для Telnow
10 / 10 / 1
Регистрация: 08.04.2022
Сообщений: 187
28.07.2022, 15:48  [ТС]
Цитата Сообщение от Fudthhh Посмотреть сообщение
Это какое то лютое извращение по моему мнению, т. к. создавать класс QMessageBox, а в методе экземпляра создавать новый экземпляр, для чего нужно выносить QMessageBox в отдельный класс?
Класс Message будет лежать в отдельном файле чтобы не было каши, в этом файле я хотел лишь узнать как обратиться из класса к другому классу
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
28.07.2022, 16:05
Цитата Сообщение от telnofff Посмотреть сообщение
Класс Message будет лежать в отдельном файле
Вот как раз это и является кашей, переведем в псевдокод:

1) Есть производный класс QMessageBox.
2) Есть метод класса, который в качестве аргумента принимает ссылку на экземпляр этого класса.
3) Этот метод, создает экземпляр этого же класса, при инициализации передавая туда аргументом ссылку на экземпляр класса откуда был вызван метод.
4) Далее вызывает его отображение, и после чего удаляет.

Только ты подразумеваешь другое, в пункте два: Метод класса, принимает аргумент не экземпляр класса, откуда был вызван, а родителя, который будет далее передаваться в инициализацию нового экземпляра, этого класса.


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

Добавлено через 2 минуты
Чтоб было более менее правильно, это должно выглядеть так:
Python
1
2
3
4
5
6
7
8
class Message(QtWidgets.QMessageBox):
 
    @staticmethod
    def msg(parent: QtWidgets.QWidget) -> "Message":
        a = Message(parent)
        a.setText("Тест")
        a.exec()
        a.deleteLater()
Добавлено через 1 минуту
Но в целом это очень плохая практика.

Добавлено через 3 минуты
Или вот так, что более извращено:
Python
1
2
3
4
5
6
7
8
class Message(QtWidgets.QMessageBox):
 
    @classmethod
    def msg(cls, parent: QtWidgets.QWidget) -> "Message":
        a = cls(parent)
        a.setText("Тест")
        a.exec()
        a.deleteLater()
2
290 / 205 / 68
Регистрация: 18.09.2019
Сообщений: 407
Записей в блоге: 58
28.07.2022, 16:11
Цитата Сообщение от Fudthhh Посмотреть сообщение
Но в целом это очень плохая практика.
А чем плоха практика написания своих Static Public Members?
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
28.07.2022, 16:21
iamvic, в данном случае это создает путаницу, причем на ровном месте, если извращаться над элементарном выводе статический сообщений, то что будет твориться с динамическими QAbstractItemModel и ему подобных.

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

Добавлено через 4 минуты
Даже если взять отрывок кода:

Вот это:
Python
1
2
3
4
5
6
if 1 == 1:
    QMessageBox.info(self, *MESSAGE1)
if 2 == 2:
    QMessageBox.warning(self, *MESSAGE2)
if 3 == 3:
    QMessageBox.critical(self, *MESSAGE3)
намного лучше во всех смыслах, чем вот это:
Python
1
2
3
4
5
6
if 1 == 1:
    Message.msg1(self)
if 2 == 2:
    Message.msg2(self)
if 3 == 3:
    Message.msg3(self)
1
290 / 205 / 68
Регистрация: 18.09.2019
Сообщений: 407
Записей в блоге: 58
28.07.2022, 16:29
Согласен, QMessageBox плохо подходит на роль подопытного в этом случае
0
290 / 205 / 68
Регистрация: 18.09.2019
Сообщений: 407
Записей в блоге: 58
31.07.2022, 13:51
Но как бы там ни было, вопрос-то всё равно остался - что делать, если ни одна из существующих в QMessageBox функций из набора Static Public Members не удовлетворяет требованиям задачи, а сам класс QMessageBox не очень подходит для создания собственной функции в данном конкретном случае?

Похоже, что в таком случае лучше всего использовать подкласс QDialog.

Весьма надуманый пример с раздачей жёлтых и красных карточек пользователю, на которые он может только полюбоваться и закрыть нажатием на клавишу Esc, как мне кажется, позволяет понять как это можно сделать, а о применении прекрасно высказался Fudthhh,
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# https://www.cyberforum.ru/python-graphics/thread3009021.html
from PyQt5 import QtCore, QtWidgets
 
class Referee(QtWidgets.QDialog):
 
    @staticmethod
    def foul_checked(parent=None, text='', sending_off=False):
        # функция исключительно для наружного применения
        # что-то типа Static Public Members (QMessageBox.critical и т.д.)
        a = Referee(parent)
        a.setWindowFlags(QtCore.Qt.Window |
                         QtCore.Qt.FramelessWindowHint |
                         QtCore.Qt.CustomizeWindowHint)
        a.setStyleSheet(
            'background-color: rgb(255, {!s}, {!s});'.format(
                63 if sending_off else 255,
                63 if sending_off else 0))
        a.text = QtWidgets.QLabel(text, a)
        a.hbox = QtWidgets.QHBoxLayout()
        a.hbox.addWidget(a.text)
        a.hbox.addStretch(1)
        a.vbox = QtWidgets.QVBoxLayout()
        a.vbox.addLayout(a.hbox)
        a.vbox.addStretch(1)
        a.setLayout(a.vbox)
        a.exec_()
        a.deleteLater()
 
 
class Programm(QtWidgets.QMainWindow):
 
    def __init__(self):
        super().__init__()
        button_one = QtWidgets.QPushButton(self)
        button_one.setText("Предупреждение")
        button_two = QtWidgets.QPushButton(self)
        button_two.setText("Удаление")
 
        central = QtWidgets.QWidget(self)
 
        vbox = QtWidgets.QVBoxLayout()
        vbox.addStretch(1)
        vbox.addWidget(button_one)
        vbox.addWidget(button_two)
        vbox.addStretch(1)
 
        hbox = QtWidgets.QHBoxLayout()
        hbox.addStretch(1)
        hbox.addLayout(vbox)
        hbox.addStretch(1)
 
        central.setLayout(hbox)
        self.setCentralWidget(central)
 
        button_one.clicked.connect(self.on_button_one_clicked)
        button_two.clicked.connect(self.on_button_two_clicked)
 
    def on_button_one_clicked(self, v):
        self.sender().setEnabled(False)
        # предупреждаем только один раз
 
        Referee.foul_checked(
            self,
            "<b>НАРУШЕНИЕ !!!</b><br><br>Получи \"горчичник\".")
 
    def on_button_two_clicked(self, v):
        Referee.foul_checked(
            None,
            "<b>ГРУБОЕ НАРУШЕНИЕ !!!</b><br><br>Вон с поля.",
            True)
        self.close()
        # при повторном или грубом нарушении завершаем работу
 
 
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = Programm()
    window.show()
    sys.exit(app.exec())
Ну, единственно, под PyQt6 проверить в данный момент не могу, но это, наверное, не проблема?

Добавлено через 14 минут
Цитата Сообщение от telnofff Посмотреть сообщение
посоветуйте ресурс, или книгу
Я глянул в соседних ветках, Вам там насоветовали уже разных книжек - все годные, но всё-равно без чтения оригинальной документации не обойтись https://doc.qt.io/ Там значительно подробнее всё изложено, но, правда, без понимания C/C++ будет тяжело...

Добавлено через 1 час 46 минут
Ну, блиииин!!! Вот ведь инерция мышления что творит... Тут же вообще просто функцией можно обойтись:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# https://www.cyberforum.ru/python-graphics/thread3009021.html
from PyQt5 import QtCore, QtWidgets
 
def foul_checked(client=None, text='', sending_off=False):
    # функция
    a = QtWidgets.QDialog(client)
    a.setWindowFlags(QtCore.Qt.Window |
                     QtCore.Qt.FramelessWindowHint |
                     QtCore.Qt.CustomizeWindowHint)
    a.setStyleSheet(
        'background-color: rgb(255, {!s}, {!s});'.format(
            63 if sending_off else 255,
            63 if sending_off else 0))
    a.text = QtWidgets.QLabel(text, a)
    a.hbox = QtWidgets.QHBoxLayout()
    a.hbox.addWidget(a.text)
    a.hbox.addStretch(1)
    a.vbox = QtWidgets.QVBoxLayout()
    a.vbox.addLayout(a.hbox)
    a.vbox.addStretch(1)
    a.setLayout(a.vbox)
    a.exec_()
    a.deleteLater()
 
 
class Programm(QtWidgets.QMainWindow):
 
    def __init__(self):
        super().__init__()
        button_one = QtWidgets.QPushButton(self)
        button_one.setText("Предупреждение")
        button_two = QtWidgets.QPushButton(self)
        button_two.setText("Удаление")
 
        central = QtWidgets.QWidget(self)
 
        vbox = QtWidgets.QVBoxLayout()
        vbox.addStretch(1)
        vbox.addWidget(button_one)
        vbox.addWidget(button_two)
        vbox.addStretch(1)
 
        hbox = QtWidgets.QHBoxLayout()
        hbox.addStretch(1)
        hbox.addLayout(vbox)
        hbox.addStretch(1)
 
        central.setLayout(hbox)
        self.setCentralWidget(central)
 
        button_one.clicked.connect(self.on_button_one_clicked)
        button_two.clicked.connect(self.on_button_two_clicked)
 
    def on_button_one_clicked(self, v):
        self.sender().setEnabled(False)
        # предупреждаем только один раз
 
        foul_checked(
            self,
            "<b>НАРУШЕНИЕ !!!</b><br><br>Получи \"горчичник\".")
 
    def on_button_two_clicked(self, v):
        foul_checked(
            None,
            "<b>ГРУБОЕ НАРУШЕНИЕ !!!</b><br><br>Вон с поля.",
            True)
        self.close()
        # при поторном или грубом нарушении завершаем работу
 
 
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = Programm()
    window.show()
    sys.exit(app.exec())
1
 Аватар для Telnow
10 / 10 / 1
Регистрация: 08.04.2022
Сообщений: 187
31.07.2022, 18:47  [ТС]
Fudthhh, допустим я хочу написать программу в которой хочу вызывать сообщения, сообщения будут находится в отдельном файле чтобы не было каши. Каким образом я могу это сделать так, чтобы выглядело правильно, как Вы считаете?

Код прикрепляю в архиве. Буду благодарен если посмотрите.
Message test.rar
0
 Аватар для Telnow
10 / 10 / 1
Регистрация: 08.04.2022
Сообщений: 187
02.08.2022, 10:09  [ТС]
Fudthhh, Оставлю код тут с пометкой. Мне очень важно увидеть вашу работу на моем примере, спасибо.

Первый файл:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
from PyQt6 import QtCore, QtWidgets
 
class Ui_MainWindow(QtWidgets.QMainWindow):
 
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.pushButton.clicked.connect(self.mess_one)
        self.pushButton_2.clicked.connect(self.mess_two)
 
    def mess_one(self):
        pass
 
    def mess_two(self):
        pass
 
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(318, 123)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.centralwidget)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.frame = QtWidgets.QFrame(self.centralwidget)
        self.frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
        self.frame.setObjectName("frame")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.frame)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.pushButton = QtWidgets.QPushButton(self.frame)
        self.pushButton.setObjectName("pushButton")
        self.horizontalLayout.addWidget(self.pushButton)
        self.pushButton_2 = QtWidgets.QPushButton(self.frame)
        self.pushButton_2.setObjectName("pushButton_2")
        self.horizontalLayout.addWidget(self.pushButton_2)
        self.horizontalLayout_2.addWidget(self.frame)
        MainWindow.setCentralWidget(self.centralwidget)
 
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
 
    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "Сообщение 1"))
        self.pushButton_2.setText(_translate("MainWindow", "Сообщение 2"))
 
 
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    window = Ui_MainWindow()
    window.show()
    sys.exit(app.exec())

Второй файл:

Python
1
2
3
4
from PyQt6 import QtWidgets
 
class Msg(QtWidgets.QMessageBox):
    pass
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.08.2022, 10:09
Помогаю со студенческими работами здесь

Класс QMessageBox
Проблемы при создании экземпляра класса QMessageBox в сопутствующем вызываемом модуле. При вызове окна предупреждения для вывода...

QMessageBox и потоки
Всем привет, в первый раз пишу на этот форум. У меня возникла проблема с уведомлениями QMessageBox и потоком. При открытии уведомления...

Класс QMessageBox
Всем привет! Возникли вопросы в написании собственного класса. Есть программа, в которой присутствуют информационные сообщения. Мне...

PyQt6 QMessageBox
Я не пойму в чем ошибка, не работает QMessageBox.Critical def results(self): if not self.is_equel: res =...

Не открывается QMessageBox
Здравствуйте! Столкнулся с такой проблемой: Написал я приложение на python, используя PySide: в общем, имею 3 класса - главное окно,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита, которое может. . .
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа разработанного в конфигурации КА2. В качестве источника данных указан регистр накопления, в который записываются данные о. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru