У меня есть 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, но с возможностью выбора капли текста как одного фрагмента. Как это может быть сделано?