许多文件中的 python GTK+ 操作

标签 python python-3.x gtk gtk3

我将我的代码分散在几个文件中,但我不知道如何让子文件与主文件交互。

示例 fichier1:

#!/usr/bin/env python3
# coding: utf-8

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

class MainWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self)

        self.grid = Gtk.Grid()
        self.add(self.grid)

        self.label = Gtk.Label("An example of a Label widget.")

        self.menuBar = Menu()

        self.grid.attach(self.menuBar, 0, 0, 1, 1)
        self.grid.attach(self.label, 1, 0, 1, 1)

    def onClick(self, button):
        self.label.set_label('Test OK')

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

Fichier2:

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

class Menu(Gtk.Grid):

menuUi= "/home/vianney/programmes/Menu.ui"

def __init__(self):
    Gtk.Grid.__init__(self)

    action_group = Gtk.ActionGroup("my_actions")

    self.AddActionMenu(action_group)

    uimanager = self.create_ui_manager()
    uimanager.insert_action_group(action_group)

    menubar = uimanager.get_widget("/MenuBar")

    self.attach(menubar, 0, 0, 1, 1)

def AddActionMenu(self, action_group):
    action_group.add_actions([
        ("ActionMenu", None, "Edition"),
        ("AddGame", None, "Add Game", None, None, self.AddGame)
    ])

def AddGame(self, widget):
    self.label.set_label('Test OK')

def create_ui_manager(self):
    uimanager = Gtk.UIManager()
    uimanager.add_ui_from_file(self.menuUi)
    return uimanager

这是菜单文件:

<ui>
    <menubar name='MenuBar'>
        <menu action='ActionMenu'>
            <menuitem action='AddGame' />
        </menu>
    </menubar>
</ui>

在这个例子中,我会更改文件 1 中的标签内容属于文件 2 菜单

非常感谢您的帮助

最佳答案

有很多方法可以实现您的目标,但遵循常见的 Gtk 方式,就是为您自己的自定义复合小部件创建信号。

让我们创建一个名为 add-game-clicked 的信号,因此当用户单击该菜单选项时,将触发/发出 Menu 类中的信号。

要在您的代码上执行此操作,我们添加:

self.menu.connect ("add-game-clicked", self.onAddGameClicked)

然后,将方法 onClick 重命名为更有意义的名称,例如 onAddGameClicked

因此,您的主要 Python 文件,我们称之为 main.py,将是:

#!/usr/bin/env python3
# coding: utf-8

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

class MainWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self)

        self.grid = Gtk.Grid()
        self.add(self.grid)

        self.label = Gtk.Label("An example of a Label widget.")

        self.menuBar = Menu()
        self.menuBar.connect ("add-game-clicked", self.onAddGameClicked)

        self.grid.attach(self.menuBar, 0, 0, 1, 1)
        self.grid.attach(self.label, 1, 0, 1, 1)

    def onAddGameClicked(self, widget):
        self.label.set_label('Test OK')

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

然后我们需要在您的自定义复合小部件上创建一个信号。为此,我们添加:

__gsignals__ = {
    'add-game-clicked': (GObject.SIGNAL_RUN_FIRST, None, ())
}

在类定义下面,然后在正确的事件发生时发出信号:

def AddGame(self, widget):
    self.emit("add-game-clicked")

重要的是要说 python 是:缩进,缩进,缩进,而你的 TestMenu.py 文件没有正确缩进。

所以你的TestMenu.py文件应该是这样的:

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

class Menu(Gtk.Grid):

    __gsignals__ = {
        'add-game-clicked': (GObject.SIGNAL_RUN_FIRST, None, ())
    }

    menuUi= "Menu.ui"

    def __init__(self):
        Gtk.Grid.__init__(self)

        action_group = Gtk.ActionGroup("my_actions")

        self.AddActionMenu(action_group)

        uimanager = self.create_ui_manager()
        uimanager.insert_action_group(action_group)

        menubar = uimanager.get_widget("/MenuBar")

        self.attach(menubar, 0, 0, 1, 1)

    def AddActionMenu(self, action_group):
        action_group.add_actions([
            ("ActionMenu", None, "Edition"),
            ("AddGame", None, "Add Game", None, None, self.AddGame)
        ])

    def AddGame(self, widget):
        self.emit("add-game-clicked")

    def create_ui_manager(self):
        uimanager = Gtk.UIManager()
        uimanager.add_ui_from_file(self.menuUi)
        return uimanager

另请注意,在此上下文中设置文件的完整路径并不好。在您的项目中使用相对路径,否则事情会变得过于死板且不便于移植。

使用提供的 Menu.ui 文件,我们应该得到如下内容:

result

点击添加游戏菜单选项后,标签会发生变化。

关于许多文件中的 python GTK+ 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47311204/

相关文章:

python - Django-ckeditor 无法在 html 中正确显示

global-variables - 在 config.py 中提供全局配置变量的大多数 Pythonic 方式?

python - 如何从 Python 中创建的 Dataframe 中删除索引?

rust - 如何使用 gtk-rs 在列表存储/ TreeView 中右对齐数字数据

c - 在 GtkLabel 中插入图像?

python - 将 main() 函数中的用户 input() 传递到下一个函数中的字符串

python - 使用 ctypes 数组作为 numpy 数组时的 PEP 3118 警告

python - 如何将 Python 3 与 Google App Engine 本地开发服务器一起使用

python - 使用 python lxml 获取 Excel xml 的父属性

python - Gtk.Treeview 通过信号和代码取消选择行