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

如何为PyGTK文件选择对话框添加多个自定义控件?

如何为PyGTK的Gtk.FileChooserDialog添加多个自定义控件?

我通过以下代码创建标准文件选择对话框:

dialog = Gtk.FileChooserDialog(
    title="Select a File",
    action=Gtk.FileChooserAction.OPEN)

想给它添加复选框和下拉组合框,但单独添加单个控件可以正常工作:

cb = Gtk.CheckButton("Only media files")
dialog.set_extra_widget(cb)

但添加多个控件时,先后调用set_extra_widget会覆盖之前的设置,仅显示最后一个控件:

cb = Gtk.CheckButton("Only media files")
dialog.set_extra_widget(cb)

db = Gtk.ComboBoxText()
db.append_text("Option 1")
db.append_text("Option 2")
db.set_active(0)
dialog.set_extra_widget(db)

尝试用HBox容器包裹控件后设置为额外控件,却没有任何内容显示:

cb = Gtk.CheckButton("Only media files")
db = Gtk.ComboBoxText()
db.append_text("Option 1")
db.append_text("Option 2")
db.set_active(0)

hbox = Gtk.HBox(spacing=10)
hbox.pack_start(cb, False, False, 0)
hbox.pack_start(db, False, False, 0)

dialog.set_extra_widget(hbox)

后来尝试将容器添加到对话框的content_area中,依然无效:

cb = Gtk.CheckButton("Only media files")
db = Gtk.ComboBoxText()
db.append_text("Option 1")
db.append_text("Option 2")
db.set_active(0)

hbox = Gtk.HBox(spacing=10)
hbox.pack_start(cb, False, False, 0)
hbox.pack_start(db, False, False, 0)

dbox = dialog.get_content_area()
dbox.pack_start(hbox, False, False, 0)

最小可复现代例:

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

def on_button_clicked(button):
    dialog = Gtk.FileChooserDialog(
        title="Select a File",
        action=Gtk.FileChooserAction.OPEN)

    # 8< -------------------
    cb = Gtk.CheckButton("Only media files")
    db = Gtk.ComboBoxText()
    db.append_text("Option 1")
    db.append_text("Option 2")
    db.set_active(0)

    hbox = Gtk.HBox(spacing=10)
    hbox.pack_start(cb, False, False, 0)
    hbox.pack_start(db, False, False, 0)

    dbox = dialog.get_content_area()
    dbox.pack_start(hbox, False, False, 0)
    # 8< -------------------

    response = dialog.run()

    dialog.destroy()

window = Gtk.Window()
window.set_default_size(300, 100)
window.connect("destroy", Gtk.main_quit)
button = Gtk.Button(label="Open FileChooserDialog")
button.connect("clicked", on_button_clicked)
window.add(button)
window.show_all()
Gtk.main()

解决方法

方法1:使用set_extra_widget + 容器并显示控件

set_extra_widget确实只能设置一个控件,但可以传入一个容器(如Box),只要确保容器和内部控件都被显示即可。注意Gtk3中Gtk.HBox已被弃用,推荐使用Gtk.Box并指定水平方向:

cb = Gtk.CheckButton("Only media files")
db = Gtk.ComboBoxText()
db.append_text("Option 1")
db.append_text("Option 2")
db.set_active(0)

# 创建水平容器(Gtk3推荐写法)
hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10)
hbox.pack_start(cb, False, False, 0)
hbox.pack_start(db, False, False, 0)

# 显示容器及内部所有控件
hbox.show_all()
dialog.set_extra_widget(hbox)

方法2:添加到content_area并调整显示

如果要添加到get_content_area()获取的容器中,同样需要手动显示控件,还可以通过参数调整控件位置:

cb = Gtk.CheckButton("Only media files")
db = Gtk.ComboBoxText()
db.append_text("Option 1")
db.append_text("Option 2")
db.set_active(0)

hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10)
hbox.pack_start(cb, False, False, 0)
hbox.pack_start(db, False, False, 0)

dbox = dialog.get_content_area()
# 添加容器到内容区域,设置外边距
dbox.pack_start(hbox, False, False, 10)
# 显示容器及内部控件
hbox.show_all()
# 可选:调整控件顺序,比如放在文件列表上方
# dbox.reorder_child(hbox, 0)

完整修复后的示例代码

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

def on_button_clicked(button):
    dialog = Gtk.FileChooserDialog(
        title="Select a File",
        action=Gtk.FileChooserAction.OPEN)

    # 8< -------------------
    cb = Gtk.CheckButton("Only media files")
    db = Gtk.ComboBoxText()
    db.append_text("Option 1")
    db.append_text("Option 2")
    db.set_active(0)

    # 使用Gtk3推荐的水平容器
    hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10)
    hbox.pack_start(cb, False, False, 0)
    hbox.pack_start(db, False, False, 0)

    # 方法1:设置为额外控件
    hbox.show_all()
    dialog.set_extra_widget(hbox)

    # 方法2(可替换方法1):添加到content_area
    # dbox = dialog.get_content_area()
    # dbox.pack_start(hbox, False, False, 10)
    # hbox.show_all()
    # 8< -------------------

    # 添加对话框交互按钮(原示例遗漏)
    dialog.add_button(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL)
    dialog.add_button(Gtk.STOCK_OPEN, Gtk.ResponseType.OK)

    response = dialog.run()
    dialog.destroy()

window = Gtk.Window()
window.set_default_size(300, 100)
window.connect("destroy", Gtk.main_quit)
button = Gtk.Button(label="Open FileChooserDialog")
button.connect("clicked", on_button_clicked)
window.add(button)
window.show_all()
Gtk.main()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 18:40:54