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()

哲学管理(学)人生, 文学艺术生活, 自动(计算机学)物理(学)工作, 生物(学)化学逆境, 历史(学)测绘(学)时间, 经济(学)数学金钱(理财), 心理(学)医学情绪, 诗词美容情感, 美学建筑(学)家园, 解构建构(分析)整合学习, 智商情商(IQ、EQ)运筹(学)生存.---Geovin Du(涂聚文)
浙公网安备 33010602011771号