Есть такая особенность в GTK, что если положить с помощью gtk_expander_set_label_widget в GtkExpander активируемый виджет вроде GtkCheckButton или GtkSwitch, то активируемый виджет вроде как работает (можно кликнуть по нему и получить статус "active"), но отрисовывается не правильно. Например, в случае GtkCheckButton не рисуется галочка, даже если кнопка в активном состоянии. В принципе даже из названия "label_widget" видно, что разработчиками не закладывалось, что кто-то будет туда класть какой-то активный элемент, максимум GtkLabel или картинку. Однако есть способ заставить активные виджеты работать, если виджет класть в Expander уже после того, как Expander сформирован.

Ниже пример на питоне. Отмечу, что обязательно нужно класть в label_widget GtkBox, а уже в него складывать свои активные виджеты. Функцию hacked_idle можно объявить один раз и использовать для всех Expander'ов.


import gi, sys
from gi.repository import Gtk, GLib


def hacked_idle(expander):
  hbox = expander.get_label_widget()
  expander.set_label_widget(None)
  expander.set_label_widget(hbox)
  return False

def expander_realize_cb(widget):
  GLib.idle_add(hacked_idle, widget)
  return False


class Test:
  def __init__(self):
    window = Gtk.Window()
    window.set_default_size(640, 480)
    window.connect_after("destroy", self.destroy)

    exp = Gtk.Expander()
    exp.connect("realize", expander_realize_cb)
    exp.set_expanded(True)
    window.add(exp)

    hbox = Gtk.Box(Gtk.Orientation.HORIZONTAL, 5)
    exp.set_label_widget(hbox)

    check = Gtk.CheckButton()
    check.set_label("Hi, There!!");
    hbox.add(check)

    switch = Gtk.Switch()
    hbox.add(switch)

    big_label = Gtk.Label()
    big_label.set_markup("<big>Hello, World!!!</big>")
    exp.add(big_label)

    window.show_all()

  def destroy(window, self):
    Gtk.main_quit()

def main():
  app = Test()
  Gtk.main()

if __name__ == "__main__":
    sys.exit(main())


 

Copyright © 2007 DamnSmallBlog. Content is licensed under Creative Commons Attribution-Noncommercial.

Design: GeckoandFly and Blogcrowds.