Tkinter 的 Canvas 控件

# 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)来实现


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值