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
相关产品推荐
相关产品推荐

