使用 PyGObject 正确构建并突出显示 GtkPopoverMenu

2024-03-23

我正在尝试举一个正确的例子Gtk.HeaderBar with Gtk.PopoverMenus显示了如何使用不同的小部件。我查看了很多示例和代码,但无法弄清楚如何工作Gtk.ModelButton.

尤其这个句子 https://developer.gnome.org/gtk3/stable/GtkModelButton.html对我来说没有意义:

当通过“action-name”和“action-target”属性指定操作时,按钮的角色(即是否是普通按钮、复选按钮或单选按钮)由操作的类型确定,而不是由操作的类型决定。必须使用“role”属性明确指定。

无论如何,我尝试在 PopoverMenu 中仅使用普通小部件,从而导致突出显示不一致(应突出显示整行):

所以我的问题是:怎样ModelButtons子类化,因此它们看起来是正确的PopoverMenu- 小部件?

这是Python代码:

from gi.repository import Gtk, Gio

class HeaderBarWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="HeaderBar & PopoverMenu")
        self.set_border_width(10)
        self.set_default_size(400, 400)
        builder = Gtk.Builder()
        objects = builder.add_objects_from_file("popovermenu_layout.xml", ("pom_options", ""))
        pom_opt = builder.get_object("pom_options")
        builder.connect_signals(self)

        hb = Gtk.HeaderBar()
        hb.set_show_close_button(True)
        hb.props.title = "HeaderBar & PopoverMenu"
        self.set_titlebar(hb)

        def on_click(button, popovermenu):
            """
            Toggles the respective popovermenu.
            """
            if popovermenu.get_visible():
                popovermenu.hide()
            else:
                popovermenu.show_all()

        button_opt = Gtk.Button()
        icon = Gio.ThemedIcon(name="format-justify-fill-symbolic")
        image = Gtk.Image.new_from_gicon(icon, Gtk.IconSize.BUTTON)
        button_opt.add(image)
        hb.pack_end(button_opt)
        pom_opt.set_relative_to(button_opt)
        button_opt.connect("clicked", on_click, pom_opt)

        self.add(Gtk.TextView())

    def print_something(self, modelbutton, event):
        print("you pressed a button")

    def night_mode_switcher(self, switch, state):
        Gtk.Settings.get_default().set_property("gtk-application-prefer-dark-theme", state)

win = HeaderBarWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()

这是 PopoverMenu 的模型:

<interface>
    <object class="GtkPopoverMenu" id ="pom_options">
      <child>
        <object class="GtkBox">
          <property name="visible">True</property>
          <property name="margin">10</property>
          <property name="orientation">vertical</property>
          <child>
            <object class="GtkModelButton" id="mb_print">
              <property name="visible">True</property>
              <property name="text" translatable="yes">Print</property>
              <property name="can_focus">True</property>
              <property name="receives_default">True</property>
              <signal name="button-press-event" handler="print_something" swapped="no"/>
            </object>
          </child>
          <child>
            <object class="GtkCheckButton" id="checkbutton1">
              <property name="label" translatable="yes">checkbutton</property>
              <property name="visible">True</property>
              <property name="can_focus">True</property>
              <property name="receives_default">False</property>
              <property name="draw_indicator">True</property>
            </object>
          </child>
          <child>
              <object class="GtkBox" id="box1">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <child>
                  <object class="GtkSwitch" id="switch1">
                    <property name="visible">True</property>
                    <property name="can_focus">True</property>
                    <signal name="state-set" handler="night_mode_switcher" swapped="no"/>
                    <property name="margin_start">9</property>
                    <property name="margin_end">9</property>
                  </object>
                  <packing>
                    <property name="expand">False</property>
                    <property name="fill">True</property>
                    <property name="position">0</property>
                  </packing>
                </child>
                <child>
                  <object class="GtkModelButton" id="mb_night">
                    <property name="text" translatable="yes">Night Mode</property>
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="margin_start">9</property>
                    <property name="margin_end">9</property>
                  </object>
                  <packing>
                    <property name="expand">True</property>
                    <property name="fill">True</property>
                    <property name="position">1</property>
                  </packing>
                </child>
              </object>
          </child>
        </object>
      </child>
    </object>
</interface>

我设法解决了我的大部分问题。最重要的是,人们似乎必须使用Gtk.Application and Gtk.ApplicationWindow。我不能说我完全理解为什么,但这使得可以添加Actions形式为Gio.SimpleActions到应用程序。Gtk.Builder解析XML菜单的,并且可以简单地将其添加到菜单中,使用set_popover-方法。然后对于 XML 中定义的每个操作(不要忘记app.-XML 中的前缀)aGio.SimpleAction被创建(没有app.-前缀作为名称)在Python代码中并添加到应用程序中。我有一个普通按钮和一个可以工作的复选按钮。仍在与单选按钮作斗争,但这可能是另一个问题。

这是 Python 代码:

from gi.repository import Gio, Gtk, GLib
import sys


class MainApplication(Gtk.Application):

    def __init__(self):
        Gtk.Application.__init__(self,
                                 application_id="needs.dot",
                                 flags=Gio.ApplicationFlags.FLAGS_NONE)
        #https://developer.gnome.org/gio/unstable/GApplication.html#g-application-id-is-valid
        self.connect("activate", self.activate_window)

    def activate_window(self, app):
        """
        The activate signal of Gtk.Application passes the MainApplication class
        to the window. The window is then set as a window of that class.
        """
        self.window = Gtk.ApplicationWindow()
        self.window.set_default_size(500, 400)

        self.hb = Gtk.HeaderBar()
        self.hb.set_show_close_button(True)
        self.hb.props.title = "HeaderBar & PopOverMenu"
        self.window.set_titlebar(self.hb)

        button_settings = Gtk.MenuButton()
        icon = Gio.ThemedIcon(name="format-justify-fill-symbolic")
        image = Gtk.Image.new_from_gicon(icon, Gtk.IconSize.BUTTON)
        button_settings.add(image)
        self.hb.pack_end(button_settings)

        self.builder = Gtk.Builder()
        self.builder.add_from_file("popovermenu_layout.xml")
        pom_options = self.builder.get_object("pom_options")
        button_settings.set_popover(pom_options)
        #self.builder.connect_signals(self) #Not needed because of using actions?

        app.add_window(self.window)

        #Connects to the action. The first part of the XML name is left away:
        #<property name="action-name">app.print</property>
        #becomes simply "print".
        action_print = Gio.SimpleAction.new("print", None)
        action_print.connect("activate", self.print_something)
        app.add_action(action_print)

        #app.toggle becomes -> toggle
        action_toggle = Gio.SimpleAction.new_stateful("toggle", None, GLib.Variant.new_boolean(False))
        action_toggle.connect("change-state", self.toggle_toggled)
        app.add_action(action_toggle)

        btn = Gtk.Button("Button")
        self.window.add(btn)
        self.window.show_all()

    def print_something(self, action, variable):
        print("something")

    def toggle_toggled(self, action, state):
        action.set_state(state)
        Gtk.Settings.get_default().set_property("gtk-application-prefer-dark-theme", state)

    def on_action_quit_activated(self, action):
        self.app.quit()


if __name__ == "__main__":
    """
    Creates an instance of the MainApplication class that inherits from
    Gtk.Application.
    """
    app = MainApplication()
    app.run(sys.argv)

以及菜单的 XML 文件:

<interface>
    <object class="GtkPopoverMenu" id ="pom_options">
      <child>
        <object class="GtkBox">
          <property name="visible">True</property>
          <property name="margin">10</property>
          <property name="orientation">vertical</property>
          <child>
            <object class="GtkModelButton" id="mb_print">
              <property name="visible">True</property>
              <property name="action-name">app.print</property>
              <property name="can_focus">True</property>
              <property name="receives_default">True</property>
              <property name="label" translatable="yes">Print</property>
            </object>
          </child>
          <child>
            <object class="GtkModelButton" id="mp_toggle">
              <property name="visible">True</property>
              <property name="action-name">app.toggle</property>
              <property name="can_focus">True</property>
              <property name="receives_default">True</property>
              <property name="label" translatable="yes">Night Mode</property>
            </object>
          </child>
        </object>
      </child>
    </object>
</interface>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 PyGObject 正确构建并突出显示 GtkPopoverMenu 的相关文章

  • GTK+ 中的 CSS 样式

    好的 我最近开始使用 GTK 用 C 语言进行编程 我的代码中有一个 GdkToggleButton 我想用 css 添加样式 我在这里阅读了几乎所有 GTK3 文档https developer gnome org gtk3 stable
  • 如何在 MS Windows 上加载 GTK Sharp 主题

    我正在 MS Windows 上使用 Xamarin Studio 5 4 编写 GTK Sharp v2 12 应用程序 安装的Mono版本是3 2 3 但我使用 Net工具链进行编译 因为Xamarin不允许我使用Mono工具链进行编译
  • 如何检查 GTK+3.0 中小部件的类型?

    I saw this https stackoverflow com questions 60112777 find type of gtk widgets帖子 但它是针对 Python 的 所以这对我没有太大帮助 我正在使用 C 进行编程
  • 有哪些可用于 gtk+ 开发的 IDE [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何读出 gtk3 对象的“空地 ID”

    在 Glade 中 可以为对象设置唯一的 ID 在代码中 我们可以通过搜索它的 glade ID 来获取指向该对象的指针gtk builder get object https developer gnome org gtk3 stable
  • 无法在 Mac OSX 上使用 gtk3 FileChooser?

    我将使用 gtk 3 0 构建的程序从 Linux 迁移到 Mac OS X 10 6 8 而且我编译的程序没有错误 但是 在启动程序并选择打开文件后 终端显示以下消息 GLib GIO CRITICAL Settings schema o
  • 如何使用 gtk 信号将多个变量作为数据传递

    我有一个小程序 其中 gtk 信号回调函数需要 2 或 3 个变量 我不想创建这些全局变量 该项目的整个目标是整洁 并且我不想创建整个结构 以便我可以将小部件和编译的正则表达式发送到函数 据我所见g signal connect只允许单个数
  • 更改 GdkPixbuf (GTK3) 中像素的颜色

    我在用着Gtk StatusIcon 并且想要改变某些像素的颜色 我有一段工作代码 它加载一个带有我想要设置的颜色的 1x1 像素 PNG 文件 然后将其复制到图标 Pixbuf 虽然这种方法有效 但它有一个明显的缺点 即必须为每种颜色创建
  • GtKGLArea 无法创建 OpenGL 2.1 上下文

    我目前正在为我的游戏引擎项目开发一个简单的编辑器 虽然该项目似乎在我的主工作站 支持 OpenGL 3 3 的 GTX 650Ti 上运行得很好 但当我在我的设备上测试它时 它似乎被破坏了 测试桌面 GMA4500 最大支持 OpenGL
  • Python3 + PyGobject + GTK3 和 cx_freeze 缺少 DLL

    当我使用 py python3 pygobject gtk3 应用程序制作 exe 时从 pygobject 站点来看 它缺少一些 DLL 文件 缺少什么文件 我已经手动尝试过需要哪些 DLL 因此 如果这对某人有帮助 the 必须进行编辑
  • 如何将一个独立的窗口定位在屏幕上的精确位置?

    我实际上正在开发一个相对复杂的 GTK 2 应用程序 我的应用程序显然有一个主窗口 然后我需要打开一个新的 独立 窗口 我需要将 飞行 窗口放在 中precise屏幕的准确位置 在顶点 of a widget 绘图区域 我需要将新窗口放置在
  • 使用 PyGObject 正确构建并突出显示 GtkPopoverMenu

    我正在尝试举一个正确的例子Gtk HeaderBar with Gtk PopoverMenus显示了如何使用不同的小部件 我查看了很多示例和代码 但无法弄清楚如何工作Gtk ModelButton 尤其这个句子 https develop
  • 在Gtk中,是否可以使小部件淡入淡出?

    我想要一个Label 或者至少是标签上的文字 进行快速淡入 看起来这是可能在混乱中 http blog didrocks fr index php post Design experience and demos in GTK Clutte
  • 更高级别的 Python GUI 工具包,例如为 TreeView/Grid 传递字典

    使用 PyGTK 启动了我的第一个 Python pet 项目 虽然它是一个非常强大的 GUI 工具包并且看起来很棒 但我还是有一些烦恼 所以我考虑转向其他东西 因为它还不太广泛 环顾四周SO https stackoverflow com
  • 如何使用 PyGTK 和 PyCairo 在窗口中获得透明背景?

    我一直在努力使用 PyGTK 创建一个没有装饰和透明背景的窗口 然后我会用 Cairo 绘制窗口的内容 但我无法让它发挥作用 我尝试了很多不同的方法 但都失败了 这是其中之一 usr bin env python import pygtk
  • 无法以编程方式减小 gtk 窗口的大小

    以编程方式调整 gtk 窗口大小时 我似乎遇到了问题 问题是 一旦我将窗口的宽度和高度增加到 800x600 我似乎无法将其缩小回原来的大小 400x200 下面是示例代码 有人遇到过这样的问题吗 include
  • 如何获得 GTK 中的默认颜色?

    Context 在 GTK 3 中 人们可以设置自己的主题 甚至默认主题 Adwaita 也提供两种变体 浅色和深色 当我编写自己的小部件 用Python 时 我需要获取这些颜色以避免在黑色上绘制黑色或在白色上绘制白色 Question 如
  • Python GTK 信号处理程序不工作

    我正在使用 GTK 为 GUI 编写一个 Python 应用程序 我注意到从终端使用 Ctrl C 关闭它不起作用 我发现这是因为一个错误 所以我尝试手动处理该信号 问题是 如果我将默认行为设置为默认行为 则会捕获信号并正确关闭应用程序 但
  • PyGTK+3(PyGObject)创建屏幕截图?

    我过去 3 天在 google 上搜索 如何使用 PyGTK 3 创建屏幕截图 有关于 pyqt pygtk 2 wx 和 PIL 的 gallizion 教程 顺便说一句 我不需要 scrot imlib2 imagemagick 等外部
  • 在 Ubuntu 上用 C 项目编译和链接 GTK 3

    我相信这不是重复的问题 在发布此问题之前我已经看过所有问题 答案 我想我这里的情况有所不同 我使用Ubuntu 12 04并下载GTK 2 和 3 我从 GNOME 网站复制了一个简单的 GTK 源代码 但是当我在终端中使用这个命令时 gc

随机推荐

  • 找不到 Django 媒体 URL

    我遇到了一个奇怪的问题 希望其他地方有人也遇到过同样的问题 我的问题是 django 应用程序中存储的媒体无法通过 MEDIA ROOT URL 提供服务 当我尝试获取列表时使用 URL myhost media 保存在我的应用程序中的媒体
  • 如何在Windows窗体中创建垂直导航栏?

    我正在开发我的学校项目 Windows 窗体应用程序 正如你所看到的 我创建了 3 个面板 一个用于标题 一个用于导航栏 一个用于内容 我可以使标题和导航栏静态化 例如网页中的布局 并在单击按钮时更改内容吗 我创建了几个面板 并更改每个面板
  • 将程序集编译为 x64 有什么优点吗?

    假设我有一个 Net Framework 3 5 SP1 CLR 2 0 应用程序 需要在 x86 和 x64 平台上运行 还假设出于某种原因 我需要创建单独的 x86 和 x64 安装程序 由于我无论如何都有一个特定于 x64 的安装程序
  • R data.table 在 i 语句中使用 max

    这应该很简单 但由于某种原因 data table 没有达到我的预期 我想取一行中两个值的最大值来确定是否应该过滤一行 似乎发生的情况是 max 函数正在查看整个列 这不是我想要的 这是代码 gt test dt lt data table
  • 在哪里可以找到带有源代码的简约 WDM 驱动程序模板? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我遇到过内核模式驱动程序 但经验很少 这就是我想做的 有一个加载驱动程序的用户模式应用程序 让用户模式应用程序写入它 以便向它发送指令 让
  • 如何在选择中进行选择

    我有一个包含唯一 ID 字段的表 另一个字段 REF 包含对另一个数据集的 ID 字段的引用 现在我必须选择 REF 指向不存在的数据集的所有数据集 SELECT FROM table WHERE no dataset with ID RE
  • 使用 CloudFront 时,S3 上的自定义重定向规则返回 403

    我在 S3 上为我的存储桶有一个自定义重定向规则
  • “git pull”坏了

    我最近将 MacBook Pro 升级到 Snow Leopard 并且 git pull 返回 rakudo git pull git pull is not a git command See git help Did you mean
  • 将大端字节集合编组到结构中以提取值

    有一个很有洞察力的问题从字节数组中读取 C 中的 C C 数据结构 https stackoverflow com questions 2871 reading a c c data structure in c from a byte a
  • AND 和 OR 运算符在 Bash 中如何工作?

    我在 bash 中尝试了以下命令 echo this echo that echo other 这给出了输出 this other 我不明白 我的试运行是这样的 echo this echo that echo other暗示true tr
  • IE 中的空白 iFrame

    我有一个 iframe 如果来自externaldomain com的something html有css html position relative 在 IE 中 它将把 iframe 渲染为空白 所有其他浏览器都很好 有人知道解决方案
  • 谷歌浏览器闪烁

    大家好 我是新来的 不是编码员 而是我们即将于 2017 年夏天发布的项目的经理 我的开发人员和编码人员无法找到我们网站仅在 Chrome 上存在闪烁的原因 www playinera com http www playinera com
  • 实体框架:如何捕获任何错误

    我正在尝试将数据插入到具有大量数据的 SQL Server 表中not null限制 CREATE TABLE dbo Customer CustomerId int IDENTITY 1 1 NOT NULL FirstName varc
  • 从 .exe 中提取 .ico 并使用 PyQt 进行绘制的最佳方法?

    我正在寻找一种使用 Python 从 exe 文件中提取图标的方法 我知道你可以使用 win32gui 的 ExtractIconEx 函数来获取 exe 的图标 但这会返回一个 HIcon 资源句柄 这不好 因为我想使用 PyQt 绘制图
  • 如何从 PHP cli 获取 Linux 控制台 $COLUMNS 和 $ROWS?

    我目前正在为 PHP 创建一个新的简洁的 CLI 库 我想计算出它运行的控制台的宽度 高度 我尝试过很多事情 比如挖掘 ENV exec echo COLUMNS 等 但没有结果 而如果我在 bash 命令行中输入 echo COLUMNS
  • 为什么主线程不等待其他异步进程(线程)完成。 allOff 无法正常工作

    我在 for 循环内调用一个异步方法 并将其 future 添加到列表中 我不确定为什么 allOff 不等待完成所有 future 并返回部分结果 看看我的代码 我有一个被重写的方法 Overide Async CompletableFu
  • 在图像的不同部分制作悬停效果,不是html而是img

    Basically i have a blueprint for a building project i need to make it so that when they hover on specific parts of the f
  • Flutter doctor:未安装 Flutter 和 dart 插件

    这是问题 我已经安装了 flutter 和 dart 插件 但它显示我还没有 我刚开始时就新安装了 android studio 和 flutter Doctor summary to see all details run flutter
  • NSPlaceholderDictionary:尝试从对象插入 nil 对象[1]

    我有两个UITextField盒子 一个用于 minPrice 一个用于 maxPrice 当我尝试运行由submitButton IBAction 使用这两个文本字段内容作为参数 它表明对象为空 并出现以下错误 NSPlaceholder
  • 使用 PyGObject 正确构建并突出显示 GtkPopoverMenu

    我正在尝试举一个正确的例子Gtk HeaderBar with Gtk PopoverMenus显示了如何使用不同的小部件 我查看了很多示例和代码 但无法弄清楚如何工作Gtk ModelButton 尤其这个句子 https develop