У меня есть GtkTable, которая содержит несколько данных GtkLabel, которые она отображает. Для этих меток может быть выполнено форматирование (то есть выравнивание, заполнение, цвет переднего плана).
Пример того, как может выглядеть таблица:
Каждая строка информации в этой таблице отображается в своем собственном GtkLabel, прикрепленном к таблице, которую вы видите. Сейчас я пытаюсь сделать данные выбираемыми и, возможно, редактируемыми. Это кажется не очень простым делом, учитывая, что данные распределены по нескольким виджетам (каждый в своем собственном GtkLabel), и, похоже, нет никакого способа сделать выбор текста несколькими виджетами. Я придумал собственное решение этой проблемы:
По сути, я упаковываю GtkTable в GtkEventBox, чтобы я мог зарегистрировать события в таблице, а также упаковал в ящик для событий (ну, его дочерний VBox) GtkTextView, который содержит тот же текст (не отформатированный), что и что в GtkTable. Это текстовое представление будет служить редактируемой и выбираемой областью, которую я хочу из таблицы. Для достижения этой функциональности я сохраняю видимость таблицы и текстового представления противоположными друг другу ... поэтому, будучи упакованными поверх друг друга в окне, они выглядят как тот же виджет, который переключает «режимы».
Текстовое представление:
Таким образом, с этим переключением видимости я могу прикрепить некоторые сигналы к окну событий, скажем, событиям нажатия кнопки / отпускания и типа фокусировки / выхода, чтобы получить желаемый режим таблицы.
Пример кода для лучшего понимания:
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, но с возможностью выбора большого объема текста как одного куска. Как это можно сделать?