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()