Программная фокусировка бегемота. CanvasEntry? - PullRequest
2 голосов
/ 01 октября 2008

Рассмотрим эту программу на Python, которая использует PyGtk и Hippo Canvas для отображения текстовой метки, которую можно нажимать. Щелчок по текстовой метке заменяет его виджетом Hippo CanvasEntry, который содержит текст метки.

import pygtk
pygtk.require('2.0')
import gtk, hippo

def textClicked(text, event, row):
    input = hippo.CanvasEntry()
    input.set_property('text', text.get_property('text'))
    parent = text.get_parent()
    parent.insert_after(input, text)
    parent.remove(text)

def main():
    canvas = hippo.Canvas()
    root = hippo.CanvasBox()
    canvas.set_root(root)

    text = hippo.CanvasText(text=u'Some text')
    text.connect('button-press-event', textClicked, text)
    root.append(text)

    window = gtk.Window()
    window.connect('destroy', lambda ignored: gtk.main_quit())
    window.add(canvas)

    canvas.show()
    window.show()

    gtk.main()

if __name__ == '__main__':
    main()

Каким образом CanvasEntry, созданный при нажатии на текстовую метку, автоматически фокусируется во время создания?

1 Ответ

2 голосов
/ 01 октября 2008

Под CanvasEntry находится обычный старый gtk.Entry, который необходимо запросить фокус, как только он станет видимым. Вот модифицированная версия вашей функции textClicked, которая делает именно это:

def textClicked(text, event, row):
    input = hippo.CanvasEntry()
    input.set_property('text', text.get_property('text'))
    entry = input.get_property("widget")
    def grabit(widget):
        entry.grab_focus()
    entry.connect("realize", grabit)
    parent = text.get_parent()
    parent.insert_after(input, text)
    parent.remove(text)
...