天天看點

多文檔界面MDI的子視窗排列

多文檔界面的子視窗排列

    • 程式目的
    • 程式界面
    • 程式代碼

程式目的

在使用 wxpython 的多文檔界面 MDI 時,當新增子視窗時,主視窗會自動出現 Window 菜單,并帶有 Cascade、Tile 等功能。如何使用這些菜單項來實作相應的功能呢?

程式界面

多文檔界面MDI的子視窗排列
多文檔界面MDI的子視窗排列
多文檔界面MDI的子視窗排列

程式代碼

  • 在點選 Window 菜單的 Cascade 等菜單項時,會産生一個菜單事件,利用系統預定義的事件 ID 就能很容易的實作所需的功能。
  • 如點選 CasCade 菜單項時,其對應的 ID 是 wx.ID_MDI_WINDOW_CASCADE,對應的功能是 self.Cascade()
import wx


class MDIFrame(wx.MDIParentFrame):
    def __init__(self):
        wx.MDIParentFrame.__init__(self, None, -1, "MDI Parent", size=(600, 400))
        menu = wx.Menu()
        menu.Append(wx.ID_NEW, "&New Window")
        menu.Append(wx.ID_EXIT, "&Exit")
        menubar = wx.MenuBar()
        menubar.Append(menu, "&File")

        self.SetMenuBar(menubar)
        self.Bind(wx.EVT_MENU, self.menu_handler)

    def menu_handler(self, event):
        eid = event.GetId()
        if eid == wx.ID_EXIT:
            self.Close(True)
        elif eid == wx.ID_NEW:
            win = wx.MDIChildFrame(self, -1, "Child Window")
            win.Show()

        # 視窗排列樣式
        elif eid == wx.ID_MDI_WINDOW_CASCADE:
            self.Cascade()
        elif eid == wx.ID_MDI_WINDOW_TILE_HORZ:
            self.Tile()
        elif eid == wx.ID_MDI_WINDOW_TILE_VERT:
            self.Tile(wx.VERTICAL)
        elif eid == wx.ID_MDI_WINDOW_ARRANGE_ICONS:
            self.ArrangeIcons()
        elif eid == wx.ID_MDI_WINDOW_NEXT:
            self.ActivateNext()
        elif eid == wx.ID_MDI_WINDOW_PREV:
            self.ActivatePrevious()
        else:
            print(eid)


app = wx.App()
frame = MDIFrame()
frame.Center()
frame.Show()
app.MainLoop()