美文网首页
Python GTK 3 GUI 编程 -- 005 容器#3

Python GTK 3 GUI 编程 -- 005 容器#3

作者: bokerr | 来源:发表于2020-12-06 11:32 被阅读0次

    这篇文章讲下自适应盒子

    • 什么是自适应盒子

    简单来说, 就是一个盒子里有非常多个子控件, 这个盒子会根据窗口大小自动调整每行控件的数量.


    Flowbox 1 Flowbox 2

    flowbox需要放在一个可滚动的窗口(Gtk.ScrolledWindow)中
    否则Flowbox会因为空间不足而超过你的屏幕, 就像这样


    Failed Flowbox

    Gtk.ScrolledWindow -> 继承自Gtk.Bin, 也是容器的一种, 这个比较像窗口, 里面只能放一个子控件, 如果子控件的显示区域不足, 他就会自动添加一个滚动条(Scroll bar)来显示全部内容
    使用方法 直接 使用add(child) 方法来添加子控件, 下面会用到

    如何创建一个Flowbox

    实例化Gtk.Flowbox self.flowbox = Gtk.Flowbox()
    添加控件只需要 self.flowbox.add(child) 就可以了

    示例

    Flowbox 1

    原始码实现

    import gi
    gi.require_version("Gtk", "3.0")
    
    from gi.repository import Gtk
    
    
    class MyWindow(Gtk.Window):
        def __init__(self):
            super(MyWindow, self).__init__(title="Flowbox")
    
            self.flowbox = Gtk.FlowBox(max_children_per_line=30)
            self.scroll_window = Gtk.ScrolledWindow()
            self.scroll_window.add(self.flowbox)
            self.flowbox_child_create(self.flowbox)
            self.add(self.scroll_window)
    
        def flowbox_child_create(self, flowbox):
            for i in range(0, 50):
                flowbox.add(Gtk.Button(label=f"{i}"))
    
    win = MyWindow()
    win.connect("destroy", Gtk.main_quit)
    win.show_all()
    Gtk.main()
    

    如果不想让子控件填充至全窗口
    加一个valign的属性
    self.flowbox = Gtk.FlowBox(max_children_per_line=30, valign=Gtk.Align.START)
    效果是这样的


    再看看上面的图, 找下区别

    常用属性

    • column_spacing 列间隔 int
    • row_spacing 行间隔
    • homogeneous 每个子控件是否拥有相同尺寸 bool
    • max_children_per_line 每行最多子控件数量 int
    • min_children_per_line 每行最少子控件数量 int
    • selection_mode 选择模式, 接受 Gtk.SelectionMode

    Gtk.SelectionMode 枚举类型
    NONE = 0 无法选择
    SINGLE = 可以有0个或1个被选择
    BROWSE = 必须有一个被选择
    MULTIPLE = 可以选择多个

    常用方法

    • add(child) 添加控件

    • insert(widget, position) 插入控件在第几个位置, 如果position为负数或大于当前flowbox的长度, 则添加在末尾

    • remove(child) 移除控件

    • get_child_at_index(index) 获取第n号的控件

    • get_child_at_pos(left, top) 通过坐标来获取控件


      坐标
    • get_selected_children() 获取选择的控件, 返回一个GLib.List, 其实就是一个列表, 可以索引

    • select_all() 选择所有的控件(只有当选择模式是mutiple的时候有效)

    • select_child(child) 选择控件

    • unselect_all() 取消选择所有的控件(只有当选择模式是mutiple的时候有效)

    • unselect_child(child) 取消选择控件

    • select_foreach(func, *data) 为所有选择的控件执行某个函数

    • 然后就是一个设置和获取属性的方法, 很简单, 不写了

    • 例如, 设置column_spacing就是 set_column_spacing(int), 获取就是get_column_spacing()

    常用信号

    • add 添加
    • remove 移除
    • destroy flowbox被摧毁
    • selected-children-changed 选择的子控件改变
    • select-all 选择所有
    • unselect-all 取消选择所有

    欢迎大家留言, 下篇文章讲下堆叠容器(stack)和堆叠切换器(stack switch) 我不知道这个控件的中文是什么, 所以翻译可能有点怪, 哈哈

    相关文章

      网友评论

          本文标题:Python GTK 3 GUI 编程 -- 005 容器#3

          本文链接:https://www.haomeiwen.com/subject/jnxowktx.html