从另一个文件

时间:2015-12-05 16:49:52

标签: python python-3.x gtk3

我正在尝试导入并在我的menu.py文件中使用示例given here(保存为main.py)。

我使用的文件没有改动,除了最后几行创建窗口。 在我的main文件中,我将其称为:

#!/usr/bin/python3
import gi
import urllib
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk, Pango
import re
import sys
import urllib
try:
    import xml.etree.cElementTree as ET
except ImportError:
    import xml.etree.ElementTree as ET
import menu
from p_SB_SE import parse_wine_systembolagate

class MainWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="Collection Manager")

        self.set_default_size(1000, 20)
        self.set_border_width(10)

        box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
        box.pack_start(menubar, False, False, 0)
        self.add(box)
window = MainWindow()
window.connect("delete-event", Gtk.main_quit)
window.show_all()
Gtk.main()

但我收到错误:

$python3 main2.py 
Traceback (most recent call last):
  File "main2.py", line 26, in <module>
    window = MainWindow()
  File "main2.py", line 24, in __init__
    box.pack_start(menubar, False, False, 0)
NameError: name 'menubar' is not defined

从像this in wikibook这样的教程我认为这是从同一目录中的不同文件导入模块的正确方法。

我在这里做错了什么?

编辑从评论中我了解到问题是在我的主代码中定义菜单栏功能。我尝试了一些方法但还没有成功。 有人可以帮助我吗?

我的目标是保持我的主文件简洁,这就是为什么我想将所有与菜单相关的函数移动到单独的文件中。

这是我要调用的menu.py函数:

import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk, Pango

UI_INFO = """
<ui>
  <menubar name='MenuBar'>
      <menu action='FileNew'>
        <menuitem action='FileNewStandard' />
      <menuitem action='FileOpenStandard' />
      <menuitem action='FileQuit' />
    </menu>
    <menu action='EditMenu'>
      <menuitem action='EditCopy' />
      <menuitem action='EditPaste' />
    </menu>
    <menu action='ChoicesMenu'>
      <menuitem action='Book'/>
      <menuitem action='Wine'/>
    </menu>
  </menubar>
  <popup name='PopupMenu'>
    <menuitem action='EditCopy' />
    <menuitem action='EditPaste' />
  </popup>
</ui>
"""
class MenuWindow(Gtk.Window):

    def menu():
        Gtk.Window.__init__(self, title="Menu Example")

        action_group = Gtk.ActionGroup("my_actions")

        self.add_file_menu_actions(action_group)
        self.add_edit_menu_actions(action_group)
        self.add_choices_menu_actions(action_group)

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

        menubar = uimanager.get_widget("/MenuBar")
        box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
        box.pack_start(menubar, False, False, 0)
        self.add(box)
        button = Gtk.Button("Open")    # Submit button to write to
        button.connect("clicked", self.on_button_clicked)

    def add_file_menu_actions(self, action_group):
        action_filemenu = Gtk.Action("FileMenu", "File", None, None)
        action_group.add_action(action_filemenu)

        action_filenewmenu = Gtk.Action("FileNew", None, None, Gtk.STOCK_NEW)
        action_group.add_action(action_filenewmenu)

        action_new = Gtk.Action("FileNewStandard", "_New",
            "Create a new file", Gtk.STOCK_NEW)
        action_new.connect("activate", self.on_menu_file_new_generic)
        action_group.add_action_with_accel(action_new, None)

        action_group.add_actions([
            ("FileNewFoo", None, "New Foo", None, "Create new foo",
             self.on_menu_file_new_generic),
            ("FileNewGoo", None, "_New Goo", None, "Create new goo",
             self.on_menu_file_new_generic),
        ])

        action_filequit = Gtk.Action("FileQuit", None, None, Gtk.STOCK_QUIT)
        action_filequit.connect("activate", self.on_menu_file_quit)
        action_group.add_action(action_filequit)

    def add_edit_menu_actions(self, action_group):
        action_group.add_actions([
            ("EditMenu", None, "Edit"),
            ("EditCopy", Gtk.STOCK_COPY, None, None, None,
             self.on_menu_others),
            ("EditPaste", Gtk.STOCK_PASTE, None, None, None,
             self.on_menu_others),
            ("EditSomething", None, "Something", "<control><alt>S", None,
             self.on_menu_others)
        ])

    def add_choices_menu_actions(self, action_group):
        action_group.add_action(Gtk.Action("ChoicesMenu", "Choices", None,
            None))

        action_group.add_radio_actions([
            ("ChoiceOne", None, "One", None, None, 1),
            ("ChoiceTwo", None, "Two", None, None, 2)
        ], 1, self.on_menu_choices_changed)

        three = Gtk.ToggleAction("ChoiceThree", "Three", None, None)
        three.connect("toggled", self.on_menu_choices_toggled)
        action_group.add_action(three)

    def create_ui_manager(self):
        uimanager = Gtk.UIManager()

        # Throws exception if something went wrong
        uimanager.add_ui_from_string(UI_INFO)

        # Add the accelerator group to the toplevel window
        accelgroup = uimanager.get_accel_group()
        self.add_accel_group(accelgroup)
        return uimanager

    def on_menu_file_new_generic(self, widget):
        print("A File|New menu item was selected.")

    def on_menu_file_quit(self, widget):
        Gtk.main_quit()

    def on_menu_others(self, widget):
        print("Menu item " + widget.get_name() + " was selected")

    def on_menu_choices_changed(self, widget, current):
        print(current.get_name() + " was selected.")

    def on_menu_choices_toggled(self, widget):
        if widget.get_active():
            print(widget.get_name() + " activated")
        else:
            print(widget.get_name() + " deactivated")

    def on_button_press_event(self, widget, event):
        # Check if right mouse button was preseed
        if event.type == Gdk.EventType.BUTTON_PRESS and event.button == 3:
            self.popup.popup(None, None, None, None, event.button, event.time)
            return True # event has been handled

0 个答案:

没有答案