Найти - Пользователи
Полная версия: PyGTK: диалоговое окно выхода
Начало » GUI » PyGTK: диалоговое окно выхода
1 2
sbar
Доброго времени суток. Мне нужно сделать своему приложению диалог выхода, при подтверждении которого только будет выполнятся gtk.main_quit, а при нажатии “нет” или попытке закрыть - возвращение в главное окно (а диалог должен исчезнуть).
Сам диалог должен вызываться при попытке закрыть главное окно.
Вот код (все проблемы прокомментированы):
#!/bin/env python
# -*- coding: utf-8 -*-

import pygtk
pygtk.require( ‘2.0’ )
import gtk

class GUI:
def init_quit_dialog(self):
self.quit_dialog = gtk.Dialog( title='Выход…', parent=self.mainwin )
self.quit_dialog.set_position( gtk.WIN_POS_CENTER )
yes_button, no_button, label = gtk.Button( ‘Да’ ), gtk.Button( ‘Нет’ ), gtk.Label( ‘Уверен?’ ) # BTW, как лучше создавать виджеты в диалоговом окне? про add_button я не понял что вставлять вместо response_id
self.quit_dialog.action_area.pack_start( yes_button, True, True, 0 )
self.quit_dialog.action_area.pack_start( no_button, True, True, 0 )
self.quit_dialog.vbox.pack_start( label )
self.quit_dialog.set_border_width( 20 )
yes_button.show()
no_button.show()
label.show()
yes_button.connect( ‘clicked’, gtk.main_quit ) # Выполняется только если я попытаюсь закрыть диалоговое окно. Почему?
no_button.connect( ‘clicked’, lambda w: self.quit_dialog.hide ) # нужно что бы при нажатии этой кнопки диалоговое окно исчезало, а главное оставалось. Этого не происходит
#self.quit_dialog.connect( ‘delete_event’, ээээ ) # собственно надо что б при закрытии диалога происходило тоже самое что и при нажатии no_button

def quit_dialog_run(self, widget, event):
self.quit_dialog.run()

def __init__(self):
self.mainwin = gtk.Window( gtk.WINDOW_TOPLEVEL )
self.init_quit_dialog()
self.mainwin.connect( ‘delete_event’, self.quit_dialog_run )
self.mainwin.show()

def main(self):
gtk.main()

GUI().main()
Проблемы:
0. При нажатии “да” нужно еще закрыть сам диалог что бы приложение завершилось.
1. При попытке закрыть диалог почему то закрывается главное окно, а сам диалог остается.
2. Как быть с кнопкой “нет” вообще не понятно. Спрятать диалог? - не работает

P.S.: Я нуб, не пинайте сильно.
slivlen
Используй gtk.MessageDialog.
sbar
slivlen, спасибо, так получается по-короче.
Переписал init_quit_dialog:
def init_quit_dialog(self):
self.quit_dialog = gtk.MessageDialog( parent=self.mainwin, type=gtk.MESSAGE_QUESTION, buttons=gtk.BUTTONS_YES_NO, message_format='Уверен?' )
self.quit_dialog.set_position( gtk.WIN_POS_CENTER )
self.quit_dialog.set_border_width( 20 )
Теперь при нажатии любой из кнопок или попытки закрыть диалог - исчезает главное окно, а диалог остается.
Как задать действия кнопкам? Из мануала я ничего не нашел про них, а в туториале просто ничего не написано, незаконченная глава.
И в self.quit_dialog.connect( ‘delete_event’, что тут написать? ) что бы при закрытии диалога исчезал именно диалог, а не главное окно?
pythonwin
Pr0b3L
И в self.quit_dialog.connect( ‘delete_event’, что тут написать? ) что бы при закрытии диалога исчезал именно диалог, а не главное окно?
self.quit_dialog.connect( ‘delete_event’, gtk.main_quit)
pythonwin
Pr0b3L - посмотри glade.
sbar
я пока учусь и хочу без glade писать.
а вообще я сейчас начал смотреть в glade: при выборе buttons у MessageDialog оно падает с сегфолтом =/ проверено на версиях 3.4.0 и 3.4.1 (других нету в моем дистре сейчас)
лучше скажите как кнопкам действия задать, пожалуйста.
pythonwin
Pr0b3L
лучше скажите как кнопкам действия задать, пожалуйста.
смотри:
pythonwin
self.quit_dialog.connect( ‘delete_event’, gtk.main_quit)
sbar
pythonwin
смотри:
никак не пойму при чем тут закрытие диалогового окна (я про кнопки да/нет хотел узнать), но мне уже подсказали сделать как-то так:
try:
self.set_screen( self.mainwin.get_screen() )
except AttributeError:
self.mainwin.connect( ‘destroy’, lambda *w: gtk.main_quit() )
self.mainwin.connect( ‘delete_event’, self.delete_event )

def delete_event(self, widget, data=None):
quit_dialog = gtk.MessageDialog (
parent = self.mainwin,
type = gtk.MESSAGE_QUESTION,
buttons = gtk.BUTTONS_YES_NO,
message_format = ‘Уверен, что хочешь выйти?’
)

quit_dialog.set_border_width( 20 )
quit_dialog.set_position( gtk.WIN_POS_CENTER )
quit_dialog.set_title( ‘Выход’ )

response = quit_dialog.run()
quit_dialog.destroy()
if response == gtk.RESPONSE_YES:
return False
так что всем спасибо, проблема решена. ;)
sbar
А можно ли как-нибудь сделать главное окно “недоступным” пока открыт диалог выхода? Есть такая проблема: пользователь при появлении этого диалога может случайно ткнуть на главное окно и диалог уходит на задний план.
shiza
Это то что называется модальным окном?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB