Форум сайта python.su
Доброго времени суток. Мне нужно сделать своему приложению диалог выхода, при подтверждении которого только будет выполнятся 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()
Офлайн
Используй gtk.MessageDialog.
Офлайн
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 )
Отредактировано (Фев. 15, 2008 17:33:11)
Офлайн
Pr0b3Lself.quit_dialog.connect( ‘delete_event’, gtk.main_quit)
И в self.quit_dialog.connect( ‘delete_event’, что тут написать? ) что бы при закрытии диалога исчезал именно диалог, а не главное окно?
Офлайн
Pr0b3L - посмотри glade.
Офлайн
я пока учусь и хочу без glade писать.
а вообще я сейчас начал смотреть в glade: при выборе buttons у MessageDialog оно падает с сегфолтом =/ проверено на версиях 3.4.0 и 3.4.1 (других нету в моем дистре сейчас)
лучше скажите как кнопкам действия задать, пожалуйста.
Офлайн
Pr0b3Lсмотри:
лучше скажите как кнопкам действия задать, пожалуйста.
pythonwin
self.quit_dialog.connect( ‘delete_event’, gtk.main_quit)
Офлайн
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
Офлайн
А можно ли как-нибудь сделать главное окно “недоступным” пока открыт диалог выхода? Есть такая проблема: пользователь при появлении этого диалога может случайно ткнуть на главное окно и диалог уходит на задний план.
Офлайн
Это то что называется модальным окном?
Офлайн