L'Isola di Niente
L'Isola di Niente » PyGObject Tips » オーナメント

オーナメント

いわゆる装飾

GtkFrame

見ての通りのコンテナ、ダイアログに少し色気を付けたい場合とかに。
#!/usr/bin/env python3

from gi.repository import Gtk

class FrameDlg(Gtk.Dialog):
    def __init__(self):
        Gtk.Dialog.__init__(
                self,
                "Frame",
                None,
                Gtk.DialogFlags.MODAL,
                (Gtk.STOCK_OK, Gtk.ResponseType.OK))
        # RadioButtons
        vbox_radio = Gtk.Box.new(Gtk.Orientation.VERTICAL, 0)
        root = None
        for s in ("HONDA CBR250R", "YAMAHA YZF-R250", "KAWASAKI Ninja250"):
            radio = Gtk.RadioButton.new_with_label_from_widget(root, s)
            if not root:
                root = radio
            vbox_radio.pack_start(radio, False, False, 0)
        # GtkFrame
        frame = Gtk.Frame.new("400cc")
        frame.add(vbox_radio)
        #
        self.vbox.pack_start(frame, False, False, 0)
        self.show_all()

dlg = FrameDlg()
dlg.run()
dlg.destroy()
img2/frame.png

GtkAspectFrame

親ウインドウをリサイズしても指定されたアスペクト比を保持するコンテナ。
GtkFrame のサブクラスですが画像や映像又は 2D グラフィックの表示等に便利。
#!/usr/bin/env python3

from gi.repository import Gtk
import cairo

class AspectFrameWin(Gtk.Window):
    def __init__(self):
        """
            label 引数を NULL ポインタにすればラベル無しの枠になる
            gtk_aspect_frame_new (const gchar *label,
                                  gfloat xalign,
                                  gfloat yalign,
                                  gfloat ratio,
                                  gboolean obey_child);
        """
        Gtk.Window.__init__(self)
        self.set_title("16:9 を保持")
        self.connect("delete-event", Gtk.main_quit)
        #
        da = Gtk.DrawingArea()
        da.connect("draw", self.on_draw)
        # GtkAspectFrame
        frame = Gtk.AspectFrame.new(None, 0.5, 0.5, 16.0/9.0, False)
        frame.add(da)
        self.add(frame)
        self.resize(300, 150)
        self.show_all()

    def on_draw(self, widget, cr):
        width = widget.get_allocated_width()
        height = widget.get_allocated_height()
        # cairo_t を引き伸ばす
        cr.scale(width, height)
        # バッテンを書く
        cr.set_source_rgb(0, 0, 0)
        cr.move_to(0, 0)
        cr.line_to(1, 1)
        cr.move_to(1, 0)
        cr.line_to(0, 1)
        cr.set_line_width(0.2)
        cr.stroke()

AspectFrameWin()
Gtk.main()
img2/aspectframe.png

GtkSeparator

単なるセパレータ。
GtkHSeparator, GtkVSeparator も非推奨で GtkOrientation 指定です。
#!/usr/bin/env python3

from gi.repository import Gtk
import cairo

class SeparatorWin(Gtk.Window):
    def __init__(self):
        """
            ちょっと見え辛いよねコレ
        """
        Gtk.Window.__init__(self)
        self.set_title("Separator")
        self.connect("delete-event", Gtk.main_quit)
        #
        l1 = Gtk.Label("ココに→")
        l2 = Gtk.Label("←セパレータがある")
        sp = Gtk.Separator.new(Gtk.Orientation.VERTICAL)
        hbox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 0)
        hbox.pack_start(l1, False, False, 0)
        hbox.pack_start(sp, False, False, 0)
        hbox.pack_start(l2, False, False, 0)
        self.add(hbox)
        self.show_all()

SeparatorWin()
Gtk.main()
img2/separator.png
Copyright(C) sasakima-nao All rights reserved 2002 --- 2017.