首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >python: Multi Document Interface (MDI) Application using Pmw

python: Multi Document Interface (MDI) Application using Pmw

作者头像
geovindu
发布2026-06-18 20:51:55
发布2026-06-18 20:51:55
280
举报
代码语言:javascript
复制
# encoding: utf-8
# 版权所有 2024 ©涂聚文有限公司
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Multi Document Interface (MDI) Application
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2023.1 python 3.11
# OS        : windows 10
# Datetime  : 2024/12/6 19:55
# User      : geovindu
# Product   : PyCharm
# Project   : ictsimple
# File      : pwmddi0.py
# explain   : 学习
# https://pmw.sourceforge.net/doc/NoteBook.html

import tkinter as tk
import Pmw
from Pmw.Pmw_2_1_1.lib.PmwNoteBook import NoteBook

root = tk.Tk()
root.title("MDI Example")

# Create a notebook to hold the child windows
notebook = NoteBook(root)
notebook.pack(fill="both", expand=True)

# A dictionary to store pages and their close callbacks
pages = {}

# Counter for unique page names
page_counter = 1


def create_new_window():
    global page_counter
    page_name = f"New Window {page_counter}"
    page_counter += 1

    # Create the page frame
    page_frame = notebook.add(page_name)

    # Store the page frame and its close callback in the dictionary
    pages[page_name] = {
        'frame': page_frame,
        'close_callback': lambda: close_page(page_name)
    }

    # Add a label to the page
    tk.Label(page_frame, text=f"This is {page_name}").pack(pady=10)

    # Add a close button to the page
    close_button = tk.Button(page_frame, text="Close", command=pages[page_name]['close_callback'])
    close_button.pack(side=tk.RIGHT, padx=10, pady=10)


def close_page(page_name):
    # Use the forget method to remove the page from the notebook
    # notebook.forget(page_name)
    notebook.delete(page_name)
    # Optionally, you can also delete the page frame and its widgets here
    # but note that Pmw.NoteBook might handle some cleanup internally
    # del pages[page_name]['frame']  # Uncomment if you want to delete the frame reference


# Create a menu bar
menubar = tk.Menu(root)
filemenu = tk.Menu(menubar, tearoff=0)
filemenu.add_command(label="New", command=create_new_window)
filemenu.add_separator()
filemenu.add_command(label="Exit", command=root.destroy)
menubar.add_cascade(label="File", menu=filemenu)

root.config(menu=menubar)

root.mainloop()

MDI  MVC

代码语言:javascript
复制
# 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()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-12-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档