Python 从GtkBin扩展

Python 从GtkBin扩展,python,gtk,gtk3,gobject,custom-widgets,Python,Gtk,Gtk3,Gobject,Custom Widgets,我正在尝试制作一个自定义小部件,它类似于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.

我正在尝试制作一个自定义小部件,它类似于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、边距、对齐等)上尝试了各种属性组合,但都没有成功
  • 如果与其他小部件结合使用,当我以交互方式查询小部件分配的高度时,它通常为1。在屏幕上,小部件实际上没有出现(因为它在其他小部件之间有些“挤压”)

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

出于某种原因,
Gtk.Bin
没有给它的子部件分配空间。如果您实现了
do\u size\u allocate
virtual方法,那么它就可以工作了。我不知道为什么不调用默认实现

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继承更适合您的目的;它是一个单子容器,周围有一个可设置样式的边框,这正是您想要的。而且它的大小分配方法也很有效。

为什么不只是子类
Gtk.Entry
?这个想法是小部件有一个“边框”,与nautilus中使用的提到的快速搜索小部件相同(比如)。另一种选择是自己绘制额外的边界,但鉴于这种情况,我将扩展GtkBox。问题是GtkBin的创建是为了这样扩展的,所以我的问题是要弄清楚它为什么不能按预期工作。在这种情况下,为什么不看看Nautilus是如何实现这个搜索小部件的呢?这超出了问题的范围,我知道如何实现它,它正在使用GtkBox。问题的关键是为什么我不能使用GtkBin。我想使用这个小部件,因为它非常适合我的实现。我不知道还有什么可以说得更清楚。谢谢你的回答!我将尝试一下(这两种解决方法和使用GtkFrame),看看在我的案例中有什么效果更好:3