Python策略设计模式

时间:2018-03-13 12:47:17

标签: python-3.x design-patterns encapsulation

我为我糟糕的英语道歉。

我需要你的帮助。我只是带来了策略设计模式,我用简单的例子理解了模式,但是我的项目中的实现对我来说非常困惑,也许你可以帮助我。

我有两个类:

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

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

这两个类需要90%相同的方法,而我有2个其他方法。我如何开始封装可更改的?因为按钮,无论是收音机,复选框还是按钮,都只能使用创建方法

创建

谢谢你的帮助

0 个答案:

没有答案