从GtkBin扩展

2024-04-19 07:32:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试制作一个自定义小部件,类似于Gtk在所有类似TreeView的小部件上使用的“快速搜索”条目。在

以下是我最初想法的一个简化示例:

from gi.repository import Gtk

class QuickSearch(Gtk.Bin):
    def __init__(self, *args, **kwargs):
        super(QuickSearch, self).__init__(*args, **kwargs)
        self.add(Gtk.Entry())

win = Gtk.Window()
win.connect("delete-event", Gtk.main_quit)
search = QuickSearch()
win.add(search)
win.show_all()
Gtk.main()

问题如下:

  • 如果我单独使用它,如本例中所示,似乎有空间分配给自定义小部件,但是GtkEntry不会显示在屏幕上。我尝试了GtkEntry和自定义小部件(hexpand、vexpand、margins、aligns等)的各种属性组合,但都没有效果。在
  • 如果与其他小部件组合,当我交互式地查询小部件分配的高度时,平均值为1。在屏幕上,小部件实际上不会出现(因为它在其他部件之间有点“挤压”)。在

那么,在对象初始化或如何使用这个自定义小部件时,我遗漏了一些东西?这是GtkBin特有的问题吗?我试着用一个GtkBox做同样的事情,但我认为GtkBin更适合这个特定的小部件。在


Tags: selfaddgtksearch屏幕initmain部件
1条回答
网友
1楼 · 发布于 2024-04-19 07:32:09

由于某些原因,Gtk.Bin没有为其子级分配空间。如果实现do_size_allocate虚拟方法,那么它就可以工作了。为什么没有调用默认实现,我不知道。在

from gi.repository import Gtk, Gdk

class QuickSearch(Gtk.Bin):
    def __init__(self, *args, **kwargs):
        super(QuickSearch, self).__init__(*args, **kwargs)
        self.add(Gtk.Entry())

    def do_size_allocate(self, allocation):
        self.set_allocation(allocation)
        child_allocation = Gdk.Rectangle()
        border_width = self.get_border_width()
        child_allocation.x = allocation.x + border_width
        child_allocation.y = allocation.y + border_width
        child_allocation.width = allocation.width - 2 * border_width
        child_allocation.height = allocation.height - 2 * border_width
        self.get_child().size_allocate(child_allocation)

win = Gtk.Window()
win.connect("delete-event", Gtk.main_quit)
search = QuickSearch()
win.add(search)
win.show_all()
Gtk.main()

但是,我认为从Gtk.Frame继承更适合您的目的;它是一个子容器,其周围有可样式化的边框,这正是您想要的。其大小分配方法有效。在

相关问题 更多 >