我将我的代码分散在几个文件中,但我不知道如何让子文件与主文件交互。
示例 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
文件,我们应该得到如下内容:
点击添加游戏菜单选项后,标签会发生变化。
关于许多文件中的 python GTK+ 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47311204/