Commit 40a6a249 authored by Dom31's avatar Dom31
Browse files

people new package

parent 37972d7c
Loading
Loading
Loading
Loading
Loading

people/GUI/__init__.py

0 → 100644
+0 −0

Empty file added.

people/GUI/menu.py

0 → 100644
+100 −0
Original line number Diff line number Diff line
# encoding: utf8
# menu.py
import tkinter as tk
from tkinter import messagebox, filedialog
import pygubu
import json

from src.people.Human import Human
from src.people.ListOfHumans import ListOfHumans


class MyApplication(pygubu.TkApplication):
    def _create_ui(self):
        # 1: Create a builder
        self.builder = builder = pygubu.Builder()

        # 2: Load an ui file
        builder.add_from_file("src/people/GUI/menu.ui")

        # 3: Create the widget using self.master as parent
        self.mainwindow = mainwindow = self.top3 = builder.get_object("mainwindow", self.master)

        # Set main menu
        self.mainmenu = menu = builder.get_object("mainmenu", self.master)
        self.set_menu(menu)

        # Initialize model
        self.people = ListOfHumans()

        # change main window message
        label = self.builder.get_object('label_main')
        label.configure(text="Empty list of humans: add new one !")

        # Configure callbacks
        builder.connect_callbacks(self)

    def on_mfile_item_clicked(self, itemid):
        if itemid == "mfile_open":

            input_file = filedialog.askopenfilename(initialdir=".", title="Select file",
                                                    filetypes=(("json files", "*.json"), ("all files", "*.*")))
            print(input_file)
            with open(input_file) as json_file:
                data = json.load(json_file)
                for p in data["people"]:
                    self.people.add_human(Human(p["name"], int(p["age"])))

        if itemid == "mfile_quit":
            messagebox.showinfo("File", "You clicked Quit menuitem. Byby")
            self.quit()

    def on_mdata_item_clicked(self, itemid):
        if itemid == "mdata_add":
            # LabelFrame_NewHuman

            # Method 2. Recommended way.
            # Recreate the builder and window each time.
            self.builder2 = builder2 = pygubu.Builder()
            builder2.add_from_file('src/people/GUI/menu.ui')
            self.top3 = top3 = tk.Toplevel(self.mainwindow)
            frame3 = builder2.get_object('LabelFrame_NewHuman', top3)

            callbacks = {
                'on_button_add_human_clicked': self.on_button_add_human_clicked
            }
            builder2.connect_callbacks(callbacks)

        if itemid == "mdata_print":
            label = self.builder.get_object('label_main')
            label.configure(text="People : {names_and_ages}".format(names_and_ages=self.people))

    def on_button_add_human_clicked(self):
        # change main window message

        entry_name = self.builder2.get_object('Entry_Name')
        entry_age = self.builder2.get_object('Entry_Age')
        name = entry_name.get()
        age = entry_age.get()

        self.people.add_human(Human(name, age))
        print(self.people)

        self.top3.destroy()

        label = self.builder.get_object('label_main')
        label.configure(text="Name = {name}, Age = {age}".format(name=name, age=age))




    def on_about_clicked(self):
        messagebox.showinfo("About", "You clicked About menuitem")


if __name__ == "__main__":
    people = ListOfHumans()

    root = tk.Tk()
    app = MyApplication(root)
    app.run()

people/GUI/menu.ui

0 → 100644
+170 −0
Original line number Diff line number Diff line
<?xml version='1.0' encoding='utf-8'?>
<interface>
    <object class="tk.Menu" id="mainmenu">
        <property name="tearoff">0</property>
        <child>
            <object class="tk.Menuitem.Submenu" id="mfile">
                <property name="label" translatable="yes">File</property>
                <property name="tearoff">0</property>
                <child>
                    <object class="tk.Menuitem.Command" id="mfile_open">
                        <property name="command">on_mfile_item_clicked</property>
                        <property name="command_id_arg">True</property>
                        <property name="label" translatable="yes">Open</property>
                    </object>
                </child>
                <child>
                    <object class="tk.Menuitem.Separator" id="separator1"/>
                </child>
                <child>
                    <object class="tk.Menuitem.Command" id="mfile_quit">
                        <property name="command">on_mfile_item_clicked</property>
                        <property name="command_id_arg">True</property>
                        <property name="label" translatable="yes">Quit</property>
                    </object>
                </child>
            </object>
        </child>
        <child>
            <object class="tk.Menuitem.Submenu" id="mhelp">
                <property name="label" translatable="yes">Help</property>
                <property name="tearoff">0</property>
                <child>
                    <object class="tk.Menuitem.Command" id="mhelp_about">
                        <property name="command">on_about_clicked</property>
                        <property name="command_id_arg">False</property>
                        <property name="label" translatable="yes">About</property>
                    </object>
                </child>
            </object>
        </child>
        <child>
            <object class="tk.Menuitem.Submenu" id="submenu_mdata">
                <property name="label" translatable="yes">Data</property>
                <child>
                    <object class="tk.Menuitem.Command" id="mdata_add">
                        <property name="command">on_mdata_item_clicked</property>
                        <property name="command_id_arg">true</property>
                        <property name="label" translatable="yes">Add human</property>
                    </object>
                </child>
                <child>
                    <object class="tk.Menuitem.Separator" id="Separator_2"/>
                </child>
                <child>
                    <object class="tk.Menuitem.Command" id="mdata_print">
                        <property name="command">on_mdata_item_clicked</property>
                        <property name="command_id_arg">true</property>
                        <property name="label" translatable="yes">Print humans</property>
                    </object>
                </child>
            </object>
        </child>
    </object>
    <object class="ttk.Frame" id="mainwindow">
        <property name="height">200</property>
        <property name="width">200</property>
        <layout>
            <property name="column">0</property>
            <property name="propagate">True</property>
            <property name="row">0</property>
            <property name="sticky">nesw</property>
        </layout>
        <child>
            <object class="ttk.Label" id="label_main">
                <property name="padding">20</property>
                <property name="text" translatable="yes">Please add humans in the list !
                </property>
                <layout>
                    <property name="column">0</property>
                    <property name="propagate">True</property>
                    <property name="row">0</property>
                </layout>
            </object>
        </child>
    </object>
    <object class="tk.LabelFrame" id="LabelFrame_NewHuman">
        <property name="height">300</property>
        <property name="relief">raised</property>
        <property name="takefocus">true</property>
        <property name="text" translatable="yes">New Human
        </property>
        <property name="width">300</property>
        <layout>
            <property name="column">0</property>
            <property name="propagate">True</property>
            <property name="row">0</property>
        </layout>
        <child>
            <object class="tk.Message" id="Message_name">
                <property name="anchor">w</property>
                <property name="cursor">arrow</property>
                <property name="font">TkTextFont</property>
                <property name="justify">left</property>
                <property name="relief">flat</property>
                <property name="takefocus">false</property>
                <property name="text" translatable="yes">Name</property>
                <property name="textvariable">string:human name</property>
                <property name="width">0</property>
                <layout>
                    <property name="column">0</property>
                    <property name="propagate">True</property>
                    <property name="row">0</property>
                </layout>
            </object>
        </child>
        <child>
            <object class="tk.Entry" id="Entry_Name">
                <property name="cursor">arrow</property>
                <property name="font">TkDefaultFont</property>
                <property name="justify">left</property>
                <property name="takefocus">false</property>
                <property name="text" translatable="yes">
                </property>
                <property name="textvariable">string:human1</property>
                <layout>
                    <property name="column">1</property>
                    <property name="propagate">True</property>
                    <property name="row">0</property>
                </layout>
            </object>
        </child>
        <child>
            <object class="tk.Message" id="Message_age">
                <property name="cursor">arrow</property>
                <property name="font">TkDefaultFont</property>
                <property name="relief">flat</property>
                <property name="takefocus">true</property>
                <property name="text" translatable="yes">Age</property>
                <layout>
                    <property name="column">0</property>
                    <property name="propagate">True</property>
                    <property name="row">1</property>
                </layout>
            </object>
        </child>
        <child>
            <object class="tk.Entry" id="Entry_Age">
                <property name="justify">left</property>
                <property name="textvariable">int:40</property>
                <layout>
                    <property name="column">1</property>
                    <property name="propagate">True</property>
                    <property name="row">1</property>
                    <property name="sticky">s</property>
                </layout>
            </object>
        </child>
        <child>
            <object class="ttk.Button" id="button_add_human">
                <property name="command">on_button_add_human_clicked</property>
                <property name="text" translatable="yes">Add</property>
                <layout>
                    <property name="column">1</property>
                    <property name="propagate">True</property>
                    <property name="row">2</property>
                </layout>
            </object>
        </child>
    </object>
</interface>

people/Human.py

0 → 100644
+17 −0
Original line number Diff line number Diff line
import string

"""
Module Human
"""
class Human:
    def __init__(self, name: string, age: int):
        self.age = age
        self.name = name

    def change_age(self, age: int):
        """
        change the age
        :param age:
        :return:
        """
        self.age = age

people/ListOfHumans.py

0 → 100644
+63 −0
Original line number Diff line number Diff line
from src.people.Human import Human


class ListOfHumans:
    """
    manage a list of humans
    """

    def __init__(self, human: Human = None):

        self.separator = ","
        self.humans = []
        if human:
            assert isinstance(human, Human)
            self.humans.append(human)

    def __str__(self):
        return self.get_names_and_ages()

    def get_names_and_ages(self) -> str:
        """
        return a ist of names and ages separated with commas
        :return: str: list of names and ages separated with comma
        """
        human_info = []
        for human in self.humans:
            human_info.append(
                "{name}: age = {age}".format(name=human.name, age=human.age)
            )
        return self.separator.join(human_info)

    def add_human(self, human: Human):
        """
        add a human in the list
        :param human:
        :return: None
        """
        assert isinstance(human, Human)
        self.humans.append(human)

    def get_average_age(self) -> float:
        """
        return the average of the age of all the humans
        :return: float: average of the age of all the humans
        """

        total_age = 0
        for human in self.humans:
            total_age += human.age

        return total_age / len(self.humans)

    def __calculate_mean(a: int, b: int) -> float:
        """
        calculate a+b
        :return:
        :param a:
        :param b:
        :return:
        """
        assert isinstance(a, int)
        assert isinstance(b, int)
        return (a + b) / 2
Loading