Как сделать окно за диалогом не кликабельным? - PullRequest
2 голосов
/ 26 июня 2019

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

import gtk;
window = gtk.Window();
window.set_title("Window Behind Dialog");
window.set_default_size(426,240);
textentry = gtk.TextView();
window.add(textentry);
window.show_all();
dialog = gtk.Window();
dialog.set_title("Dialog");
dialog.set_default_size(256,144);
label = gtk.Label("Unlock the window behind when this dialog get close");
dialog.add(label);
dialog.show_all();
gtk.main();

Какой метод используется для этого, в Gtk или PyGtk ?, например:

window.set_disabled_to_all_events();

или

window.set_disabled();

или

window.events_disabled(True);

или

window.set_blocked(True);

1 Ответ

2 голосов
/ 26 июня 2019

Если у вас есть оконный менеджер, который поддерживает модальные окна, вы можете использовать set_modal в диалоговом окне.

Если нет, вы можете использовать set_sensitive в родительском окне.Назовите это с False, когда диалоговое окно показано, и с True, когда диалоговое окно скрыто или уничтожено.

Я добавил ниже примеры Gtk3.Я рекомендую вам переключиться на PyGObject и Python 3, прежде чем вкладывать слишком много усилий в устаревший инструментарий.

Пример модального окна:

import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk

window = Gtk.Window(title="Hello World")
window.connect("destroy", Gtk.main_quit)

window.add(Gtk.TextView())
window.show_all()

dialog = Gtk.Window(title="Dialog")
dialog.set_transient_for(window)
dialog.set_modal(True)
dialog.show()

Gtk.main()

Или использовать явное set_sensitive:

import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk

window = Gtk.Window(title="Hello World")
window.connect("destroy", Gtk.main_quit)

window.add(Gtk.TextView())
window.show_all()

dialog = Gtk.Window(title="Dialog")
dialog.set_transient_for(window)
window.set_sensitive(False)

def destroy_cb(widget, data):
    data.set_sensitive(True)

dialog.connect("destroy", destroy_cb, window)
dialog.show()

Gtk.main()
...