GtkOverlay隐藏了GtkTextView

时间:2016-09-04 16:51:21

标签: python user-interface haskell gtk

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

enter image description here

enter image description here

#!/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。

1 个答案:

答案 0 :(得分:1)

我不知道你运行这个例子的系统是什么,但它对我来说很好。唯一需要注意的是,顶部按钮显示在底部按钮和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()

您还可以在上述截屏视频中看到结果。唯一的缺点是顶部按钮无法覆盖底部层,就像在脚本中一样。但也许它不会打扰你。