云计算百科
云计算领域专业知识百科平台

修改一段 tkinter 代码(二)

尝试用 ai 优化后

from tkinter import Tk, Canvas, Frame, Button
from typing import Callable

class OptimizedCanvasDemo:
# 提取常量,统一管理可配置参数
CANVAS_WIDTH = 200
CANVAS_HEIGHT = 100
CANVAS_BG = "white"
DEFAULT_FILL_COLOR = "red"
DEFAULT_LINE_WIDTH = 8
DEFAULT_FONT = ("Times", 10, "bold", "underline")
GRAPH_TAG_PREFIX = "graph_" # 统一图形标签前缀,便于批量管理

def __init__(self):
# 初始化主窗口
self.root = Tk()
self.root.title("Optimized Canvas Demo")

# 初始化画布
self.canvas = Canvas(
self.root,
width=self.CANVAS_WIDTH,
height=self.CANVAS_HEIGHT,
bg=self.CANVAS_BG
)
self.canvas.pack(padx=10, pady=10) # 增加边距,提升视觉体验

# 初始化按钮框架
self.button_frame = Frame(self.root)
self.button_frame.pack(padx=10, pady=5)

# 定义图形绘制配置:按钮文本 -> 绘制逻辑
self.graph_configs = {
"Rectangle": self._draw_rectangle,
"Oval": self._draw_oval,
"Arc": self._draw_arc,
"Polygon": self._draw_polygon,
"Line": self._draw_line,
"String": self._draw_string,
"Clear": self.clear_canvas # 清除按钮单独处理
}

# 批量创建按钮,减少重复代码
self._create_buttons()

# 启动主循环
self.root.mainloop()

def _create_buttons(self) > None:
"""批量创建按钮并布局,统一管理按钮样式和位置"""
for col_idx, (btn_text, callback) in enumerate(self.graph_configs.items(), start=1):
btn = Button(
self.button_frame,
text=btn_text,
command=callback,
padx=8, # 统一按钮内边距
pady=2
)
btn.grid(
row=1,
column=col_idx,
padx=3, # 按钮间水平间距
pady=5
)

def _draw_graph(self, tag_suffix: str, draw_func: Callable) > None:
"""
通用图形绘制封装:先删除同类型图形,再绘制新图形
:param tag_suffix: 图形标签后缀(区分不同图形)
:param draw_func: 实际绘制图形的回调函数
"""

# 统一标签格式,避免大小写/拼写错误
full_tag = f"{self.GRAPH_TAG_PREFIX}{tag_suffix.lower()}"
# 删除已存在的同类型图形,避免叠加
self.canvas.delete(full_tag)
# 执行具体绘制逻辑
draw_func(full_tag)

def _draw_rectangle(self) > None:
"""绘制矩形(封装到通用绘制逻辑)"""
def draw(tag: str):
self.canvas.create_rectangle(
10, 10,
self.CANVAS_WIDTH 10, # 动态计算坐标,适配画布尺寸
self.CANVAS_HEIGHT 10,
tags=tag
)
self._draw_graph("rectangle", draw)

def _draw_oval(self) > None:
"""绘制椭圆"""
def draw(tag: str):
self.canvas.create_oval(
10, 10,
self.CANVAS_WIDTH 10,
self.CANVAS_HEIGHT 10,
fill=self.DEFAULT_FILL_COLOR,
tags=tag
)
self._draw_graph("oval", draw)

def _draw_arc(self) > None:
"""绘制圆弧"""
def draw(tag: str):
self.canvas.create_arc(
10, 10,
self.CANVAS_WIDTH 10,
self.CANVAS_HEIGHT 10,
start=0,
extent=90,
width=self.DEFAULT_LINE_WIDTH,
fill=self.DEFAULT_FILL_COLOR,
tags=tag
)
self._draw_graph("arc", draw)

def _draw_polygon(self) > None:
"""绘制多边形"""
def draw(tag: str):
self.canvas.create_polygon(
10, 10,
self.CANVAS_WIDTH 10,
self.CANVAS_HEIGHT 10,
30, 50,
tags=tag
)
self._draw_graph("polygon", draw)

def _draw_line(self) > None:
"""绘制直线"""
def draw(tag: str):
self.canvas.create_line(
10, 10,
self.CANVAS_WIDTH 10,
self.CANVAS_HEIGHT 10,
fill=self.DEFAULT_FILL_COLOR,
tags=tag
)
self._draw_graph("line", draw)

def _draw_string(self) > None:
"""绘制文本"""
def draw(tag: str):
self.canvas.create_text(
60, 40,
text="Hi, I am a string",
font=self.DEFAULT_FONT,
tags=tag
)
self._draw_graph("string", draw)

def clear_canvas(self) > None:
"""清空所有图形(通过标签前缀批量删除,无需逐个列举)"""
# 匹配所有以GRAPH_TAG_PREFIX开头的标签,统一删除
all_graph_tags = [tag for tag in self.canvas.gettags("all") if tag.startswith(self.GRAPH_TAG_PREFIX)]
for tag in all_graph_tags:
self.canvas.delete(tag)

if __name__ == "__main__":
# 实例化时做防护,避免导入模块时自动执行
OptimizedCanvasDemo()

优化后代码的优点

可维护性大幅提升:

所有可配置参数(尺寸、颜色、字体)提取为类常量,修改时只需改一处,无需逐个方法调整。
图形标签统一前缀管理,新增图形后 clear_canvas 无需修改,符合 “开闭原则”。

代码冗余度降低:

封装 _draw_graph 通用绘制逻辑,消除重复的 “删除旧图形 + 创建新图形” 代码。
批量创建按钮(_create_buttons),新增按钮只需在 graph_configs 中添加配置,无需重复写 Button 和 grid 逻辑。

鲁棒性增强:

修复标签大小写问题,通过统一前缀 + 小写后缀避免匹配错误。
绘制图形前先删除同类型旧图形,避免叠加绘制;清空画布通过标签前缀批量匹配,无遗漏。

可读性与扩展性更好:

每个方法都有清晰注释,变量 / 方法名遵循 PEP8 规范(如 clear_canvas 替代 clearCanvas)。
主窗口、画布、按钮框架均为类属性,便于外部继承扩展(如子类新增图形类型)。
类型注解(Callable)提升代码提示和静态检查能力。

交互体验优化:

画布和按钮增加边距,按钮统一内边距 / 间距,视觉更规整。
重复点击同一按钮不会叠加图形,交互逻辑更符合用户预期。

规范与最佳实践:

使用 if name == “main” 防护,避免模块导入时自动执行。
显式导入 tkinter 组件(而非 from tkinter import *),避免命名冲突。

赞(0)
未经允许不得转载:网硕互联帮助中心 » 修改一段 tkinter 代码(二)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!