GUI - Tkinter - MVC


1.MVC

  • Model: The backend that contains all the data logic
    • A model in MVC represents the data. A model deals with getting data from or writing data into storage such as a database or file. The model may also contain the logic to validate the data to ensure data integrity.

      The model must not depend on the view and controller. In other words, you can reuse the model in other non-Tkinter applications such as web and mobile apps.

  • View: The frontend or graphical user interface (GUI)
    • A view is the user interface that represents the data in the model. The view doesn’t directly communicate with the model. Ideally, a view should have very little logic to display data.

      The view communicates with the controller directly. In Tinker applications, the view is the root window that consists of widgets.

  • Controller: The brains of the application that controls how data is displayed
    •  controller acts as the intermediary between the views and models. The controller routes data between the views and models.

      For example, if users click the save button on the view, the controller routes the “save” action to the model to save the data into a database and notify the view to display a message.

2.demo

import re
import tkinter as tk
from tkinter import ttk


class Model:
    def __init__(self, email):
        self.email = email

    @property
    def email(self):
        return self.__email

    @email.setter
    def email(self, value):
        """
        Validate the email
        :param value:
        :return:
        """
        pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
        if re.fullmatch(pattern, value):
            self.__email = value
        else:
            raise ValueError(f'Invalid email address: {value}')

    def save(self):
        """
        Save the email into a file
        :return:
        """
        with open('emails.txt', 'a') as f:
            f.write(self.email + '\n')


class View(ttk.Frame):
    def __init__(self, parent):
        super().__init__(parent)

        # create widgets
        # label
        self.label = ttk.Label(self, text='Email:')
        self.label.grid(row=1, column=0)

        # email entry
        self.email_var = tk.StringVar()
        self.email_entry = ttk.Entry(self, textvariable=self.email_var, width=30)
        self.email_entry.grid(row=1, column=1, sticky=tk.NSEW)

        # save button
        self.save_button = ttk.Button(self, text='Save', command=self.save_button_clicked)
        self.save_button.grid(row=1, column=3, padx=10)

        # message
        self.message_label = ttk.Label(self, text='', foreground='red')
        self.message_label.grid(row=2, column=1, sticky=tk.W)

        # set the controller
        self.controller = None

    def set_controller(self, controller):
        """
        Set the controller
        :param controller:
        :return:
        """
        self.controller = controller

    def save_button_clicked(self):
        """
        Handle button click event
        :return:
        """
        if self.controller:
            self.controller.save(self.email_var.get())

    def show_error(self, message):
        """
        Show an error message
        :param message:
        :return:
        """
        self.message_label['text'] = message
        self.message_label['foreground'] = 'red'
        self.message_label.after(3000, self.hide_message)
        self.email_entry['foreground'] = 'red'

    def show_success(self, message):
        """
        Show a success message
        :param message:
        :return:
        """
        self.message_label['text'] = message
        self.message_label['foreground'] = 'green'
        self.message_label.after(3000, self.hide_message)

        # reset the form
        self.email_entry['foreground'] = 'black'
        self.email_var.set('')

    def hide_message(self):
        """
        Hide the message
        :return:
        """
        self.message_label['text'] = ''


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

    def save(self, email):
        """
        Save the email
        :param email:
        :return:
        """
        try:

            # save the model
            self.model.email = email
            self.model.save()

            # show a success message
            self.view.show_success(f'The email {email} saved!')

        except ValueError as error:
            # show an error message
            self.view.show_error(error)


class App(tk.Tk):
    def __init__(self):
        super().__init__()

        self.title('Tkinter MVC Demo')

        # create a model
        model = Model('hello@pythontutorial.net')

        # create a view and place it on the root window
        view = View(self)
        view.grid(row=0, column=0, padx=10, pady=10)

        # create a controller
        controller = Controller(model, view)

        # set the controller to view
        view.set_controller(controller)


if __name__ == '__main__':
    app = App()
    app.mainloop()

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python MVC(Model-View-Controller)是一种软件设计模式,用于构建GUI(图形用户界面)应用程序。它将应用程序分为三个部分:模型(Model)、视图(View)和控制器(Controller),以实现更好的代码组织、可维护性和可扩展性。 模型(Model)是应用程序的核心组件,负责处理数据的逻辑和状态。它通常包含数据结构、数据库操作、数据验证等功能。在Python中,可以使用类来表示模型,并在其中定义相关的方法和属性。 视图(View)是用户界面的表示,负责将模型的数据呈现给用户,并接收用户的输入。在Python中,可以使用GUI库(如Tkinter、PyQt、wxPython等)来创建视图,包括窗口、按钮、文本框等。 控制器(Controller)是模型和视图之间的桥梁,负责处理用户输入的操作,并更新相应的模型和视图。它可以监听用户界面的事件(如按钮点击、键盘输入等)并触发相应的模型行为。在Python中,可以使用事件处理器或回调函数来实现控制器。 在Python MVC中,模型、视图和控制器之间的交互一般遵循以下方式:视图通过控制器来获取和更新模型的数据,而控制器通过视图的操作来触发模型的更新,并将更新后的数据传递给视图进行展示。 使用Python MVC可以将应用程序的不同部分分离开来,使代码更加模块化和可复用。模型、视图和控制器各自负责不同的功能,使得代码的编写和调试更加简单。此外,它还使得应用程序的开发团队可以同时并行地开发不同的模块。 总之,Python MVC设计模式是一种用于构建GUI应用程序的可行方法。它将应用程序分解为模型、视图和控制器,以实现代码的可维护性和可扩展性。通过合理地设计和组织代码,可以更加高效地开发GUI应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值