mardi 13 mars 2018

Python Strategy Design Pattern

I apologize for my bad English.

I need your help. I just bring strategy design pattern, I have understood the pattern with a simple example, but the implementation in my project is very confusing for me, maybe you can help me.

I have for example these two classes:

from tkinter import * from app.interface.settings import New_Font from app.controller.interface_elements.button_controller import Button_controller from app.controller.interface_elements.close_button_controller import Close_button_controller

class New_Button:

def __init__(self, insert_button_in_frame, text, width, position_X, position_Y, background_color, foreground_color, close_button_parameter):
    self._number_types              = {int, float}
    self.set_frame                  (insert_button_in_frame)
    self.set_text                   (text)
    self.set_width                  (width)
    self.set_position               (position_X, position_Y)
    self.set_color                  (background_color, foreground_color)
    self.set_close_button_parameter (close_button_parameter)
    if self.get_text() == 'Abbrechen':
        self.controller             = Close_button_controller(self.get_close_button_parameter())
    else:
        self.controller             = Button_controller()
    self.create_button              ()

def create_button(self):
    self.set_button(Button(self.get_frame(),
                           text=self.get_text(),
                           bg=self.get_background_color(),
                           fg=self.get_foreground_color(),
                           width=self.get_width(),
                           font=New_Font().get_defaultfont(),
                           command=lambda :self.controller.main_method()))
    self.get_button().place(x=self.get_position_X(),
                            y=self.get_position_Y())

def set_button(self, button):
    self._button = button

def get_button(self):
    return self._button

def set_frame(self, insert_button_in_frame):
    if type(insert_button_in_frame) == Frame:
        self._frame = insert_button_in_frame
    else: raise TypeError

def get_frame(self):
    return self._frame

def set_text(self, text):
    if type(text) == str:
        self._text = text
    else: raise TypeError()

def get_text(self):
    return self._text

def set_width(self, width):
    if type(width) in self._number_types:
        self._width = width
    else: raise TypeError

def get_width(self):
    return self._width

def set_position(self, position_X , position_Y):
    if type(position_X) in self._number_types and type(position_Y) in self._number_types:
        self._position_X = position_X
        self._position_Y = position_Y
    else: raise TypeError

def get_position_X(self):
    return self._position_X

def get_position_Y(self):
    return self._position_Y

def set_color(self, background_color, foreground_color):
    if type(background_color) == str and type(foreground_color) == str:
        self._background_color = background_color
        self._foreground_color = foreground_color
    else: raise TypeError

def get_background_color(self):
    return self._background_color

def get_foreground_color(self):
    return self._foreground_color

def set_controller(self, controller):
    self._controller = controller

def get_controller(self):
    return self._controller

def set_info(self, search_for):
    self._info = self.get_button().cget(search_for)

def get_info(self):
    return self._info

def set_close_button_parameter(self, close_button_parameter):
    self._close_button_parameter = close_button_parameter

def get_close_button_parameter(self):
    return self._close_button_parameter

and

from app.gui.top_frame import * from app.interface.settings import New_Font from app.controller.interface_elements.radiobutton_controller import Radiobutton_controller

class New_Radiobutton:

def __init__(self, frame_to_insert_radiobutton, radiobutton_label, button_horizontal_position, button_vertical_position, radiobutton_group, radiobutton_value, crawled_radiobuttons):
    self._number_types                      = {int, float}
    self._allowed_group_types               = {int, float, str}
    self._values                            = {1,3,5}
    self._disable                           = {3,4,5,6}
    self.set_frame_to_insert_radiobutton    (frame_to_insert_radiobutton)
    self.set_radiobutton_label              (radiobutton_label)
    self.set_position                       (button_horizontal_position, button_vertical_position)
    self.set_radiobutton_group              (radiobutton_group)
    self.set_radiobutton_value              (radiobutton_value)
    self.create_radiobutton()
    self._radiobutton_controller            = Radiobutton_controller(crawled_radiobuttons)
    self.set_first_radiobutton_of_a_group()

def create_radiobutton(self):

    self.set_radiobutton(Radiobutton(self.get_frame_to_insert_radiobutton(),
                                     text=self.get_radiobutton_label(),
                                     variable=self.get_radiobutton_group(),
                                     value=self.get_radiobutton_value(),
                                     font=New_Font().get_defaultfont(),
                                     command= lambda : self._radiobutton_controller.main_method()))
    self.get_radiobutton().place(x=self.get_button_horizontal_position(),
                                 y=self.get_button_vertical_position())

def set_first_radiobutton_of_a_group(self):
    if self.get_radiobutton_value() in self._values:
        self.get_radiobutton().invoke()
    if self.get_radiobutton_value() in self._disable:
        self.get_radiobutton().config(state=DISABLED)

def get_frame_to_insert_radiobutton(self):
    return self._frame_to_insert_radiobutton

def set_frame_to_insert_radiobutton(self, frame_to_insert_radiobutton):
    if type(frame_to_insert_radiobutton) == tkinter.Frame:
        self._frame_to_insert_radiobutton = frame_to_insert_radiobutton
    else: raise TypeError(frame_to_insert_radiobutton +
                          ' frame_to_insert_radiobutton i not from type tkinter.Frame')

def get_radiobutton_label(self):
    return self._radiobutton_label

def set_radiobutton_label(self, radiobutton_label):
    if type(radiobutton_label) == str:
        self._radiobutton_label = radiobutton_label
    else: raise TypeError(radiobutton_label +
                          ' radiobutton_label is not from type string')
def get_button_horizontal_position(self):
    return self._button_horizontal_position

def get_button_vertical_position(self):
    return self._button_vertical_position

def set_position(self, button_horizontal_position, button_vertical_position):
    if type(button_horizontal_position) and type(button_vertical_position) in self._number_types:
        self._button_horizontal_position = button_horizontal_position
        self._button_vertical_position = button_vertical_position
    else: raise TypeError(button_horizontal_position + ' ' + button_vertical_position +
                          ' button_horizontal_position or button_vertical_position or both is/are not from type number')

def get_radiobutton_group(self):
    return self._radiobutton_group

def set_radiobutton_group(self, radiobutton_group):
    if type(radiobutton_group) in self._allowed_group_types:
        self._radiobutton_group = radiobutton_group
    else: raise TypeError(radiobutton_group +
                          ' radiobutton_group is not from type int/float or string')

def get_radiobutton_value(self):
    return self._radiobutton_value

def set_radiobutton_value(self, radiobutton_value):
    if type(radiobutton_value) in self._number_types:
        self._radiobutton_value = radiobutton_value
    else: raise TypeError(radiobutton_value +
                          'radiobutton_value is not from type number')

def get_radiobutton_controller(self, radiobutton_controller):
    return self.get_radiobutton().cget(radiobutton_controller)

def set_radiobutton(self, radiobutton):
    self._radiobutton = radiobutton

def get_radiobutton(self):
    return self._radiobutton

both classes need 90% the same methods and I have 2 other methods where it is. how do I start encapsulating the changeable now? because the button, no matter if radio, checkbox or button, is only created with the create method

thank you for your help

Aucun commentaire:

Enregistrer un commentaire