python:wxpython create Multi Document Interface (MDI) using MVC

 

# encoding: utf-8
# 版权所有 2024 ©涂聚文有限公司
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2023.1 python 3.11
# OS        : windows 10
# Datetime  : 2024/12/6 23:32
# User      : geovindu
# Product   : PyCharm
# Project   : ictsimple
# File      : wxmdi3.py
# explain   : 学习
import wx
import wx.aui

# 模型
class MyModel:
    pass

# 视图
class MyView(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, size=(800, 600))
        self.mgr = wx.aui.AuiManager()
        self.mgr.SetManagedWindow(self)
        self.nb = wx.aui.AuiNotebook(self)
        self.mgr.AddPane(self.nb, wx.aui.AuiPaneInfo().CenterPane())
        self.controller = None  # 初始化为None,稍后在外部设置
        self.mgr.Update()

    def add_tab_panel(self, name):  # 改名为更符合Python命名规范的add_tab_panel
        panel = wx.Panel(self.nb)
        self.nb.AddPage(panel, name)
        btn = wx.Button(panel, -1, "Close Tab", pos=(10, 10))
        btn.Bind(wx.EVT_BUTTON, self.on_close_tab)

    def on_close_tab(self, event):
        if self.controller:  # 检查controller是否已经被设置
            self.controller.on_close_tab(event)

# 控制器
class MyController:
    def __init__(self, model, view):
        self.model = model
        self.view = view
        self.setup_initial_tabs()  # 在控制器中设置初始标签页

    def setup_initial_tabs(self):
        self.add_tab("Tab 1")
        self.add_tab("Tab 2")

    def add_tab(self, name):
        self.view.add_tab_panel(name)

    def on_close_tab(self, event):
        page = self.view.nb.GetSelection()
        if page != -1:
            self.view.nb.DeletePage(page)

# 主程序
if __name__ == "__main__":
    app = wx.App(False)
    model = MyModel()
    view = MyView(None, -1, "MDI Example")
    controller = MyController(model, view)
    view.controller = controller  # 设置视图中的控制器引用
    view.Show(True)
    app.MainLoop()

  

 

 

# encoding: utf-8
# 版权所有 2024 ©涂聚文有限公司
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:  python wxpython mdi    using mvc style tabs
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2023.1 python 3.11
# OS        : windows 10
# Datetime  : 2024/12/6 22:24
# User      : geovindu
# Product   : PyCharm
# Project   : ictsimple
# File      : wxmdi2.py
# explain   : 学习
import wx
import wx.aui

class Model:
    def __init__(self):
        self.data = "Initial data"

class View(wx.Panel):
    def __init__(self, parent, model):
        wx.Panel.__init__(self, parent)
        self.model = model

        self.text_ctrl = wx.TextCtrl(self, -1, self.model.data, style=wx.TE_MULTILINE)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.text_ctrl, 1, wx.EXPAND)
        self.SetSizer(sizer)

    def update(self):
        self.text_ctrl.SetValue(self.model.data)

class Controller:
    def __init__(self, model, view):
        self.model = model
        self.view = view

        self.view.text_ctrl.Bind(wx.EVT_TEXT, self.on_text_changed)

    def on_text_changed(self, event):
        self.model.data = self.view.text_ctrl.GetValue()
        self.view.update()

class MainFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, "MVC Tabs")

        self.notebook = wx.aui.AuiNotebook(self)

        for i in range(3):
            model = Model()
            view = View(self.notebook, model)
            controller = Controller(model, view)
            self.notebook.AddPage(view, f"Tab {i+1}")

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.notebook, 1, wx.EXPAND)
        self.SetSizer(sizer)

if __name__ == "__main__":
    app = wx.App()
    frame = MainFrame()
    frame.Show()
    app.MainLoop()

  

 

# encoding: utf-8
# 版权所有 2024 ©涂聚文有限公司
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2023.1 python 3.11
# OS        : windows 10
# Datetime  : 2024/12/6 21:49
# User      : geovindu
# Product   : PyCharm
# Project   : ictsimple
# File      : wxmdi.py
# explain   : 学习
#!/usr/bin/env python
# -*- encoding: utf-8 -*-  # 如果您的源代码是UTF-8,建议使用这个
import wx
import wx.aui

class ParentFrame(wx.aui.AuiMDIParentFrame):
    def __init__(self, parent):
        super().__init__(parent, -1, title="AuiMDIParentFrame", size=(640, 480), style=wx.DEFAULT_FRAME_STYLE)
        self.count = 0

        self.SetMenuBar(self.MakeMenuBar())
        self.statusBar = self.CreateStatusBar(style = wx.BORDER_NONE)
        # set text to status bar
        self.statusBar.SetStatusText("Status Bar")
        #self.statusbar = self.CreateStatusBar(2, wx.ST_SIZEGRIP)
        #self.statusbar.SetStatusWidths([-2, -3])
        #self.statusbar.SetStatusText("Ready", 0)
        #self.statusbar.SetStatusText("Welcome To wxPython!", 1)

    def MakeMenuBar(self):
        mb = wx.MenuBar()
        menu = wx.Menu()
        item = menu.Append(-1, "New child window\tCtrl-N")
        self.Bind(wx.EVT_MENU, self.OnNewChild, item)
        item = menu.Append(-1, "Close parent")
        self.Bind(wx.EVT_MENU, self.OnDoClose, item)
        mb.Append(menu, "&File")
        return mb

    def OnNewChild(self, evt):
        self.count += 1
        try:
            child = ChildFrame(self, self.count)
            child.Show()
        except Exception as erro:
            print(erro)

    def OnDoClose(self, evt):
        self.Close()

class ChildFrame(wx.aui.AuiMDIChildFrame):
    def __init__(self, parent, count):
        super().__init__(parent, -1, title="Child: %d" % count)
        self.count = count
        self.SetMenuBar(self.MakeMenuBar())

        p = wx.Panel(self)
        wx.StaticText(p, -1, "This is child %d" % count, (10, 10))
        p.SetBackgroundColour('light blue')

        sizer = wx.BoxSizer()
        sizer.Add(p, 1, wx.EXPAND)
        self.SetSizer(sizer)
        wx.CallAfter(self.Layout)

    def MakeMenuBar(self):
        mb = wx.MenuBar()
        menu = wx.Menu()
        item = menu.Append(-1, "This is child %d's menu" % self.count)
        mb.Append(menu, "&Child")
        return mb

if __name__ == '__main__':
    print(wx.VERSION_STRING)

    app = wx.App()
    frame = ParentFrame(None)
    app.SetTopWindow(frame)
    frame.Show()
    app.MainLoop()

  

 

import wx
import wx.aui

class MyFrame(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, size=(800, 600))

        self.mgr = wx.aui.AuiManager()
        self.mgr.SetManagedWindow(self)

        # Create a notebook for the tabs
        self.nb = wx.aui.AuiNotebook(self)
        self.mgr.AddPane(self.nb, wx.aui.AuiPaneInfo().CenterPane())

        # Add a tab to the notebook
        self.addTab("Tab 1")
        self.addTab("Tab 2")

        self.mgr.Update()

    def addTab(self, name):
        panel = wx.Panel(self.nb)
        self.nb.AddPage(panel, name)

        # Add a close button to the tab
        btn = wx.Button(panel, -1, "Close Tab", pos=(10, 10))
        btn.Bind(wx.EVT_BUTTON, self.onCloseTab)

    def onCloseTab(self, event):
        page = self.nb.GetSelection()
        if page != -1:
            self.nb.DeletePage(page)


if __name__ == "__main__":
    app = wx.App(False)
    frame = MyFrame(None, -1, "MDI Example")
    frame.Show(True)
    app.MainLoop()

  

 

import wx

class MainFrame(wx.MDIParentFrame):
    def __init__(self, parent, title):
        wx.MDIParentFrame.__init__(self, parent, -1, title)

        # Create a menu bar
        menubar = wx.MenuBar()
        fileMenu = wx.Menu()
        newChildItem = fileMenu.Append(wx.ID_ANY, "&New Child Window")
        exitItem = fileMenu.Append(wx.ID_EXIT, "E&xit")
        menubar.Append(fileMenu, "&File")
        self.SetMenuBar(menubar)

        # Bind events
        self.Bind(wx.EVT_MENU, self.OnNewChild, newChildItem)
        self.Bind(wx.EVT_MENU, self.OnExit, exitItem)

    def OnNewChild(self, event):
        childFrame = ChildFrame(self, "Child Window")
        childFrame.Show()

    def OnExit(self, event):
        self.Close()

class ChildFrame(wx.MDIChildFrame):
    def __init__(self, parent, title):
        wx.MDIChildFrame.__init__(self, parent, -1, title)

if __name__ == "__main__":
    app = wx.App()
    frame = MainFrame(None, "MDI Example")
    frame.Show()
    app.MainLoop()

  

 

import wx

class TabbedFrame(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, size=(800, 600))

        self.notebook = wx.Notebook(self, -1, style=wx.NB_TOP)

        # 创建第一个标签页
        self.create_tab("Tab 1")
        # 创建第二个标签页
        self.create_tab("Tab 2")

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.notebook, 1, wx.EXPAND | wx.ALL, 5)
        self.SetSizer(sizer)

    def create_tab(self, title):
        panel = wx.Panel(self.notebook)
        text = wx.StaticText(panel, -1, f"This is {title}")
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(text, 1, wx.EXPAND | wx.ALL, 10)
        panel.SetSizer(sizer)
        self.notebook.AddPage(panel, title)

app = wx.App(False)
frame = TabbedFrame(None, -1, "Tabbed Frame")
frame.Show()
app.MainLoop()

  

import wx
import wx.aui

class MyFrame(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(800, 600))

        self.notebook = wx.aui.AuiNotebook(self)
        self.notebook.SetArtProvider(wx.aui.AuiSimpleTabArt())  # Use a simpler tab art

        # Create some panels for the tabs
        panel1 = wx.Panel(self.notebook)
        panel2 = wx.Panel(self.notebook)

        # Add the panels to the notebook with close buttons
        self.notebook.AddPage(panel1, "Tab 1", True)
        self.notebook.AddPage(panel2, "Tab 2", True)

        # Bind the close button event
        self.notebook.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CLOSE, self.on_page_close)

        self.Show(True)

    def on_page_close(self, event):
        page = event.GetSelection()
        self.notebook.DeletePage(page)

if __name__ == '__main__':
    app = wx.App()
    frame = MyFrame(None, "MDI-like Tabbed Interface")
    app.MainLoop()

  

import wx

# Model
class Document:
    def __init__(self, content=""):
        self.content = content

    def get_content(self):
        return self.content

    def set_content(self, new_content):
        self.content = new_content

# View
class DocumentView(wx.Panel):
    def __init__(self, parent, document):
        super().__init__(parent)
        self.document = document
        self.text_ctrl = wx.TextCtrl(self, style=wx.TE_MULTILINE)
        self.text_ctrl.SetValue(self.document.get_content())

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.text_ctrl, 1, wx.EXPAND)
        self.SetSizer(sizer)

    def update_content(self):
        self.text_ctrl.SetValue(self.document.get_content())

# Controller
class DocumentController:
    def __init__(self, document, view):
        self.document = document
        self.view = view

    def update_document(self):
        self.document.set_content(self.view.text_ctrl.GetValue())

# Main Frame
class MainFrame(wx.MDIParentFrame):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.file_menu = wx.Menu()
        self.file_menu.Append(wx.ID_NEW, "New")
        self.Bind(wx.EVT_MENU, self.on_new, id=wx.ID_NEW)

        menu_bar = wx.MenuBar()
        menu_bar.Append(self.file_menu, "File")
        self.SetMenuBar(menu_bar)

    def on_new(self, event):
        document = Document()
        view = DocumentView(self, document)
        controller = DocumentController(document, view)
        child_frame = wx.MDIChildFrame(self, -1, "New Document")
        child_frame.SetClientSize(view.GetBestSize())
        child_frame.Show()

if __name__ == '__main__':
    app = wx.App()
    frame = MainFrame(None, title="MDI Example")
    frame.Show()
    app.MainLoop()

  

posted @ 2024-12-06 20:22  ®Geovin Du Dream Park™  阅读(31)  评论(0)    收藏  举报