python: Multi Document Interface (MDI) Application using Pmw

 

# encoding: utf-8
# 版权所有 2024 涂聚文有限公司
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:pip install Pmw
#  https://www.slac.stanford.edu/grp/cd/soft/pmw/starting.html
#  https://www.slac.stanford.edu/grp/cd/soft/pmw/howtouse.html
#  https://pmw.sourceforge.net/doc/index.html
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2023.1 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, poostgreSQL 17.0
# Datetime  : 2024/12/7 7:15
# User      : geovindu
# Product   : PyCharm
# Project   : Pysimple
# File      : pwmmdi.py
# explain   : 学习
import tkinter as tk
import Pmw
from Pmw.Pmw_2_1_1.lib.PmwNoteBook import NoteBook
 
 
# Model
class NotebookModel:
    """
    """
    def __init__(self):
        self.pages = []
 
    def add_page(self, page_name):
        """
        :param page_name:
        :return:
        """
        self.pages.append(page_name)
 
    def remove_page(self, page_name):
        """
        :param page_name:
        :return:
        """
 
        self.pages.remove(page_name)
 
    def get_page_names(self):
        """
        :return:
        """
        return self.pages[:]
 
# View
class NotebookView:
    """
    """
    def __init__(self, root, model):
        """
        :param root:
        :param model:
        """
        self.root = root
        self.model = model
        self.notebook = NoteBook(root)
        self.notebook.pack(fill="both", expand=True)
 
        # Initialize with existing pages
        for page_name in self.model.get_page_names():
            self.create_page(page_name)
 
    def create_page(self, page_name):
        """
        :param page_name:
        :return:
        """
 
        page_frame = self.notebook.add(page_name)
        widget = tk.Frame(page_frame)
        widget.pack(fill='both', expand=1, padx=10, pady=10)
        label = tk.Label(widget, text=f"This is {page_name}")
        label.pack(pady=10)
 
        close_button = tk.Button(widget, text="Close", command=lambda: self.close_page(page_name))
        close_button.pack(side=tk.RIGHT, padx=10, pady=10)
 
    def close_page(self, page_name):
        """
        :param page_name:
        :return:
        """
 
        self.notebook.delete(page_name)
        self.model.remove_page(page_name)
 
    def update_view(self):
        """
        :return:
        """
        current_pages = set(self.model.get_page_names())
        displayed_pages = set(self.notebook.pagenames())   #self.notebook.getcurselection()
 
        # Add missing pages
        for page_name in current_pages - displayed_pages:
            self.create_page(page_name)
 
# Controller
class NotebookController:
    """
    """
    def __init__(self, root, model, view):
        self.root = root
        self.model = model
        self.view = view
 
        # Create menu bar
        menubar = tk.Menu(root)
        filemenu = tk.Menu(menubar, tearoff=0)
        filemenu.add_command(label="New", command=self._on_new_page)
        filemenu.add_separator()
        filemenu.add_command(label="Exit", command=root.quit)
        menubar.add_cascade(label="File", menu=filemenu)
        root.config(menu=menubar)
 
    def _on_new_page(self):
        """
        :return:
        """
        page_name = f"New Window {len(self.model.get_page_names()) + 1}"
        self.model.add_page(page_name)
        self.view.update_view()
 
# Main application entry point
def main():
    """
    
    :return:
    """
    root = tk.Tk()
    root.title("MDI Example with MVC")
 
    model = NotebookModel()
    view = NotebookView(root, model)
    controller = NotebookController(root, model, view)
 
    # Initially update the view to match the model
    view.update_view()
 
    root.mainloop()
 
if __name__ == "__main__":
    main()

 

 

 

posted @ 2024-12-07 07:56  ®Geovin Du Dream Park™  阅读(15)  评论(0)    收藏  举报