2017-11-15 12 views
2

私のコードはいくつかのファイルに広がっていますが、どのように子ファイルをメインファイルとやりとりさせるか分かりません。多くのファイルのpython GTK +アクション

例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:この例では、私は、ラベルの内容を変更しているだろう

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

:ここ

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 

は、メニューファイルでありますファイル1はファイル2メニューに属します

大変ありがとうございます。

+1

私は心から –

+0

ファイル]メニュー を追加GtkUIManager'は '-された年齢のため非推奨。 INSTEAD 'GtkBuilder'を使用してください。 – liberforce

+0

そして、あなたが何をしようとして理解することは困難であるため、あなたの英語を改善し... – liberforce

答えて

1

ゴールを達成するには多くの方法がありますが、一般的なGtkの方法に従えば、独自のカスタム合成ウィジェットへの信号を作成することができます。

add-game-clickedと呼ばれる信号を作成しましょう。ユーザーがそのメニューオプションをクリックすると、Menuクラスの信号がトリガー/放出されます。あなたのコードでそれを行うには

、我々は追加:

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

そして、だから、onAddGameClicked

ような、より意味のあるものにする方法onClickの名前を変更し、あなたのメインの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

追加ゲームメニューオプションをクリックした後、ラベルが変更されます。

関連する問題