在 aGtk.Toolbar
我有一个Gtk.MenuToolButton
带有箭头的我想将 a 关联到Gtk.Menu
,最好是在 Glade 中构建。
我的代码是这样的:
self.menuToolButtonCalculate.set_menu(self.get_object("menuCalculate"))
其中self.menuToolButtonCalculate
是通过Gtk.Builder.get_object
方法获得的,self 是 的子类的一个实例Gtk.Builder
。
加载窗口时,该程序在终端中显示了一些Gtk/Gdk-CRITICAL
警告,当我单击箭头时,程序崩溃了。在显示窗口之前,我还在 Python 代码中填充了Gtk.Menu
Glade 中定义的内容,但程序仍然崩溃,所以我现在确定问题不在于菜单为空。
出于测试目的,我用它替换了该行:
self.menuToolButtonCalculate.set_menu(Gtk.Menu())
该程序Gtk/Gdk-CRITICAL
在加载窗口时仍会在终端中显示警告,但是当我单击箭头时程序不会崩溃,它会在箭头附近显示一个空的上下文菜单。
这些Gtk/Gdk-CRITICAL
警告是:
(python2.exe:14672): Gtk-CRITICAL **: gtk_widget_set_size_request: assertion 'GTK_IS_WIDGET (widget)' failed
(python2.exe:14672): Gtk-CRITICAL **: gtk_container_add: assertion 'GTK_IS_CONTAINER (container)' failed
(python2.exe:14672): Gdk-CRITICAL **: gdk_window_get_height: assertion 'GDK_IS_WINDOW (window)' failed
(python2.exe:14672): Gtk-CRITICAL **: gtk_widget_reparent: assertion 'priv->parent != NULL' failed
(python2.exe:14672): Gdk-CRITICAL **: gdk_window_get_width: assertion 'GDK_IS_WINDOW (window)' failed
(python2.exe:14672): Gdk-CRITICAL **: gdk_device_get_position_double: assertion 'GDK_IS_DEVICE (device)' failed
我使用安装了最新更新的 Windows 10 Pro x64、安装了最新更新的 MSYS2 以及 MSYS2、x86 版本:Python 2.7.13、Glade 3.20 和 GTK+ 3.22。
更新:
简化的测试代码奇怪地完美运行,在终端中没有崩溃或警告:
例子1.glade
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.20.0 -->
<interface>
<requires lib="gtk+" version="3.20"/>
<object class="GtkMenu" id="menu">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<object class="GtkWindow" id="window1">
<property name="can_focus">False</property>
<child>
<object class="GtkToolbar">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkMenuToolButton" id="menuToolButton">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">__glade_unnamed_2</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
</object>
</child>
</object>
</interface>
例子1.py
# coding=utf-8
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk
b = Gtk.Builder()
b.add_from_file("example1.glade")
w = b.get_object("window1")
mtb = b.get_object("menuToolButton")
m = b.get_object("menu")
mtb.set_menu(m)
w.connect("delete-event", Gtk.main_quit)
w.show_all()
Gtk.main()
原来的程序太大了,不能全部放在这里。请告诉我您希望我发布原始代码中的哪些详细信息,以便您可以帮助我。
更新 2:
在主程序的 Glade .ui 文件中,我定义了 GtkMenu:
<object class="GtkMenu" id="menuCalculate">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="tearoff_state">True</property>
<property name="tearoff_title">Ce dorești să calculez?</property>
</object>
如果我删除最后两个元素(导致程序行为发生变化的元素是tearoff_state
)
<object class="GtkMenu" id="menuCalculate">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
当我单击Glade 文件GtkMenuToolButton
中声明的 箭头时,程序不会崩溃并且会打开一个空菜单。GtkMenu
所以问题只是由GtkMenu
在 Glade 中创建的没有父级的并且tearoff_state
属性所要求的引起的。
- 如果这是真的,将父级设置
GtkMenu
为GtkMenuToolButton
(箭头)的推荐方法是什么,最好在 Glade 中,但至少在代码中? - 据我所见,不可能
GtkMenu
在 Glade 中填充项目,所以我必须从代码中填充它。这是真的?