PyGTK: динамическая упаковка меток
Этоизвестная ошибка / проблема что метка в GTK не будет динамически изменяться при изменении родительского элемента. Это одна из тех действительно раздражающих мелких деталей, и я хочу взломать ее, если это возможно.
Я следовал за подходом в16 программное обеспечение, но в соответствии с заявлением об отказе вы не можете изменить его размер меньше. Поэтому я попытался уловка, упомянутая в одном из комментариев (set_size_request
вызовите сигнал обратного вызова), но это приводит к некоторому бесконечному циклу (попробуйте и посмотрите).
У кого-нибудь есть другие идеи?
(Вы не можете заблокировать сигнал только на время разговора, так какprint
утверждения, по-видимому, указывают на то, что проблема начинается после выхода из функции.)
Код ниже. Вы можете увидеть, что я имею в виду, если вы запустите его и попытаетесь изменить размер окна больше, а затем меньше. (Если вы хотите увидеть исходную проблему, закомментируйте строку после «Подключиться к сигналу выделения размера», запустите ее и увеличьте размер окна.)
Файл Glade ("example.glade"):
<?xml version="1.0"?>
<glade-interface>
<!-- interface-requires gtk+ 2.16 -->
<!-- interface-naming-policy project-wide -->
<widget class="GtkWindow" id="window1">
<property name="visible">True</property>
<signal name="destroy" handler="on_destroy"/>
<child>
<widget class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="label" translatable="yes">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).</property>
<property name="wrap">True</property>
</widget>
</child>
</widget>
</glade-interface>
Код 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()