Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

CTkMVC

Package Overview
Dependencies
Maintainers
1
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

CTkMVC

Base classes for easy using MVC pattern with CTk library

  • 0.0.3
  • PyPI
  • Socket score

Maintainers
1

CTkMVC

Install

pip install ctkmvc

Description

The library that provides a few base classes for easy using MVC architecture pattern together with CTk library to make simple and lightweight desktop applications.

Using example

In this example we will create a simple system that let us to make a button changing its text by clicking on it. To make your own View, Controller and Model classes you should inherit them from base abstract classes View, Controller and ObservableModel like that:

  • Imports
from customtkinter import CTkButton
from random import Random

from view import View
from model import ObservableModel
from controller import Controller
  • Our View
class MyWindow(View):

    def __init__(self, controller, model):

        super().__init__(controller, model)

        self.wm_title('Window')

        self.resizable(False, False)

        self.geometry('600x400')

        self.button = CTkButton(self, command=self._controller.button_click)

        self.button.grid(row=4, column=0, padx=(20, 20), pady=(10, 10), sticky="ew")


    def model_is_changed(self):
        
        self.button.configure(text=self._model.button_text)

Inherit our Viewfrom View abstract class and override model_is_changed method to react to Model changes. Then in __init__ method we create CTk attributes to design our window and do not forget to call super __init__ method to construct base View class by passing our Controller and Model objects.

  • Our Model
class MyWindowModel(ObservableModel):

    def __init__(self):

        super().__init__()
        
        self.__button_text = None

    @property
    def button_text(self):
        return self.__button_text
    
    @button_text.setter
    def button_text(self, value):

        self.__button_text = value

        self.notify_observers()

Inherit our Model from ObservableModel base abstract class and implement necessary properties our View observes. In setter method we call notify_observers method to notify subscibed views.

  • Our Controller
class MyWindowController(Controller):

    def __init__(self, view_cls, model):

        super().__init__(view_cls, model)

    
    def button_click(self):

        button_names = ['ctk', 'MVC', 'architecture', 'pattern']

        self._model.button_text = Random().choice(button_names)

Inherit our Controller from Controller base abstract class. Our Controller controles creating View object therefore in its __init__ method we pass our Model object and CLASS itself but not certain object of our View beacuse of this:

class Controller(ABC):

    def __init__(self, view_cls: 'type[View]', model: ObservableModel):

        self._view = view_cls(self, model)
        
        # Some code...

Result

from window import MyWindow, MyWindowModel, MyWindowController

def main():
    
    MyWindowController(

        MyWindow,
        MyWindowModel()
    )


if __name__=='__main__':
    main()

We get a window with a button that changes its text by clicking on it.

FAQs


Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc