⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 menubar.py

📁 用python写的ide开发环境,巨强大,不过需要wxpython的支持
💻 PY
📖 第 1 页 / 共 3 页
字号:
        trees which describes the structure of the menus        """        indent = " " * 4        set_item = self.menu_items.SetStringItem        add_item = self.menu_items.InsertStringItem        index = [0]        def add(node, level):            i = index[0]            add_item(i, misc.wxstr(indent * level + node.label.lstrip()))            set_item(i, 1, misc.wxstr(node.id))            set_item(i, 2, misc.wxstr(node.name))            set_item(i, 3, misc.wxstr(node.help_str))            # ALB 2004-12-05            set_item(i, 5, misc.wxstr(node.handler))                        item_type = 0            try:                if node.checkable and int(node.checkable):                    item_type = 1                elif int(node.radio):                    item_type = 2            except ValueError:                pass            set_item(i, 4, misc.wxstr(item_type))            index[0] += 1            for item in node.children:                add(item, level+1)        for tree in menus:            add(tree.root, 0)        if self.menu_items.GetItemCount():            self._enable_fields()##             for s in (self.name, self.id, self.label, \##                       self.help_str, self.check_radio, self.event_handler):##                 s.Enable(True)                def get_menus(self):        """\        returns the contents of self.menu_items as a list of trees which        describe the structure of the menus in the format used by EditMenuBar        """        def get(i, j): return self.menu_items.GetItem(i, j).m_text        trees = []        def add(node, index):            label = get(index, 0).lstrip()            id = get(index, 1)            name = get(index, 2)            help_str = get(index, 3)            event_handler = get(index, 5)            try:                item_type = int(get(index, 4))            except ValueError:                item_type = 0            checkable = item_type == 1 and misc.wxstr("1") or misc.wxstr("")            radio = item_type == 2 and misc.wxstr("1") or misc.wxstr("")            n = MenuTree.Node(label, id, name, help_str, checkable, radio,                              handler=event_handler)            node.children.append(n)            n.parent = node            return n        level = 0        curr_item = None        for index in range(self.menu_items.GetItemCount()):            label = get(index, 0)            lvl = self.item_level(index) # get the indentation level            if not lvl:                t = MenuTree(get(index, 2), label, id=get(index, 1),                             handler=get(index, 5))                curr_item = t.root                level = 1                trees.append(t)                continue            elif lvl < level:                for i in range(level-lvl):                    curr_item = curr_item.parent                level = lvl            elif lvl > level:                curr_item = curr_item.children[-1]                level = lvl            add(curr_item, index)        return trees    def _move_item_left(self, index):        if index > 0:            if (index+1 < self.menu_items.GetItemCount() and \                (self.item_level(index) < self.item_level(index+1))):                return            label = self.menu_items.GetItem(index, 0).m_text            if misc.streq(label[:4], " " * 4):                self.menu_items.SetStringItem(index, 0, label[4:])                self.menu_items.SetItemState(index, wx.LIST_STATE_SELECTED,                                              wx.LIST_STATE_SELECTED)                    def move_item_left(self, event):        """\        moves the selected menu item one level up in the hierarchy, i.e.        shifts its label 4 spaces left in self.menu_items        """        self.menu_items.SetFocus()        self._move_item_left(self.selected_index)    def _move_item_right(self, index):        if index > 0 and (self.item_level(index) <= self.item_level(index-1)):             label = self.menu_items.GetItem(index, 0).m_text            self.menu_items.SetStringItem(index, 0, misc.wxstr(" " * 4)                                          + label)            self.menu_items.SetItemState(index, wx.LIST_STATE_SELECTED, \                                         wx.LIST_STATE_SELECTED)    def move_item_right(self, event):        """\        moves the selected menu item one level down in the hierarchy, i.e.        shifts its label 4 spaces right in self.menu_items        """        self.menu_items.SetFocus()        self._move_item_right(self.selected_index)    def move_item_up(self, event):        """\        moves the selected menu item before the previous one at the same level        in self.menu_items        """        self.menu_items.SetFocus()        index = self._do_move_item(event, self.selected_index, False)        if index is not None:            state = wx.LIST_STATE_SELECTED | wx.LIST_STATE_FOCUSED            self.menu_items.SetItemState(index, state, state)    def _do_move_item(self, event, index, is_down):        """\        internal function used by move_item_up and move_item_down.        Returns the new index of the moved item, or None if no change occurred        """        #index = self.selected_index        if index <= 0: return None        def get(i, j): return self.menu_items.GetItem(i, j).m_text        def getall(i): return [get(i, j) for j in range(6)]        level = self.item_level(index)        items_to_move = [ getall(index) ]        i = index+1        while i < self.menu_items.GetItemCount():            # collect the items to move up            if level < self.item_level(i):                items_to_move.append(getall(i))                i += 1            else: break        i = index-1        while i >= 0:            lvl = self.item_level(i)            if level == lvl: break            elif level > lvl: return None            i -= 1        delete = self.menu_items.DeleteItem        insert = self.menu_items.InsertStringItem        set = self.menu_items.SetStringItem        for j in range(len(items_to_move)-1, -1, -1):            delete(index+j)        items_to_move.reverse()        for label, id, name, help_str, check_radio, event_handler in \                items_to_move:            i = insert(i, label)            set(i, 1, id)            set(i, 2, name)            set(i, 3, help_str)            set(i, 4, check_radio)            set(i, 5, event_handler)        ret_idx = i        if is_down: ret_idx += len(items_to_move)        return ret_idx            def move_item_down(self, event):        """\        moves the selected menu item after the next one at the same level        in self.menu_items        """        self.menu_items.SetFocus()        index = self.selected_index        self.selected_index = -1        if index < 0: return        def get(i, j): return self.menu_items.GetItem(i, j).m_text        def getall(i): return [get(i, j) for j in range(6)]        level = self.item_level(index)        i = index+1        while i < self.menu_items.GetItemCount():            # collect the items to move down            if level < self.item_level(i):                i += 1            else: break        if i < self.menu_items.GetItemCount():            # _do_move_item works with selected_index, so we must assing to            # it the rigth value before the call            #self.selected_index = i            self.selected_index = self._do_move_item(event, i, True)            # fix bug 698071            state = wx.LIST_STATE_SELECTED | wx.LIST_STATE_FOCUSED            self.menu_items.SetItemState(self.selected_index, state, state)        else:            # restore the selected index            self.selected_index = index    def on_apply(self, event):        self.owner.set_menus(self.get_menus())        common.app_tree.app.saved = False                                                  #end of class MenuItemDialogclass MenuProperty(Property):    """\    Property to edit the menus of an EditMenuBar instance.    """    def __init__(self, owner, name, parent):        Property.__init__(self, owner, name, parent)        self.panel = None        self.menu_items = {}        if parent is not None: self.display(parent)    def display(self, parent):        self.panel = wx.Panel(parent, -1)        edit_btn_id = wx.NewId()        self.edit_btn = wx.Button(self.panel, edit_btn_id, _("Edit menus..."))        sizer = wx.BoxSizer(wx.HORIZONTAL)        sizer.Add(self.edit_btn, 1, wx.EXPAND|wx.ALIGN_CENTER|wx.TOP|wx.BOTTOM, 4)        self.panel.SetAutoLayout(1)        self.panel.SetSizer(sizer)        self.panel.SetSize(sizer.GetMinSize())        wx.EVT_BUTTON(self.panel, edit_btn_id, self.edit_menus)    def bind_event(*args): pass    def edit_menus(self, event):        dialog = MenuItemDialog(self.panel, self.owner,                                items=self.owner.get_menus())        if dialog.ShowModal() == wx.ID_OK:            self.owner.set_menus(dialog.get_menus())            common.app_tree.app.saved = False # update the status of the app    def write(self, outfile, tabs):        fwrite = outfile.write        fwrite('    ' * tabs + '<menus>\n')        for menu in self.owner[self.name][0]():            menu.write(outfile, tabs+1)        fwrite('    ' * tabs + '</menus>\n')# end of class MenuPropertyclass EditMenuBar(EditBase, PreviewMixin):    __hidden_frame = None # used on GTK to reparent a menubar before deletion        def __init__(self, name, klass, parent, property_window):        custom_class = parent is None        EditBase.__init__(self, name, klass,                          parent, wx.NewId(), property_window,                          custom_class=custom_class, show=False)        self.base = 'wxMenuBar'                def nil(*args): return ()        self.menus = [] # list of MenuTree objects        self._mb = None # the real menubar        self.access_functions['menus'] = (self.get_menus, self.set_menus)        prop = self.properties['menus'] = MenuProperty(self, 'menus', None) ##         self.node = Tree.Node(self)##         common.app_tree.add(self.node, parent.node)        PreviewMixin.__init__(self)    def create_widget(self):        if wx.Platform == '__WXGTK__' and not EditMenuBar.__hidden_frame:            EditMenuBar.__hidden_frame = wx.Frame(common.palette, -1, "")            EditMenuBar.__hidden_frame.Hide()        if self.parent:            self.widget = self._mb = wx.MenuBar()            if self.parent.widget: self.parent.widget.SetMenuBar(self.widget)            if wx.Platform == '__WXMSW__' or wx.Platform == '__WXMAC__':                self.widget.SetFocus = lambda : None        else:            # "top-level" menubar            self.widget = wx.Frame(None, -1, misc.design_title(self.name))            self.widget.SetClientSize((400, 30))            self._mb = wx.MenuBar()            self.widget.SetMenuBar(self._mb)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -