|
|
ru.linux- RU.LINUX --------------------------------------------------------------------- From : Eugene Morozov 2:5020/400 10 Dec 2002 22:36:21 To : Zahar Kiselev Subject : Re: Хаааачууууу но рмальную IDE под Linux!!! -------------------------------------------------------------------------------- Zahar Kiselev <Zahar.Kiselev@p1.f382.n5030.z2.fidonet.org> writes: > EM> Это элементарно просто: > Hу эту фразу оставим на твоей совести. Виноват :)) > > > прицепиться к событиям, которые > EM> генерируются при перемещении по дереву и сделать то, > EM> что считаешь нужным, а не то, что делает Gtk по > EM> умолчанию.. > А вот примеров этого ни я, ни мой приятель - так и не нашли. > Hигде понятным языком не сказано - как изменить реакцию на нажатия клавиш у > тех элементов интерфейса, которые уже есть в GTK без правки кода и без > написания своих версий этих элементов интерфейса. В документации по GTK приводится информация о том, что такое сигналы в GTK. Это как раз и есть общий ответ на данный вопрос. > Там и еще одна неприятность была - в большинстве программ, сделанных с > использованием GTK, при наличии на экране формы с несколькими полями ввода, > перемещение между ними возможно только последовательно при помощи клавиши TAB. > Особенно это неудобно если полей больше десятка. Вопрос - можно ли сделать > так, чтобы формы обрабатывались в соответствии с идеологией, принятой в > большинстве (бухгалтерских) программ под досом - то есть переход между полями > по стрелкам и подтверждение ввода в каждое поле - enter ? Да, можно. Точно так же определив реакцию на сигналы. Вот максимально упрощенный пример (переключение по Enter между двумя полями ввода, сделать для целой формы будет, очевидно, сложнее): import pygtk pygtk.require('2.0') import gtk import gtk.keysyms def entry_event(entry, event, *ignore): if event.keyval == gtk.keysyms.Return: if entry == entry1: entry2.grab_focus() else: entry1.grab_focus() w = gtk.Window() w.connect('destroy', lambda win: gtk.main_quit()) vbox = gtk.VBox() w.add(vbox) entry1 = gtk.Entry() vbox.pack_start(entry1) entry1.connect('key-release-event', entry_event) entry2 = gtk.Entry() vbox.pack_start(entry2) entry2.connect('key-release-event', entry_event) w.show_all() gtk.main() > > > Hе нужно ничего править ни в Gtk, ни писать > EM> свое дерево, хотя для удобства можно создать подкласс > EM> существующего Gtk дерева, который будет отличаться > EM> только вот таким поведением. > Где можно подсмотреть хотя бы примеры (не говорю о полноценном учебнике) > создания подклассов существующих элементов интерфейса > с измененным поведением? Примеры есть в программах и библиотеках, написанных с использованием GTK. Hе знаю, есть ли другой источник информации.. Может быть, в туториалах каких-нибудь в сети.. Hа python это делается просто. Hапример, создать своё поле ввода, содержимое которого очищается при нажатии F6, можно так: class MyEntry(gtk.Entry): def __init__(self): gtk.Entry.__init__(self) self.connect('key-release-event', self.key_release) def key_release(self, entry, event): if event.keyval == gtk.keysyms.F6: self.set_text('') Теперь в предыдущей программе можно писать 'entry1 = MyEntry()' вместо 'entry1 = gtk.Entry()'. Евгений --- ifmail v.2.15dev5 * Origin: Demos online service (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор Архивное /ru.linux/88231cf73074.html, оценка из 5, голосов 10
|