使用 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 3 库运行 javaFx 应用程序?

    如何强制 javaFx 应用程序使用 gtk3 库 我知道SWT允许设置SWT GTK3 1用于此目的的环境变量 javaFx 是否有类似的可能性 解决方法 新功能 8087516 对 Linux 上的 GTK 3 有条件支持 https
  • GTK C# 小部件更改颜色不起作用

    我试图通过使用更改 GTK 中按钮小部件的颜色 button1 ModifyBase Statetype Normal new Gdk Color 1 1 1 这是从另一个按钮单击事件调用的 但小部件颜色未更新 为什么是这样 您可以只使用M
  • 如何使用 css 代码单独设置 gtk 小部件的样式

    在这之后GTK 将字体更改为旋转按钮 https stackoverflow com questions 47083294 gtk change font to spin button和这个为什么 CSS 样式没有应用于 GTK 代码 ht
  • 如何使用 PyGTK 和 PyCairo 在窗口中获得透明背景?

    我一直在努力使用 PyGTK 创建一个没有装饰和透明背景的窗口 然后我会用 Cairo 绘制窗口的内容 但我无法让它发挥作用 我尝试了很多不同的方法 但都失败了 这是其中之一 usr bin env python import pygtk
  • 如何获取图标名称的完整文件路径?

    如何从 GNOME 中的图标名称获取完整文件路径 import gtk icon theme gtk icon theme get default icon info icon theme lookup icon my icon name
  • 在 virtualenv 中通过 pip 安装 PyGObject [重复]

    这个问题在这里已经有答案了 我实际上正在将旧的 django 应用程序从 python2 7 升级到 python3 4 通过 pip 安装 pygobject 时 出现此错误 Collecting pygobject Using cach
  • 使用 Python/PyGObject 在 Windows 中加载 GTK-Glade 翻译

    我有一个 Python 脚本 可以加载可翻译的 Glade GUI 在 Linux 下一切工作正常 但我在理解 Windows 上的必要步骤时遇到了很多困难 Linux 下似乎需要的只是 import locale locale setlo
  • GTK 滚动窗口 - 将滚动条保持在底部

    我有一个使用 ScrolledWindow 的 GTK C 程序 我不断将数据添加到滚动窗口内的列表中 并且我想将注意力集中在最新的项目上 但我还想允许用户滚动数据以选择旧项目 有没有办法做到这一点 我到处都找过了 但什么也没找到 我不太清
  • 在 GTK+ (gtkD) 中处理按键

    我正在玩gtkD http www dsource org projects gtkd GTK 的 D 绑定 我有一个window对象 实例gtk MainWindow 我想处理它的按键 How 如何处理特殊键 例如箭头键 pgup pgd
  • 使用 Xamarin 主题的 Gtk 应用程序非一致性执行

    我有一个 mkbundled mono 应用程序 其中嵌入了 mono 我使用 platypus 创建了一个独立的包 我使用以下内容加载 Mac 主题 Xamarin Gtk Rc Parse Default gtkrc 主题是Xamari
  • 如何查明 Ubuntu 上安装了哪个版本的 GTK+?

    我需要确定 Ubuntu 上安装了哪个版本的 GTK 男人似乎不帮忙 这个建议 https stackoverflow com a 126145 会告诉您安装了哪个 2 0 的次要版本 不同的主要版本将具有不同的包名称 因为它们可以在系统上
  • 适用于 KDE 和 Gnome 的 Gui [重复]

    这个问题在这里已经有答案了 我想为一个现在是 CLI 的应用程序编写一个 gui 它需要在 KDE 和 Gnome DE 中 看起来不错 充分利用用户的外观设置 如果我选择 Qt 或 GTK 我能够做到这一点吗 它们与两个 DE 集成良好吗
  • Python GTK + webkit - 在 gtk.main() 之后插入 JavaScript

    我在终端中尝试了这个 一切正常 但是如果我在脚本内运行这个 我无法在 gtk main 之后插入 JavaScript import gtk import webkit w gtk Window b webkit WebView w add
  • 在哪里可以找到有关 Gtkmm 的良好文档? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 似乎很难找到有关 Gtkmm 主题的高质量文档 Gtkmm 有好的文档吗 如果有的话 我在哪里可以找到
  • Visual Studio 2010 中的 GTK#

    我一整天都在尝试让 GTK 在 Windows Server 2008 R2 x64 上的 Visual Studio 2010 中工作 以便我可以开始编写漂亮的跨平台 GUI 应用程序 但我对 C 有点陌生 我有一个世界的麻烦 我安装了最
  • gtk 最小尺寸

    有没有一种简单的方法来要求 GTK 小部件具有最小宽度 高度 我知道你可以在a列上做到这一点TreeView 但是它适用于一般的小部件吗 对于 C C gtk widget set size request http library gno
  • 对于 pygtk 应用程序来说,什么是好的嵌入式浏览器?

    我计划在我的 pygtk 应用程序中使用嵌入式浏览器 并且我正在 gtkmozembed 和 pywebkitgtk 之间进行辩论 两者之间有什么引人注目的区别吗 还有我不知道的第三种选择吗 应该注意的是 我不会使用它来访问网络上的内容 我
  • 重写 PyGObject 中的虚拟方法

    我正在尝试实施高宽几何管理 http developer gnome org gtk3 3 2 GtkWidget html geometry management在 GTK 和 Python 中用于我的自定义小部件 我的小部件是来自的子类
  • Python - 可编辑 Gtk.TreeView 单元格中的自动完成

    我最近在 QTable 中使用 QComboBox 编写 PyQt 代码 QComboBox 默认启用自动完成功能 我想尝试用 Gtk3 在 Python3 中重现这个 我遇到过这个例子 Gtk TreeView 中的 Gtk Entry
  • 在菜单中显示 gtk.Calendar?

    我想构建一个上下文菜单 其中包含用于选择日期的菜单项 用例是在树视图中选择一堆项目 然后为所有项目设置新的截止日期 由于菜单项是 Gtk Bin 因此我可以指定任何小部件来代替标签 然而 我似乎无法interact与小部件 如果我单击菜单上

随机推荐

  • 找不到 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