Как сделать GtkTextView похожим на GtkEntry?

Или "Как добавить видимую (тонкую) границу в GtkTextView"? Возможно ли это?

Заранее спасибо.


person Paulo Freitas    schedule 05.06.2011    source источник
comment
Зачем вам так запутывать пользователей?   -  person ptomato    schedule 08.06.2011
comment
@ptomato Мне нужно то же самое. Не путать пользователя, а не путать пользователя. Мне нужен 3-строчный текстовый виджет, который ведет себя точно так же, как виджет ввода (но с 3 строками). Единственный способ, который я мог найти, - это изменить виджет TextView...   -  person xubuntix    schedule 11.11.2012
comment
@ptomato Без этого пользователи будут сбиты с толку (даже я запутался).   -  person Akib Azmain    schedule 23.11.2020


Ответы (4)


Спустя годы... но поиск в Интернете по-прежнему не дает хороших ответов на этот вопрос.

Решение довольно простое: просто создайте GtkFrame и добавьте GtkScrolledWindow, содержащее GtkTextView, вот пример кода на python:

frame = Gtk.Frame()
scroll = Gtk.ScrolledWindow()
scroll.set_hexpand( True )
scroll.set_border_width( 3 )
textview = Gtk.TextView()
scroll.add( textview )
frame.add( scroll )
person Martin    schedule 11.06.2017
comment
Нет необходимости в GtkFrame; GtkScrolledWindow достаточно. - person Akib Azmain; 23.11.2020

Примерно через 9 с половиной лет...

Я собираюсь дать независимый от языка ответ.

Во-первых, добавьте GtkScrolledWindow, это позволит прокручивать. Теперь добавьте свой GtkTextView. Затем установите для типа тени значение, отличное от none. Он покажет границу вокруг вашего GtkTextView.

person Akib Azmain    schedule 23.11.2020
comment
Интересный обходной путь. IMO было бы проще, если бы разработчики GTK просто добавили поддержку этого как есть, но в качестве обходного пути это нормально; Я думал об использовании gtk-frame. Полезно знать, что прокручиваемое окно также можно использовать. - person shevy; 24.01.2021

Используя редактор Glade:

  • В редакторе поля выберите свой ScrolledWindow (вы же упаковали TextView в ScrolledWindow, не так ли? :)), если нет - выберите свой текстовое представление).
  • Выберите вкладку Формы виджета -> Общие.
  • Найдите и настройте свойство Ширина границы по своему вкусу.

Из кода:

вызвать set_border_width(width) метод виджета-контейнера (либо ScrolledWindow, либо TextView)

Обратите внимание, что в любом случае TextArea не будет точно выглядеть как Entry, и это зависит от используемой темы gtk+.

person barti_ddu    schedule 06.06.2011

Использование gtk.ScrolledWindow.set_shadow_type(type=gtk.SHADOW_ETCHED_IN) улучшит внешний вид, но не будет соответствовать стилю gtk.Entry.

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

import gtk

# create an entry widget that we use for appearances only
e=gtk.Entry()
e.set_size_request(width=250, height=150)

# create a texview and accompaying label
lbl = gtk.Label(str="Comments: ")
lbl.set_alignment(xalign=1, yalign=0)
field = gtk.TextView(buffer=None)
field.set_wrap_mode(wrap_mode=gtk.WRAP_WORD) # or gtk.WRAP_CHAR

# we need a scroll window
sw = gtk.ScrolledWindow(hadjustment=None, vadjustment=None)
sw.set_border_width(border_width=4)
sw.set_size_request(width=250, height=150)
sw.set_policy(hscrollbar_policy=gtk.POLICY_NEVER, vscrollbar_policy=gtk.POLICY_AUTOMATIC)
sw.add(field)

# create more widgets as needed for form here...
lbl2 = gtk.Label(str="email: ")
lbl2.set_alignment(xalign=1, yalign=0)
field2 = gtk.Entry()

# put everything in a table so the fields and labels are all aligned 
tbl = gtk.Table(rows=1, columns=2, homogeneous=False)
tbl.attach(lbl, left_attach=0, right_attach=1, top_attach=0, bottom_attach=1, xoptions=gtk.FILL|gtk.SHRINK, yoptions=gtk.FILL, xpadding=0, ypadding=0)
# sw and e must be attached in this order, the reverse will not work
tbl.attach(sw, left_attach=1, right_attach=2, top_attach=0, bottom_attach=1, xoptions=gtk.FILL|gtk.SHRINK, yoptions=gtk.FILL, xpadding=0, ypadding=0)
tbl.attach(e, left_attach=1, right_attach=2, top_attach=0, bottom_attach=1, xoptions=gtk.FILL|gtk.SHRINK, yoptions=gtk.FILL, xpadding=0, ypadding=0)
# comment out previous line to see difference

# attach other widgets here...
tbl.attach(lbl2, left_attach=0, right_attach=1, top_attach=1, bottom_attach=2, xoptions=gtk.FILL|gtk.SHRINK, yoptions=gtk.FILL, xpadding=0, ypadding=0)
tbl.attach(field2, left_attach=1, right_attach=2, top_attach=1, bottom_attach=2, xoptions=gtk.FILL|gtk.SHRINK, yoptions=gtk.FILL, xpadding=0, ypadding=0)

# display it!
window = gtk.Window()
window.set_default_size(350, 200)
window.connect("destroy", lambda w: gtk.main_quit())
window.add(tbl)
window.show_all()

gtk.main()

Предостережение в том, что полосы прокрутки становятся невидимыми; его можно выбрать, и прокрутка работает как обычно. Это может быть незначительной проблемой, если данные, которые нужно ввести в поле, обычно не используют прокрутку.

person Dave    schedule 31.07.2013