Какой хороший способ сделать таблицу, полную меток, редактируемых / выбираемых?

У меня есть GtkTable, содержащий несколько отображаемых GtkLabel данных. Эти метки могут иметь форматирование (например, выравнивание, заполнение, цвет переднего плана). Пример того, как может выглядеть таблица:

Дисплей --- GtkTable, заполненный GtkLabels

Каждая строка информации в этой таблице отображается в собственном GtkLabel, прикрепленном к таблице, которую вы видите. Теперь я пытаюсь сделать данные доступными для выбора и, возможно, редактируемыми. Это кажется не очень простым делом, учитывая, что данные распределены по нескольким виджетам (каждый в своем собственном GtkLabel), и, похоже, нет никакого способа сделать текст доступным для выбора в нескольких виджетах. Я придумал собственное решение этой проблемы:

По сути, я упаковываю GtkTable в GtkEventBox, чтобы я мог регистрировать события в таблице, а также, упакованный в блоке событий (ну, его дочерний VBox), представляет собой GtkTextView, который содержит тот же текст (неформатированный), что и тот, что находится в GtkTable. Это текстовое представление будет служить редактируемой и выбираемой областью, которую я хочу из таблицы. Для достижения этой функциональности я сохраняю видимость таблицы и текстового поля напротив друг друга ... поэтому, будучи упакованными поверх друг друга в поле, они кажутся одним и тем же виджетом, который переключает «режимы».

Текстовое представление:

Редактируемый - GtkTextView, содержащий тот же текст, что и на дисплее

Таким образом, с этим переключением видимости я могу прикрепить некоторые сигналы к окну событий, например, событие нажатия кнопки / отпускания и события типа фокусировки / выхода, чтобы получить желаемый режим таблицы.

Пример кода для лучшего понимания:

eventbox = gtk.EventBox()
vbox = gtk.VBox()
table = gtk.Table() #Create the table, and fill it with labels
textview = gtk.TextView() #Create the textview, and set its textbuffer to the same data as the table

eventbox.add(vbox)
vbox.pack_start( table )
vbox.pack_start( textview )
eventbox.connect( "button-release-event", toggle_mode )
textview.connect( 'focus-out-event', toggle_mode )

def toggle_mode( widget, event ):
    if table.get_visible():
        table.set_visible( False )
        textview.set_visible( True )
    else:
        table.set_visible( True )
        textview.set_visible( False )

Итак, мой вопрос: это хороший метод для того, чего я хочу достичь? Есть ли у кого-нибудь другой опыт или лучший способ сделать это? В конечном итоге я хотел бы иметь красиво отформатированный текст, очень похожий на то, как GtkTable, заполненный отформатированным видом GtkLabel, но с возможностью выбора капли текста как одного фрагмента. Как это может быть сделано?


person Wes    schedule 13.03.2012    source источник


Ответы (1)


Я рекомендую просто использовать GtkTextView для всего, но если вы настаиваете на использовании GtkLabel для внешнего вида, тогда ваш метод ничем не хуже других (еще один популярный метод для такого рода вещей - использовать GtkNotebook со скрытыми вкладками).

Однако вам все еще нужна визуальная индикация, чтобы сообщить пользователю, что он может редактировать текст. Возможно, переключатель.

person Johannes Sasongko    schedule 14.03.2012
comment
Я рассматривал возможность использования GtkTextView, но меня беспокоит только форматирование. Я знаю, что есть текстовые таблицы и тому подобное, чтобы получить раскраску и форматирование текста, но также очень важно, чтобы я мог получить там выравнивание и заполнение. У меня есть несколько таблиц с несколькими столбцами, каждый из которых выровнен определенным образом. Могу ли я получить такую ​​функциональность от GtkTextView? - person Wes; 14.03.2012
comment
Я уверен, что выравнивание можно изменить, не знаю о текстовых таблицах или отступах. Так что да, то, что вы объяснили в вопросе, вероятно, лучший способ. - person Johannes Sasongko; 15.03.2012
comment
Спасибо за предложение. В итоге я использовал несколько GtkTextView, упакованных вместе в GtkHBox (каждое из текстовых представлений представляло собой столбец в таблице). Этот метод позволил мне получить выбираемый / редактируемый текст для каждого столбца и по-прежнему позволяет мне форматировать его так, как мне нравится. - person Wes; 17.03.2012