# Tkinter 的 Canvas 控件是一个用于绘制图形和构建复杂用户界面的强大工具。 # 它允许你在窗口中绘制线条、矩形、椭圆、多边形、文本、图像等元素,并且可以处理鼠标事件和其他交互。 # Canvas 控件具有两个功能,首先它可以用来绘制图形 # ,比如弧形、线条、椭圆形、多边形和矩形等,其次 Canvas 控件还可以用来展示图片(包括位图),我们将这些在画布控件上绘制的图形,称之为“画布对象” #创建一个很简单的画布 import tkinter as tk # def main(): # root = tk.Tk() # root.geometry('400x400') # root.resizable(0, 0) # 禁止窗口调整大小 # # # 创建画布 # canvas = tk.Canvas(root, # height=600, # 画布的高度为600像素 # width=600, # 画布的宽度为600像素 # bg='grey', # 画布的背景颜色为灰色 # bd=5, # 画布的边框宽度为5像素 # closeenough=1.0, # 当鼠标与画布上的对象之间的距离小于或等于1.0单位时,认为鼠标位于该对象之上 # confine=True, # 如果设置为True,则画布不允许滚动超出其可视内容的最大边界 # state='disabled', # 设置画布状态为禁用,通常用于防止用户交互 # takefocus=False, # 禁止画布获取焦点 # xscrollincrement='10p', # 设置水平滚动增量为 10 点 # yscrollincrement='10p') # 设置垂直滚动增量为 10 点 # # # 创建水平滚动条 # x_scrollbar = tk.Scrollbar(root, orient=tk.HORIZONTAL, command=canvas.xview) # x_scrollbar.pack(side=tk.BOTTOM, fill=tk.X) # 将滚动条放置在窗口底部 # # # 创建垂直滚动条 # y_scrollbar = tk.Scrollbar(root, orient=tk.VERTICAL, command=canvas.yview) # y_scrollbar.pack(side=tk.RIGHT, fill=tk.Y) # 将滚动条放置在窗口右侧 # # # 配置画布与滚动条关联 # canvas.config(xscrollcommand=x_scrollbar.set, yscrollcommand=y_scrollbar.set) # # # 设置画布的滚动区域 # # 由于画布的尺寸大于窗口的尺寸,因此默认情况下滚动条将可用 # canvas.config(scrollregion=(0, 0, 600, 600)) # 滚动区域与画布尺寸一致 # # def create_line(*coords, **options): # 定义线段 # """根据给定的坐标创建一条或多条线段""" # # 使用 *coords 可以接受任意数量的位置参数 # # 使用 **options 可以接受任意数量的关键字参数 # if len(coords) % 2 != 0: # raise ValueError("坐标数量必须是偶数") # # 在画布上创建线 # line_id = canvas.create_line(*coords, **options) # return line_id # # def create_oval(x0, y0, x1, y1, **options): # """根据给定的坐标创建一个圆形或椭圆形""" # # 在画布上创建圆形或椭圆形 # oval_id = canvas.create_oval(x0, y0, x1, y1, **options) # return oval_id # # # 绘制一些线段 # create_line(50, 50, 150, 150, fill="red") # 绘制红色线段 # create_line(200, 200, 300, 300, fill="blue", dash=(4, 2)) # 绘制蓝色虚线线段 # # # 绘制一个带有所有提到样式的椭圆 # create_oval(250, 250, 350, 350, # 绘制椭圆的坐标范围 # fill="green", # 椭圆内部颜色 # outline="black", # 轮廓颜色 # width=3, # 轮廓线宽 # tags="my_oval", # 添加标签 # dash=(5, 3), # 虚线样式 # dashoffset=2, # 虚线起始偏移量 # activefill="blue", # 活动状态下的填充颜色 # activewidth=5, # 活动状态下的轮廓线宽度 # state=tk.NORMAL) # 图形状态 # # canvas.pack(pady=5) # 在画布周围留出5像素的边距 # # # 启动事件循环 # root.mainloop() # # if __name__ == "__main__": # main() #这是较难的画布,尽量将控件能加的都加了 import tkinter as tk def main(): root = tk.Tk() root.title("Tkinter Canvas with Scrollbar") root.geometry('800x600') # 设置窗口尺寸 root.resizable(0, 0) # 创建 Canvas 并允许水平和垂直滚动 canvas = tk.Canvas(root, height=600, # 画布的高度为600像素 width=600, # 画布的宽度为600像素 bg='grey', # 画布的背景颜色为灰色 bd=5, # 画布的边框宽度为5像素 closeenough=1.0, # 当鼠标与画布上的对象之间的距离小于或等于1.0单位时,认为鼠标位于该对象之上 confine=False, # 允许画布滚动到其内容之外 state='normal', # 设置画布状态为正常,允许用户交互 takefocus=False, # 禁止画布获取焦点 xscrollincrement='10p', # 设置水平滚动增量为 10 点 yscrollincrement='10p') # 设置垂直滚动增量为 10 点 # 添加垂直滚动条 v_scrollbar = tk.Scrollbar(root, orient=tk.VERTICAL, command=canvas.yview) v_scrollbar.pack(side=tk.RIGHT, fill=tk.Y) # 添加水平滚动条 h_scrollbar = tk.Scrollbar(root, orient=tk.HORIZONTAL, command=canvas.xview) h_scrollbar.pack(side=tk.BOTTOM, fill=tk.X) # 配置 Canvas 使用滚动条 canvas.config(xscrollcommand=h_scrollbar.set, yscrollcommand=v_scrollbar.set) canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) # 设置滚动区域 canvas.config(scrollregion=(0, 0, 1000, 1000)) # 绘制一个多边形 polygon_id = canvas.create_polygon(400, 100, 500, 200, 400, 300, 300, 200, fill="yellow", outline="purple", width=5) # 绘制一个矩形 rectangle_id = canvas.create_rectangle(100, 400, 200, 500, fill="orange", outline="white", width=5) # 绘制一段文本 text_id = canvas.create_text(300, 450, text="Hello, Tkinter!", font=("Arial", 16), fill="white", anchor=tk.NW) # 绘制一个内置的标准位图图标 bitmap_id = canvas.create_bitmap(100, 50, bitmap="info") # 绘制一个弧形 arc_id = canvas.create_arc(100, 100, 200, 200, start=0, extent=180, fill="red", outline="black", width=5) # 绘制一个椭圆 oval_id = canvas.create_oval(600, 100, 700, 200, fill="blue", outline="black", width=5) # 绘制一条线 line_id = canvas.create_line(100, 100, 200, 200, fill="green", width=5, arrow=tk.LAST, arrowshape=(10, 10, 5)) # 绘制一个点 point_id = canvas.create_line(300, 300, 301, 301, fill="magenta", width=10) # 绘制一个窗口 window_id = canvas.create_window(500, 500, window=tk.Label(root, text="Window", bg="white", fg="black")) # 绘制一个标签 label_id = canvas.create_text(400, 550, text="Label Text", font=("Arial", 14), fill="white", justify=tk.CENTER, anchor=tk.CENTER) # 绘制一个箭头 arrow_id = canvas.create_line(400, 600, 500, 600, fill="black", width=5, arrow=tk.FIRST, arrowshape=(10, 10, 5)) # 绘制一个虚线 dash_id = canvas.create_line(600, 600, 700, 600, fill="black", width=5, dash=(4, 4)) # 绘制一个实心圆 solid_circle_id = canvas.create_oval(750, 550, 770, 570, fill="black", outline="black") # 绘制一个空心圆 hollow_circle_id = canvas.create_oval(780, 550, 800, 570, outline="black", width=5) # 绘制一个矩形框内的文本 box_text_id = canvas.create_rectangle(550, 650, 750, 750, fill="white", outline="black") canvas.create_text(650, 700, text="Boxed Text", font=("Arial", 14), fill="black", anchor=tk.CENTER) # 绘制一个带有阴影的矩形 shadow_rect_id = canvas.create_rectangle(700, 300, 800, 400, fill="white", outline="black", stipple="gray50") root.mainloop() if __name__ == "__main__": main() # width 指定 Canvas 的宽度,单位为像素 #height 指定Canvas的高度,单位为像素 # background(bg) 指定 Canvas 控件的背景颜色 # borderwidth(bd) 指定 Canvas 控件的边框宽度 # closeenough 1. 指定一个距离,当鼠标与画布对象的距离小于该值时,认为鼠标位于画布对象上 2. 该选项是一个浮点类型的值 #closeenough='1.0' 这一行设置了一个阈值,使得当鼠标与画布上的对象之间的距离小于或等于 1.0 单位时,认为鼠标位于该对象之上。这里的单位通常是像素 # confine 1. 指定 Canvas 控件是否允许滚动超出 scrollregion 选项设置的滚动范围,默认值为 True # scrollregion 接受四个整数作为参数,分别代表左、上、右、下的坐标值。 # 这些坐标值定义了一个矩形区域,该矩形区域定义了 Canvas 可视内容的最大边界。如果内容超出了这个矩形区域,用户可以通过滚动条来查看不可见的部分 # selectbackground 指定当画布对象(即在 Canvas 画布上绘制的图形)被选中时的背景色, # selectborderwidth 指定当画布对象被选中时的边框宽度(选中边框) # selectforeground 指定当画布对象被选中时的文本颜色 # Canvas 本身并不直接支持 selectbackground, selectborderwidth, 和 selectforeground 这些属性 # ,但可以使用 tag_bind 方法结合 itemconfigure 来实现类似的功能 # state 设置 Canvas 的状态:“normal” 或 “disabled”,默认值是 “normal”,注意,该值不会影响画布对象的状态 #当设置为‘disabled’时,Canvas 控件将变得不可交互,将不能在画布上执行任何操作,如点击或拖拽等。 # takefocus 指定使用 Tab 键可以将焦点移动到输入框中, # 默认为开启,将该选项设置为 False 避免焦点在此输入框中, # 表示画布不会接收键盘焦点,意味着不能通过 Tab 键将焦点切换到画布上。 #画布内容: 确保画布中的内容大于画布的可视区域,这样才会显示滚动条 # xscrollcommand 与 scrollbar(滚动条)控件相关联(沿着 x 轴水平方向) # xscrollincrement 1. 该选项指定 Canvas 水平滚动的“步长” 2. 例如 ‘3c’ 表示 3 厘米, # 还可以选择的单位有 ‘i’(英寸),‘m’(毫米)和 ‘p’(DPI,大约是 ‘1i’ 等于 ‘72p’) 3. 默认为 0,表示可以水平滚动到任意位置 # yscrollcommand 与 scrollbar 控件(滚动条)相关联(沿着 y 轴垂直方向) # 2. 例如 ‘3c’ 表示 3 厘米,还可以选择的单位有 ‘i’(英寸), # ‘m’(毫米)和 ‘p’(DPI,大约是 ‘1i’ 等于 ‘72p’) 3. 默认值是 0,表示可以垂直方向滚动到任意位置 # create_line(x0, y0, x1, y1, … , xn, yn, options) # 1. 根据给定的坐标创建一条或者多条线段; # 2. 参数 x0,y0,x1,y1,…,xn,yn 定义线条的坐标; # 3. 参数 options 表示其他可选参数 #线段的长度就是这两点之间的欧几里得距离。 # 如果提供了更多的坐标点,如 x0, y0, x1, y1, ..., xn, yn,那么将会创建一系列连续的线段, # 每一对坐标定义了一个线段的起始点和结束点。 #dash 参数通常是一个元组,其中包含一系列整数。每个整数代表线段的长度,按顺序交替表示实线段和空隙的长度。 # 实线段:指的是实际绘制的线段长度。 # 空隙:指的是不绘制的线段长度,即线条中的空白部分 # create_line(200, 200, 300, 300, fill="blue", dash=(4, 2)) # 绘制蓝色虚线线段 # create_oval(x0, y0, x1, y1, options) # 1. 绘制一个圆形或椭圆形; # 2. 参数 x0 与 y0 定义绘图区域的左上角坐标;参数 x1 与 y1 定义绘图区域的右下角坐标; # 3. 参数 options 表示其他可选参数 #fill: 指定椭圆内部的颜色。如果未指定,则默认为透明。 # outline: 指定椭圆轮廓的颜色。如果未指定,则默认为黑色。 # width: 指定轮廓线的宽度(以像素为单位)。 # tags: 为椭圆添加标签,便于后续通过标签进行查找和操作。 # dash: 指定轮廓线的虚线样式,例如 (4, 2) 表示每4个像素的实线后面跟着2个像素的空白。 # dashoffset: 指定虚线样式开始的位置偏移量。 # activefill: 当图形处于活动状态时使用的填充颜色。 # activewidth: 当图形处于活动状态时使用的轮廓宽度。 # state: 图形的状态,可以是 'normal', 'hidden', 或 'disabled'def create_oval(x0, y0, x1, y1, **options): # create_polygon(x0, y0, x1, y1, … , xn, yn, options) # 1. 绘制一个至少三个点的多边形; # 2. 参数 x0、y0、x1、y1、…、xn、yn 定义多边形的坐标; # 3. 参数 options 表示其他可选参数 # create_rectangle(x0, y0, x1, y1, options) # 1. 绘制一个矩形; # 2. 参数 x0 与 y0 定义矩形的左上角坐标;参数 x 与 y1 定义矩形的右下角坐标; # 3. 参数 options 表示其他可选参数 # create_text(x0, y0, text, options) # 1. 绘制一个文字字符串。其中 # 2. 参数 x0 与 y0 定义文字字符串的左上角坐标,参数 text 定义文字字符串的文字; # 3. 参数 options 表示其他可选参数 # create_image(x, y, image) # 1. 创建一个图片; # 2. 参数 x 与 y 定义图片的左上角坐标; # 3. 参数 image 定义图片的来源,必须是 tkinter 模块的 BitmapImage 类或 PhotoImage 类的实例变量 # # create_bitmap(x, y, bitmap) # 1.创建一个位图; # 2.参数x与y定义位图的左上角坐标; # 3.参数bitmap定义位图的来源,参数值可以是gray12、gray25、gray50、gray75、hourglass、error、questhead、info、warning或question, # 或者也可以直接使用XBM(XBitmap)类型的文件,此时需要在XBM文件名称前添加一个 @ 符号,例如bitmap =@hello.xbm # create_arc(coord, start, extent, fill) # 1. 绘制一个弧形; # 2. 参数 coord 定义画弧形区块的左上角与右下角坐标; # 3. 参数 start 定义画弧形区块的起始角度(逆时针方向); # 4. 参数 extent 定义画弧形区块的结束角度(逆时针方向); # 5. 参数 fill 定义填充弧形区块的颜色。 # 对于封闭图形(如扇形、正方形等) # activedash: 当画布对象状态为 “active” 的时候,绘制虚线。 # activefill: 当画布对象状态为 “active” 的时候,填充颜色。 # activeoutline: 当画布对象状态为 “active” 的时候,绘制轮廓线。 # activeoutlinestipple: 当画布对象状态为 “active” 的时候,指定填充轮廓的位图。 # activestipple: 当画布对象状态为 “active” 的时候,指定填充的位图。 # activewidth: 当画布对象状态为 “active” 的时候,指定边框的宽度。 # 通用选项 # dash: 指定绘制虚线轮廓,与绘制线段的含义相同。 # dashoffset: 指定虚线轮廓开始的偏移位置。 # 禁用状态下的选项 # disableddash: 当画布对象状态为 “disabled” 的时候,绘制虚线。 # disabledfill: 当画布对象状态为 “disabled” 的时候,填充颜色。 # disabledoutline: 当画布对象状态为 “disabled” 的时候,绘制轮廓线。 # disabledoutlinestipple: 当画布对象状态为 “disabled” 的时候,指定填充轮廓的位图。 # disabledstipple: 当画布对象状态为 “disabled” 的时候,指定填充的位图。 # disabledwidth: 当画布对象状态为 “disabled” 的时候,指定边框的宽度。 # 其他选项 # extent: 指定跨度(从 start 选项指定的位置开始到结束位置的角度)默认值是 90.0。这个选项适用于 create_arc 方法。 # fill: 指定填充的颜色,空字符串表示透明。 # offset: 这个选项通常与位图填充相关联,用于指定填充位图的偏移。在 create_rectangle、create_oval 等方法中不适用。 # outline: 指定轮廓的颜色。 # outlineoffset: 这个选项通常与位图轮廓相关联,用于指定轮廓位图的偏移。在 create_rectangle、create_oval 等方法中不适用。 # outlinestipple: 当 outline 选项被设置时,该选项用于指定一个位图来填充边框,默认值是空字符串,表示黑色。在 create_rectangle、create_oval 等方法中不适用。 # start: 指定起始位置的偏移角度。这个选项适用于 create_arc 方法。 # style: 默认创建的是扇形("pieslice"),指定该方法创建的是扇形("pieslice")、弓形("chord")还是弧形("arc")。这个选项适用于 create_arc 方法。 # tags: 为创建的画布对象添加标签。 # width: 指定边框的宽度。 # 注意事项 # activedash, activefill, activeoutline, activeoutlinestipple, activestipple, activewidth, # disableddash, disabledfill, disabledoutline, disabledoutlinestipple, disabledstipple, disabledwidth 这些选项在 create_oval 方法中不是直接可用的。您可以使用 tag_bind 方法结合 itemconfigure 来实现这些功能。 # offset, outlineoffset, outlinestipple 通常与位图填充和轮廓相关联,在 create_oval 方法中不适用。 # extent, start, style 仅适用于 create_arc 方法,而不是 create_oval 方法。 # 综上所述,对于 create_oval 方法,适用的选项是 fill, outline, width, tags, dash, dashoffset, activefill, activewidth, 和 state。 # 其他选项要么不适用于 create_oval,要么需要通过其他方式(如 tag_bind 和 itemconfigure)来实现
Tkinter 的 Canvas 控件
最新推荐文章于 2025-02-10 05:16:20 发布