python学习交流

python 之 enum 定义枚举类

2020-03-25  本文已影响0人  水之心

参考:enum --- 对枚举的支持

枚举是一组符号名称(枚举成员)的集合,枚举成员应该是唯一的、不可变的。在枚举中,可以对成员进行恒等比较,并且枚举本身是可迭代的。在 Python 中提供了 enum 模块对枚举进行支持。

此模块定义了四个枚举类,它们可被用来定义名称和值的不重复集合: Enum(用于创建枚举常量), IntEnum(用于创建属于 int 的子类的枚举常量), Flag(用于创建枚举常量 可使用按位运算符进行组合而不会丢失其 Flag 成员资格的枚举常量。)和 IntFlag(用于创建可使用按位运算符进行组合而不会丢失其 IntFlag 成员资格的枚举常量。 IntFlag 成员同样也是 int 的子类。)。 此外还定义了一个装饰器 unique()(可确保只将一个名称绑定到任意一个值) 和一个辅助类 auto(实例会被替换为一个可作为 Enum 成员的适当的值。 初始值从 1 开始。)

直接看实例:

from enum import Enum, auto, unique
from tkinter import Tk, Canvas

@unique
class Atom(Enum):
    rectangle = auto()
    oval = auto()
    arc = auto()
    line = auto
    image = auto()
    text = auto()
    polygon = auto()
    window = auto()
    bitmap = auto()


class GraphAtom(Canvas):
    def __init__(self, master=None, cnf={}, **kw):
        '''The base class of all graphics frames.

        :param master: a widget of tkinter or tkinter.ttk.
        '''
        super().__init__(master, cnf, **kw)
        
    def create(self, graph, *args, **kw):
        '''
        :param graph: Atom 中的元素
        '''
        return eval(f"self.create_{graph.name}")(*args, **kw)

class Graph(GraphAtom):
    def __init__(self, master=None, atom=Atom.rectangle, cnf={}, **kw):
        '''
        :param atom: Atom.line, Atom.oval, Atom.rectangle
        '''
        super().__init__(master, cnf, **kw)
        self.atom = atom
        self.lastx, self.lasty = 0, 0
        self.bind("<Button-1>", self.xy) # 绑定鼠标左键
        self.bind("<ButtonRelease-1>", self.add) # 拖动鼠标左键

    def xy(self, event):
        '''更新坐标'''
        self.lastx, self.lasty = event.x, event.y
        
    def add(self, event):
        self.create(self.atom, self.lastx, self.lasty, event.x, event.y, fill='red', width=3)
        self.xy(event)
    
    def layout(self):
        self.grid(column=0, row=0, sticky='nwes')
        
if __name__ == "__main__":
    root = Tk()
    root.columnconfigure(0, weight=1)
    root.rowconfigure(0, weight=1)
    segment = Graph(root, Atom.rectangle)
    segment.layout()
    root.mainloop()
上一篇 下一篇

猜你喜欢

热点阅读