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