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

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

The Display---a GtkTable filled with GtkLabels

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

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

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

The Editable--A GtkTextView containing the same text as in the Display

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

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

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

1 Ответ

2 голосов
/ 14 марта 2012

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

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

...