You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python3中如何从子类调用父类的自定义构造方法?

解决Gtk.ComboBox子类调用new_with_entry()构造方法的TypeError问题

问题原因

Gtk的new_with_entry()是类方法,并非常规构造函数。Python的GObject绑定中,子类默认会调用父类的默认构造逻辑,这与你期望使用new_with_entry()创建带Entry实例的路径冲突,从而抛出TypeError。

正确实现方式

通过重写子类的__new__方法,直接调用父类的new_with_entry()创建目标实例,再在__init__中完成自定义初始化:

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

class ComboBoxEntry(Gtk.ComboBox):
    def __new__(cls, *args, **kwargs):
        # 调用父类的类方法创建带Entry的ComboBox实例
        return Gtk.ComboBox.new_with_entry()
    
    def __init__(self, *args, **kwargs):
        # 无需调用super().__init__,__new__已生成正确实例
        # 获取内置的Entry控件
        self.entry = self.get_child()
        
        # 自定义初始化逻辑示例
        # 设置下拉列表模型
        model = Gtk.ListStore(str)
        model.append(["选项A"])
        model.append(["选项B"])
        self.set_model(model)
        # 绑定Entry文本与模型的第一列
        self.set_entry_text_column(0)
        # 设置Entry提示文本
        self.entry.set_placeholder_text("输入或选择选项...")

# 测试代码
if __name__ == "__main__":
    win = Gtk.Window(title="自定义ComboBoxEntry测试")
    combo = ComboBoxEntry()
    win.add(combo)
    win.connect("destroy", Gtk.main_quit)
    win.show_all()
    Gtk.main()

关键说明

  • __new__方法负责实例创建,这里直接复用父类的new_with_entry()生成带Entry的ComboBox实例,确保实例类型符合要求。
  • __init__方法仅处理自定义逻辑,无需再调用父类构造函数,避免触发默认构造路径的冲突。

内容的提问来源于stack exchange,提问作者Shpenat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 22:40:30