окно появляется только после нажатия на экран

Я использую pygtk для графического интерфейса на компьютере с сенсорным экраном для машинного пользовательского интерфейса. Пользователь может в любой момент сохранить актуальную конфигурацию машины. Когда он нажимает кнопку «сохранить конфигурацию», на экране появляется виртуальная клавиатура, которую я реализовал, чтобы он мог ввести имя конфигурации. Моя проблема в том, что эта клавиатура не появляется сразу после нажатия кнопки «сохранить конфигурацию». Нужно дождаться следующего щелчка в любом месте экрана, чтобы он появился.

Вот класс keyboard:

class keyboard():

def __init__(self):     

    window = gtk.Window(gtk.WINDOW_TOPLEVEL) 
    window.set_position(1)
    window.set_keep_above(True)
    window.connect("destroy", lambda w: window.destroy())
    window.set_transient_for(self.gui.window) #self.gui.window is the main window
    window.set_destroy_with_parent(True)
    window.set_skip_taskbar_hint(True)
    window.set_skip_pager_hint(True)
    window.connect("delete_event",window.hide_on_delete)
    window.deiconify()
    window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_SPLASHSCREEN)
    window.set_size_request(KBD_WIN_WIDTH,KBD_WIN_HEIGHT)
    window.set_resizable(False)

    table = gtk.Table(rows=5, columns=12, homogeneous=True)
    frame = gtk.Frame()
    frame.add(table)
    window.add(frame)
    """
    ... code to fill the table with buttons
    """
    self.window = window

А вот функция обратного вызова, вызываемая после нажатия на кнопку «сохранить конфигурацию»:

def save_cfg_clicked(self,widget):
    keyboard_ = keyboard(self)
    keyboard_.window.set_keep_above(True)
    keyboard_.window.set_modal(True)
    keyboard_.window.show_all()

Я пробовал несколько вещей, таких как вызов функции window.show_all с помощью gobject.idle_add, но это не помогло.

Обратите внимание, что я использую рабочий стол xfce. Эта проблема не возникает, когда программа работает в Gnome.


person sarah vb    schedule 25.09.2013    source источник
comment
Похоже на проблему с оконным менеджером. Некоторые оконные менеджеры требуют, чтобы вы нажимали на экран, чтобы решить, где разместить окно. Я не знаю, делает ли это Xfce, но TWM определенно делает это. Может быть, подключение мыши продемонстрирует это более четко, чем использование сенсорного экрана?   -  person Jeremy Visser    schedule 25.09.2013
comment
Проблема остается, когда я нажимаю на кнопку с помощью мыши   -  person sarah vb    schedule 25.09.2013
comment
Я хочу сказать, что когда окно создается впервые, оконный менеджер обычно создает контур (который перемещается вместе с курсором мыши). После щелчка окно помещается туда, где находится контур, и появляется. Единственная причина, по которой я предложил мышь, состоит в том, чтобы сделать более очевидным наличие контура (чтобы подтвердить, верна ли моя теория).   -  person Jeremy Visser    schedule 25.09.2013
comment
Из-за строки window.set_position(1) окно всегда появляется в центре и не связано с положением курсора в момент последнего клика. Однако я нашел обходной путь, см. Мой ответ.   -  person sarah vb    schedule 25.09.2013


Ответы (1)


При удалении строки:

window.set_transient_for(self.gui.window)

проблема исчезает.

person sarah vb    schedule 25.09.2013