我正在尝试使用Gtk开发应用程序,但我在使用GtkOverlay时遇到了问题。如果我有一个带有使用标准容器add方法添加的GtkTextView的GtkOverlay,则文本将被隐藏。但是,所有其他小部件,例如按钮,看起来都很好。更奇怪的是,只有当至少有一个小部件使用add_overlay添加时,才会出现这种行为。


#!/usr/bin/env python
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
USE_OVERLAY = False
win = Gtk.Window()
text_view = Gtk.TextView()
overlay = Gtk.Overlay()
top_button = Gtk.Button()
bottom_button = Gtk.Button()
top_container = Gtk.VBox()
bottom_container = Gtk.VBox()
overlay_str = "( USE_OVERLAY = " + str(USE_OVERLAY) + ")"
win.set_title(overlay_str)
top_button.set_label("I'm a button on top!")
bottom_button.set_label("I'm a button on bottom!")
text_view.get_buffer().set_text("This should be visible")
win.add(overlay)
overlay.add(bottom_container)
bottom_container.pack_start(bottom_button, False, False, 0)
bottom_container.pack_end(text_view, True, True, 0)
if USE_OVERLAY:
overlay.add_overlay(top_container)
top_container.pack_end(top_button, False, False, 0)
win.connect("delete-event", Gtk.main_quit)
overlay.show_all()
win.show_all()
Gtk.main()我有理由相信这不是python的问题,因为实际的应用程序是使用haskell-gi编写的,但是我认为会有更多的人熟悉python。
发布于 2016-09-05 02:27:41
我不知道你在什么系统上运行这个例子,但它对我来说运行得很好。唯一需要注意的是,顶部按钮出现在底部按钮和TextView小部件的上方,因此我必须手动调整Window的大小才能看到文本。你可以在以下视频中看到我的情况的屏幕投射:https://youtu.be/xoAH4OuEM0E
现在,根据你真正想要的是什么,可能会有几个不同的答案。我的建议是将TextView放在ScrolledWindow中。这样,在您需要调整窗口大小之前,TextView至少是可见的。如果文本溢出可见区域,它还会产生提供滚动条的后果。
它可能看起来像这样:
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
USE_OVERLAY = True
win = Gtk.Window()
text_view = Gtk.TextView()
overlay = Gtk.Overlay()
top_button = Gtk.Button()
bottom_button = Gtk.Button()
top_container = Gtk.VBox()
bottom_container = Gtk.VBox()
overlay_str = "( USE_OVERLAY = " + str(USE_OVERLAY) + ")"
win.set_title(overlay_str)
top_button.set_label("I'm a button on top!")
bottom_button.set_label("I'm a button on bottom!")
text_view.get_buffer().set_text("This should be visible")
# This is where the text_view is inserted in a ScrolledWindow
scrolled_window = Gtk.ScrolledWindow()
scrolled_window.add(text_view)
win.add(overlay)
overlay.add(bottom_container)
bottom_container.pack_start(bottom_button, False, False, 0)
# The scrolled_window is inserted in the bottom_container
bottom_container.pack_end(scrolled_window, True, True, 0)
if USE_OVERLAY:
overlay.add_overlay(top_container)
top_container.pack_end(top_button, False, False, 0)
win.connect("delete-event", Gtk.main_quit)
overlay.show_all()
win.show_all()
Gtk.main()你也可以在上面的截屏上看到结果。唯一的缺点是顶部按钮不能像在脚本中那样覆盖底层。但也许这不会困扰你。
https://stackoverflow.com/questions/39319292
复制相似问题