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

