С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/88: Рейтинг темы: голосов - 88, средняя оценка - 4.52
 Аватар для Luca Brasi
892 / 204 / 55
Регистрация: 06.11.2015
Сообщений: 2,288
Записей в блоге: 2

Закрытие главного окна

05.02.2016, 22:54. Показов 18283. Ответов 18

Студворк — интернет-сервис помощи студентам
Учитывая мои скудные познания в PyQt никак не добьюсь успеха. Вызываю MessageBox, когда его закрываю появляется главное окно, которое приходится закрывать вручную. Итого, как сделать автозакрытие главного окна после нажатия на кнопку messageBox'a?
Python
1
2
3
4
5
6
7
class drawWarning(QtGui.QWidget):
    def __init__(self,days, parent=None,):
        QtGui.QWidget.__init__(self, parent)
        self.setGeometry(960, 540, 100, 100)
        mes_box=QtGui.QMessageBox.warning(self,'','You don\'t sleep for a {0} '
              'days'.format(days), QtGui.QMessageBox.Ok )
        self.close()
З.Ы. Пробовал прикрутить к сигналу buttonClicked слот close - поймал ошибку.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.02.2016, 22:54
Ответы с готовыми решениями:

Дублирование главного окна при открытии нового окна
У меня есть основное окно типа QWidget, при нажатии на кнопку открывается окно типа QDialog. Но вместе с диалоговым окном открывается и...

Обновление главного окна в PyQt5
Доброго Всем времени суток. Наверное уже не раз создавались подобные темы, но ответа на свой вопрос так и не нашел( Поэтому спрошу еще раз,...

Отображение главного окна программы | QThread
Здравствуйте! Пишу GUI на Python. Использую библиотеку PyQt5. Написал свой SplashScreen с целью отвлекания пользователя во время загрузки...

18
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
06.02.2016, 09:56
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
import sys
 
from PyQt4 import QtCore, QtGui
 
 
class MainWindow(QtGui.QWidget):
    def __init__(self):
        super(MainWindow, self).__init__()
 
        self.button_ok = None
        self.build_widgets()
 
    def build_widgets(self):
        self.setLayout(QtGui.QVBoxLayout())
 
        self.button_ok = QtGui.QPushButton('Закрыть')
        self.button_ok.clicked.connect(self.example)
        self.layout().addWidget(self.button_ok)
 
    def example(self):
        message = 'Вы уверены, что хотите продолжить?'
        reply = QtGui.QMessageBox.question(self, 'Уведомление', message,
                                           QtGui.QMessageBox.Yes,
                                           QtGui.QMessageBox.No)
 
        if reply == QtGui.QMessageBox.Yes:
            self.close()
        else:
            print('cancel')
 
 
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())
Цитата Сообщение от Luca Brasi Посмотреть сообщение
drawWarning
Названия классов всегда с большой буквы пишутся и для того, чтобы вызвать стандартную функцию не нужно создавать целый класс.

Добавлено через 2 минуты
Цитата Сообщение от Luca Brasi Посмотреть сообщение
Пробовал прикрутить к сигналу buttonClicked слот close
Неправильный ход мыслей, это не нужно делать.
0
 Аватар для Luca Brasi
892 / 204 / 55
Регистрация: 06.11.2015
Сообщений: 2,288
Записей в блоге: 2
06.02.2016, 10:21  [ТС]
alex925, спасибо за рекомендации. В вашем примере кнопка которая вызывает messagebox, а мне хотелось message box сам по себе. У меня появляется встречный вопрос... А может просто сделать виджет с кнопкой ок которая бы его закрывала?
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
06.02.2016, 10:48
Цитата Сообщение от Luca Brasi Посмотреть сообщение
В вашем примере кнопка которая вызывает messagebox, а мне хотелось message box сам по себе
Это как!!?! MessageBox это не самостоятельный виджет, он используется для подтверждения чего-то. У тебя все приложение состоит из 1 вопроса?
Может ты хочешь, чтобы при нажатии крестика у тебя было подтверждение закрытие программы?

Изъясняйся ясней.
0
 Аватар для Luca Brasi
892 / 204 / 55
Регистрация: 06.11.2015
Сообщений: 2,288
Записей в блоге: 2
06.02.2016, 11:03  [ТС]
Может ты хочешь, чтобы при нажатии крестика у тебя было подтверждение закрытие программы?
это как раз мне не нужно. Я хочу виджет, с текстом сообщения и кнопкой "ОК". Жмёшь на кнопку- окно закрывается. Вот я и придумал себе неудачное решение задейсивовать Messagebox
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
06.02.2016, 12:16
Luca Brasi, как я понимаю этот виджет будет куда-то встроен, это же не самостоятельная программа. По этому я опять повторяю, опиши ситуацию получще, чтобы я тебе подсказал правильное решение.
0
 Аватар для Luca Brasi
892 / 204 / 55
Регистрация: 06.11.2015
Сообщений: 2,288
Записей в блоге: 2
06.02.2016, 12:37  [ТС]
Окай. Есть текст сообщения который генерируется в этом же скрипте. Как только текст готов, появляется окошко, в нем значок Warning, текст и кнопка "Ок". Нажал на кнопку ок - окошко закрылось и скрипт завершился. Все.
Вам более прояснилась ситуация?
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
06.02.2016, 19:15
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
import sys
 
from PyQt4 import QtCore, QtGui
 
 
class MainWindow(QtGui.QWidget):
    def __init__(self):
        super(MainWindow, self).__init__()
 
        self.info = None
        self.button_ok = None
        self.build_widgets()
 
    def build_widgets(self):
        self.setLayout(QtGui.QVBoxLayout())
 
        self.info = QtGui.QLabel('Какой-то текст')
        self.layout().addWidget(self.info)
 
        self.button_ok = QtGui.QPushButton('Закрыть')
        self.button_ok.clicked.connect(self.close)
        self.layout().addWidget(self.button_ok)
 
 
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())
Ну раз тебе не нужен MessageBox, то не понимаю в чем проблемы вообще, все элементарно.
0
 Аватар для Luca Brasi
892 / 204 / 55
Регистрация: 06.11.2015
Сообщений: 2,288
Записей в блоге: 2
06.02.2016, 21:14  [ТС]
ок, с этим разобрался. Мне бы еще иконку WARNING вроде такой . Можно как то задействовать из Qt библиотеки, чтобы не прибегать к внешнему фалу?
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
06.02.2016, 21:54
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
import sys
import time
 
from PyQt4 import QtCore, QtGui
 
 
class Worker(QtCore.QThread):
    def __init__(self):
        super(Worker, self).__init__()
 
    def run(self):
        for i in range(5):
            self.emit(QtCore.SIGNAL('worker(PyQt_PyObject)'), i)
            time.sleep(1)
 
 
class MainWindow(QtGui.QWidget):
    def __init__(self):
        super(MainWindow, self).__init__()
 
        self.inf = None
        self.run = None
        self.worker = Worker()
        self.worker.finished.connect(self.exit)
        self.connect(self.worker, QtCore.SIGNAL('worker(PyQt_PyObject)'),
                     self.update_status)
 
        self.build_widgets()
 
    def build_widgets(self):
        self.setLayout(QtGui.QVBoxLayout())
 
        self.inf = QtGui.QLabel('')
        self.layout().addWidget(self.inf)
 
        self.run = QtGui.QPushButton('Запустить задачу')
        self.run.clicked.connect(self.worker.start)
        self.layout().addWidget(self.run)
 
    def update_status(self, i):
        self.run.setDisabled(True)
        self.inf.setText('Процес выполнения задачи: {}'.format(i))
 
    def exit(self):
        message = 'Программа будет сейчас завершена'
        reply = QtGui.QMessageBox.warning(self, 'Уведомление', message,
                                           QtGui.QMessageBox.Yes)
 
        if reply == QtGui.QMessageBox.Yes:
            self.close()
 
 
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())
1
 Аватар для Luca Brasi
892 / 204 / 55
Регистрация: 06.11.2015
Сообщений: 2,288
Записей в блоге: 2
06.02.2016, 23:54  [ТС]
alex925, спасибо! В общем то я желаемого добился. Еще некоторый финальный вопрос... А может MessageBox существовать без Main Window?
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
07.02.2016, 09:33
Luca Brasi, в смысле без класса? Ты в функциональном стиле хочешь писать? Или ты вообще об окне в целом опять?
0
 Аватар для Luca Brasi
892 / 204 / 55
Регистрация: 06.11.2015
Сообщений: 2,288
Записей в блоге: 2
07.02.2016, 11:21  [ТС]
alex925, нет, я подразумевал стиль ООП. И скорее всего я об "окне в целом опять". Задам альтернативный вопрос. Какое назначение Message Box'ов? Это типа как информационные окна?
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
07.02.2016, 11:34
Цитата Сообщение от Luca Brasi Посмотреть сообщение
И скорее всего я об "окне в целом опять"

Цитата Сообщение от Luca Brasi Посмотреть сообщение
Какое назначение Message Box'ов?
Подтвердить, что-то, уведомить о чем-то, запросить ввод дополнительной информации и т д

Ты хочешь какую-то ерунду и не описываешь по человечески, что хочешь сделать, по этому я наверно не могу тебе ничем помочь. Код который я выложил делает точно то, что ты хотел.
Цитата Сообщение от Luca Brasi Посмотреть сообщение
Есть текст сообщения который генерируется в этом же скрипте
Есть главное окно, которое запускает какую-то работу в отдельном потоке (для того, чтобы gui оставался активным) и этот поток отсылает уведомления в на это главное окно о своей работе.
Цитата Сообщение от Luca Brasi Посмотреть сообщение
Как только текст готов, появляется окошко, в нем значок Warning, текст и кнопка "Ок". Нажал на кнопку ок - окошко закрылось и скрипт завершился
Ну тут описывать даж не надо ничего, все слово в слово происходит так же.

Ты мне все это время заливаешь про отсутствие главного окна и просто 1 уведомление только, ТАК НЕ БЫВАЕТ! Если ты хочешь, чтобы у тебя все в фоне обрабатывалось, то это уже получается не gui, а обычная консольная программа.
GUI предполагает, что у тебя есть какое-то окно из которого ты управляешь программой и эта программа тебя информирует о чем-то с помощью всяких MessageBox и т д.
0
 Аватар для Luca Brasi
892 / 204 / 55
Регистрация: 06.11.2015
Сообщений: 2,288
Записей в блоге: 2
07.02.2016, 12:05  [ТС]
alex925, даже не взирая на сложившийся диалог вы отозвались мне помочь. Я вам за это очень благодарен. Возможно изначально я поставил абстраектную задачу. Скрипт я допилил и вот он.
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
07.02.2016, 12:27
Luca Brasi, Взглядом окинул скрипт, увидел, что ты его под какую-то из linux систем писал. Это меняет ситуацию в целом. Там можно стандартную систему оповещений использовать для вывода уведомлений.

notify-send - в gnome
kdialog - в kde
osascript -e 'display notification "Тело уведомления" with title "Заголовок"' - os x
0
 Аватар для Luca Brasi
892 / 204 / 55
Регистрация: 06.11.2015
Сообщений: 2,288
Записей в блоге: 2
07.02.2016, 15:45  [ТС]
alex925, да, я знаю. На крайняк можно было zenity юзать, но в кедах его нету... У меня например xfce окружение, но нету kdialog, в то время как у кого то нету zenity. Как по мне, это более утомительно искать решение под каждое рабочее окружение. Мой текущий вариант имеет универсальность, у всех из коробки стоит pyqt4 и python3
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
07.02.2016, 15:55
Цитата Сообщение от Luca Brasi Посмотреть сообщение
У меня например xfce окружение, но нету kdialog
Естественно нету, у тебя же не kde.
Цитата Сообщение от Luca Brasi Посмотреть сообщение
Мой текущий вариант имеет универсальность, у всех из коробки стоит pyqt4 и python3
Твой текущий вариант относительно универсальный, но кривой по сути, потому что тебе надо было сделать приложение, которое запускается и сидит в трее и которое при наступлении события выводит системное уведомление, а у тебя все вверх тормашками.
http://pyqt.sourceforge.net/Do... yicon.html
0
 Аватар для Luca Brasi
892 / 204 / 55
Регистрация: 06.11.2015
Сообщений: 2,288
Записей в блоге: 2
07.02.2016, 19:34  [ТС]
Цитата Сообщение от alex925 Посмотреть сообщение
потому что тебе надо было сделать приложение, которое запускается и сидит в трее и которое при наступлении события выводит системное уведомление, а у тебя все вверх тормашками.
Ну это в идеале). Откровенно говоря я на это и не рассчитывал
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.02.2016, 19:34
Помогаю со студенческими работами здесь

Из главного окна запустить по кнопке новое окно
Для проекта курсовой требуется из главного окна (использую PyQt5) запустить по кнопке новое окно, которое будет запущено в отдельном...

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

Как передать в QDialog координаты главного окна?
Имеется код-пример на PyQt5. Если в главном окне нажать на кнопку, то поверх главного окна откроется QDialog. При этом, если перед вызовом...

Завершение всех потоков при закрытии главного окна
Всем доброго времени суток. Обращаюсь за помощью. Есть главное окно pyqt5 , при нажатии на кнопку, запускается selenium webdriver через...

Неопределенный индикатор выполнения в виде анимации в центре главного окна
Как в PyQt5 реализовать неопределенный индикатор выполнения в виде анимации в центре главного окна? Встречается довольно часто в...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru