PyGTK: динамическое обертывание маркировки

Это - известная ошибка/проблема, которой динамично не изменит размеры маркировка в GTK, когда родитель изменится. Это - одна из тех действительно раздражающих маленьких деталей, и я хочу бездельничать он, если это возможно.

Я следовал за подходом в 16 программном обеспечении, но согласно правовой оговорке Вы не можете тогда изменить размеры его меньший. Таким образом, я делал попытку приема, упомянутого в одном из комментариев ( set_size_request звоните в обратный вызов сигнала), но это приводит к своего рода бесконечному циклу (попробуйте его и посмотрите).

У кого-либо есть какие-либо другие идеи?

(Вы не можете заблокировать сигнал только на время вызова, с тех пор как print операторы, кажется, указывают, проблема запускается после того, как функцию оставляют.)

Код ниже. Вы видите то, что я имею в виду, выполняете ли Вы его и пытаетесь изменить размеры больше окна и затем меньшего. (Если Вы хотите видеть исходную проблему, прокомментировать строку после того, как "Подключение к размеру - выделяет сигнал", работает это и изменяет размеры больше окна.)

Файл Поляны ("example.glade"):



  
  
  
    True
    
    
      
        True
        In publishing and graphic design, lorem ipsum[p][1][2] is the name given to commonly used placeholder text (filler text) to demonstrate the graphic elements of a document or visual presentation, such as font, typography, and layout. The lorem ipsum text, which is typically a nonsensical list of semi-Latin words, is a hacked version of a Latin text by Cicero, with words/letters omitted and others inserted, but not proper Latin[1][2] (see below: History and discovery). The closest English translation would be "pain itself" (dolorem = pain, grief, misery, suffering; ipsum = itself).
        True
      
    
  

Код Python:

#!/usr/bin/python

import pygtk
import gobject
import gtk.glade

def wrapped_label_hack(gtklabel, allocation):
    print "In wrapped_label_hack"
    gtklabel.set_size_request(allocation.width, -1)
    # If you uncomment this, we get INFINITE LOOPING!
    # gtklabel.set_size_request(-1, -1)
    print "Leaving wrapped_label_hack"

class ExampleGTK:

    def __init__(self, filename):
        self.tree = gtk.glade.XML(filename, "window1", "Example")
        self.id = "window1"
        self.tree.signal_autoconnect(self)

        # Connect to the size-allocate signal
        self.get_widget("label1").connect("size-allocate", wrapped_label_hack)

    def on_destroy(self, widget):
        self.close()

    def get_widget(self, id):
        return self.tree.get_widget(id)

    def close(self):
        window = self.get_widget(self.id)
        if window is not None:
            window.destroy()
        gtk.main_quit()

if __name__ == "__main__":
    window = ExampleGTK("example.glade")
    gtk.main()

9
задан detly 12 December 2009 в 15:24
поделиться

2 ответа

VMware libview имеет виджет под названием WrapLabel , который должен делать то, что вы хотите, но на C ++. Перевод Python доступен в репозитории Meld (отдельно от busybox.py ).

3
ответ дан 4 December 2019 в 14:28
поделиться

Можно использовать это. Не уверен, откуда она взялась изначально. Создайте свой лейбл, а затем вызовите label_set_autowrap(label)

def label_set_autowrap(widget): 
    "Make labels automatically re-wrap if their containers are resized.  Accepts label or container widgets."
    # For this to work the label in the glade file must be set to wrap on words.
    if isinstance(widget, gtk.Container):
        children = widget.get_children()
        for i in xrange(len(children)):
            label_set_autowrap(children[i])
    elif isinstance(widget, gtk.Label) and widget.get_line_wrap():
        widget.connect_after("size-allocate", _label_size_allocate)


def _label_size_allocate(widget, allocation):
    "Callback which re-allocates the size of a label."
    layout = widget.get_layout()
    lw_old, lh_old = layout.get_size()
    # fixed width labels
    if lw_old / pango.SCALE == allocation.width:
        return
    # set wrap width to the pango.Layout of the labels
    layout.set_width(allocation.width * pango.SCALE)
    lw, lh = layout.get_size()  # lw is unused.
    if lh_old != lh:
        widget.set_size_request(-1, lh / pango.SCALE)
2
ответ дан 4 December 2019 в 14:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: