{Gtk.Window.set_attached_to`真的是在Wayland中相对于小部件放置弹出窗口的正确方法吗?

set_attached_to似乎是在Wayland中相对于小部件放置弹出窗口的正确方法:

  

例如,指定此关系有用的地方的示例是[...]由Gtk创建的完成弹出窗口。条目[...]

不幸的是,这只会产生一个错误

  

Gdk消息:12:13:16.143:窗口0x1822340是一个没有父窗口的临时窗口,应用程序将无法在屏幕上定位它。

尝试取消对popup.set_parent(entry)行的注释只会添加警告:

  

(try_entry_popup.py:4539):Gtk警告**:12:17:34.185:无法在顶级窗口小部件上设置父项

后面是相同的错误。

这是一个最小的示例:

#!/usr/bin/env python
# stripped down from https://gitlab.gnome.org/GNOME/gtk/issues/1541#note_396391

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

entry = Gtk.Entry()
popup = Gtk.Window(type=Gtk.WindowType.POPUP)
#popup.set_parent(entry)
popup.set_attached_to(entry)
popup.show_all()

layout = Gtk.VBox()
layout.pack_start(entry,False,True,0)

window = Gtk.Window()
window.connect("destroy",Gtk.main_quit)
window.add(layout)
window.show_all()

Gtk.main()

entry completion source看来,它肯定应该可以工作。 是否使用私有功能?还是我想念什么?

martinddiigg 回答:{Gtk.Window.set_attached_to`真的是在Wayland中相对于小部件放置弹出窗口的正确方法吗?

嗯,不是真的:gtk_window_set_attached_to与定位无关,这对于可访问性(a11y)和正确地应用主题很重要。如果您想放置弹出窗口,则可以按照https://gitlab.gnome.org/GNOME/gtk/blob/075dcc142aa525778268165095de019b736f3efa/gtk/gtkentrycompletion.c#L1597

中的操作进行操作

这是一个非常简单的实现:

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

def on_button_clicked(widget):
  popup = Gtk.Window(type=Gtk.WindowType.POPUP)
  # optionally you may set an appropriate type hint,but it's not required.
  popup.set_attached_to(entry)
  popup.set_transient_for(window)

  gdk_window = entry.get_window()
  gdk_window_origin = gdk_window.get_origin()
  x = gdk_window_origin[1]
  y = gdk_window_origin[2]
  allocation = entry.get_allocation()
  x += allocation.x
  y += allocation.y + allocation.height

  popup.move(x,y)
  popup.show_all()

button = Gtk.Button()
button.connect('clicked',on_button_clicked)
entry = Gtk.Entry()
layout = Gtk.VBox()
layout.pack_start(button,False,True,0)
layout.pack_start(entry,0)

window = Gtk.Window()
window.connect("destroy",Gtk.main_quit)
window.add(layout)
window.show_all()

Gtk.main()
本文链接:https://www.f2er.com/3124526.html

大家都在问