PyGTK: динамическая упаковка меток

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

Я следовал за подходом в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()

Ответы на вопрос(7)

Ваш ответ на вопрос