Gtk.TextView叠加Gtk.FlowBox后仅显示TextView的问题
解决Gtk.Overlay中TextView遮挡FlowBox的问题
问题原因
Gtk.TextView默认使用不透明背景,会完全覆盖下方的Gtk.FlowBox,导致底层控件无法显示。
解决方法
有两种常用修复方式,可根据需求选择:
方法1:设置TextView背景透明
通过样式修改将TextView背景设为透明,即可看到下方的FlowBox:
import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk window = Gtk.Window() window.set_default_size(200, 200) window.connect("destroy", Gtk.main_quit) overlay = Gtk.Overlay() window.add(overlay) flowbox = Gtk.FlowBox() for _ in range(4): flowbox.add(Gtk.Button.new_with_label("Button")) overlay.add(flowbox) textbuffer = Gtk.TextBuffer() textbuffer.set_text("Text TEXT") textview = Gtk.TextView.new_with_buffer(textbuffer) # 给TextView设置透明背景 css_provider = Gtk.CssProvider() css_provider.load_from_data(b"textview { background-color: transparent; }") textview.get_style_context().add_provider(css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION) overlay.add_overlay(textview) window.show_all() Gtk.main()
方法2:启用Overlay穿透属性
取消注释代码中的overlay.set_overlay_pass_through(textview, True),同时可调整TextView的大小或位置,避免完全覆盖底层控件:
import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk window = Gtk.Window() window.set_default_size(200, 200) window.connect("destroy", Gtk.main_quit) overlay = Gtk.Overlay() window.add(overlay) flowbox = Gtk.FlowBox() for _ in range(4): flowbox.add(Gtk.Button.new_with_label("Button")) overlay.add(flowbox) textbuffer = Gtk.TextBuffer() textbuffer.set_text("Text TEXT") textview = Gtk.TextView.new_with_buffer(textbuffer) # 限制TextView大小,避免完全覆盖底层控件 textview.set_size_request(100, 50) # 启用穿透属性,让底层控件能接收交互事件 overlay.set_overlay_pass_through(textview, True) overlay.add_overlay(textview) window.show_all() Gtk.main()
补充说明
- 方法1适合需要TextView保持原有大小,但要显示底层内容的场景
- 方法2不仅能显示底层内容,还能让底层控件响应鼠标交互(比如点击按钮),适合需要交互操作的场景
内容的提问来源于stack exchange,提问作者Olumide
相关产品推荐
相关产品推荐

