Как установить текст-заполнитель в Gtk.TextView

До сих пор я использовал Gtk Entry, который предлагает метод set_placeholder_text для установки в нем текста-заполнителя, однако, просматривая документацию, я не нашел такого метода для TextView.

Есть ли способ установить текст-заполнитель в Gtk Textview?


person Pawan Sharma    schedule 31.07.2017    source источник
comment
в Gtk.TextView нет метода, аналогичного Gtk.Entry. Вам придется реализовать его самостоятельно.   -  person José Fonte    schedule 31.07.2017


Ответы (1)


Я думаю, что был вопрос, почти аналогичный этому. Идея состоит в том, чтобы, например, использовать focus-in-event и focus-out-event для проверки содержимого текстового буфера.

Пример:

  1. Установить текст заполнителя в качестве переменной
  2. Установите текст-заполнитель в качестве содержимого текстового буфера древовидного представления по умолчанию.
  3. В фокусе, если текстовый буфер равен заполнителю, это означает отсутствие предыдущего ввода, поэтому удалите текст (текст-заполнитель). В противном случае сохраните содержимое.
  4. При выходе из фокуса, если в текстовом буфере нет текста, установите содержимое в качестве текста-заполнителя. В противном случае ничего не делайте.

Идея состоит в том, что если нет текста или существующий текст является текстом-заполнителем, это означает, что пользовательский ввод отсутствует.

Пример Python

Файл пользовательского интерфейса Glade (сохраните его как placeholder-textview.ui):

<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.20.0 -->
<interface>
  <requires lib="gtk+" version="3.20"/>
  <object class="GtkTextBuffer" id="textbuffer1">
    <property name="text" translatable="yes">Please input text here...</property>
  </object>
  <object class="GtkWindow" id="window1">
    <property name="can_focus">False</property>
    <child>
      <object class="GtkBox">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="orientation">vertical</property>
        <child>
          <object class="GtkButton">
            <property name="label" translatable="yes">button</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <object class="GtkEntry">
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="placeholder_text" translatable="yes">This is an entry and below is a textview</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">1</property>
          </packing>
        </child>
        <child>
          <object class="GtkScrolledWindow">
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="shadow_type">in</property>
            <child>
              <object class="GtkTextView" id="textview1">
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="vexpand">False</property>
                <property name="buffer">textbuffer1</property>
              </object>
            </child>
          </object>
          <packing>
            <property name="expand">True</property>
            <property name="fill">True</property>
            <property name="position">2</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>

Код Python:

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk


def onFocusIn(self, event):
    if (textbuf.get_text(textbuf.get_start_iter(), textbuf.get_end_iter(), True) == placeholderStr):
        textbuf.set_text("")
    return False


def onFocusOut(self, event):
    if (textbuf.get_text(textbuf.get_start_iter(), textbuf.get_end_iter(), True) == ""):
        textbuf.set_text(placeholderStr)
    return False

placeholderStr = "This is the placeholder text..."

builder = Gtk.Builder()
builder.add_from_file("placeholder-textview.ui")

window = builder.get_object("window1")

textbuf = builder.get_object("textbuffer1")
textbuf.set_text(placeholderStr)

textview = builder.get_object("textview1")
textview.connect("focus-in-event", onFocusIn)
textview.connect("focus-out-event", onFocusOut)

window.connect ("destroy", Gtk.main_quit)
window.show_all()

Gtk.main()

Результирующий пользовательский интерфейс:

введите здесь описание изображения

Добавлено несколько виджетов, чтобы сосредоточиться на других виджетах.

Сравните поведение с Gtk.Entry. Это очень похоже.

person José Fonte    schedule 02.08.2017