【问题标题】:Python GTK: Instantiating a subclass of gtk.BinPython GTK:实例化 gtk.Bin 的子类
【发布时间】:2013-02-26 23:16:59
【问题描述】:

我正在尝试用 Python 编写一个 GTK 小部件,它是 gtk.Bin 的子类,但我不确定如何实例化它。我班的前几行看起来像:

class Completer(gtk.Bin):

    def __init__(self, exts)):

        gtk.Container.__init__(self)
        child = gtk.VBox(spacing=15)
        self.add(child)

我不确定如何设置子属性,因此我不知道如何设置它的代码。但是它挂断了 gtk.Container.__init__(self) 的消息:

  File "C:\Users\462974\Documents\Local Sandbox\tools\python\packages\GUI\tools\SNCompleter.py", line 133, in __init__
    gtk.Container.__init__(self)
TypeError: cannot create instance of abstract (non-instantiable) type `GtkBin'

如果我调用 gtk.Bin.__init__ 也会发生这种情况。我不确定如何初始化这个子类,但大概有一种方法,因为 GTK 确实有 gtk.Bin 的可用子类。

【问题讨论】:

    标签: python gtk pygtk


    【解决方案1】:

    您需要为您的小部件注册一个新的 gtype,否则它将使用与超类相同的,并且由于它是一个抽象类,您将无法实例化它(如异常所示)。

    有两种注册新 gtype 的方法:

    1. 使用gobject.type_register
    2. 在您的类中设置__gtype_name__ 类变量。

    这是一个使用第二种选择的示例(因为我认为更直接):

    class Completer(gtk.Bin):
        __gtype_name__= "Completer"
    
        def __init__(self, exts, *args, **kwargs):
            super(Completer, self).__init__(*args, **kwargs)
            child = gtk.VBox(spacing=15)
            self.add(child)
    

    【讨论】:

    • 我这样做了,它现在成功运行,但小部件没有显示,即使我将所有内容打包在 self.child 中并在顶级应用程序上调用 show_all。
    • 我在尝试从GtkBin 继承时遇到了类似的问题,但使用的是pygobject 而不是pypgtkHere 是我当时提出的问题,显然GtkBin 的绑定有问题,可能pygtk 上也是一样的
    • 子类化 gtk.Framegtk.Viewport 而不是 gtk.Bin 也解决了小部件不显示的问题。
    猜你喜欢
    • 2023-04-08
    • 2013-06-10
    • 2011-12-31
    • 1970-01-01
    • 2020-03-31
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多