精华内容
下载资源
问答
  • Draws an image on the canvas. position Image position, given as two coordinates. **options Image options. activeimage= anchor= Where to place the image relative to the given position. Default is ...
  • 实现:tkinter 画布上显示图片,按下鼠标左键并且移动,实现截图 代码如下 # -*- encoding=utf-8 -*- import os import tkinter as tk from PIL import Image from PIL import ImageTk left_mouse_down_x = 0 left_...
  • 对于用Canvas来实现简单游戏的程序来说, delete方法,是一个很重要的方法。 但是官方文档上好像并没有详细解释该方法,网上搜到的关于这个方法的教程比较零乱。 所以我选择直接去看该方法源码。 def delete(self, *...

    作者自我介绍:大爽歌, b站小UP主直播编程+红警三python1对1辅导老师

    0 前言

    对于用Canvas来实现简单游戏的程序来说,
    delete方法,是一个很重要的方法。

    但是官方文档上好像并没有详细解释该方法,网上搜到的关于这个方法的教程比较零乱。
    所以我选择直接去看该方法源码。

    def delete(self, *args):
        """Delete items identified by all tag or ids contained in ARGS."""
        self.tk.call((self._w, 'delete') + args)
    

    看源码主要看三点

    • 参数
    • 文档字符串(DocStrings)
    • 方法里面的具体代码
    1. 这个方法的参数是*args,对新手来说不是很容易看懂(所以到本文第二部分再讲)。
      就算看懂了也不明白具体参数的格式和效果。
    2. 这个方法里面的代码应该是调用了更底层的代码,很不容易看懂(反正我没看懂)

    那么就看第二点,该方法的文档字符串为

    Delete items identified by all tag or ids contained in ARGS.

    意思是:删掉所有args参数里面指定的tag和id所标识的项目

    结合这个说明和搜到的资料以及一些尝试,
    我梳理了下的使用方法,如下:

    1 delete方法的使用

    基础使用

    简单的来讲,delete方法可以清楚canvas画布上已绘制的对象
    主要有以下三种使用方法

    • delete(id): 通过id来删除。
      id是canvas.create_something的返回值
    • delete(tag): 通过tag来删除。
      tag通过canvas.create_something(tag=tag)来指定
    • delete("all"): 删除所有已绘制对象

    举个例子

    import tkinter as tk
    
    win = tk.Tk()
    canvas = tk.Canvas(win)
    canvas.pack()
    
    r1 = canvas.create_rectangle(50, 50, 100, 150, fill="red", tag="one")
    r2 = canvas.create_rectangle(150, 50, 200, 150, fill="green", tag=("two", "green"))
    r3 = canvas.create_oval(250, 50, 300, 150, fill="green", tag=("three", "green"))
    
    win.mainloop()
    

    其绘值效果如图
    在这里插入图片描述

    代码中r1,r2, r3分别为三个绘制对象的id

    三个绘制对象的tag通过tag参数指定了。
    需要额外注意的是:
    多个绘制对象可以使用同一个tag,一个绘制对象也可以使用多个tag

    第9行和第11行之间,调用delete方法来清理所有,代码示例如下

    • 通过id来删除
    canvas.delete(r1)
    canvas.delete(r2)
    canvas.delete(r3)
    
    • 通过tag来删除
    canvas.delete("one")
    canvas.delete("two")
    canvas.delete("three")
    
    canvas.delete("one")
    canvas.delete("green")  # 会同时删除掉r2和r3
    
    • 使用"all"删除所有
    canvas.delete("all")  # 会同时所有canvas已绘制的对象,即r1, r2和r3
    

    清理后效果均如图
    在这里插入图片描述

    一次删除多个

    delete方法其实可以一次删除多个项目

    canvas.delete(r1)
    canvas.delete(r2)
    canvas.delete(r3)
    

    可以简写成

    canvas.delete(r1, r2, r3)
    
    • 再比如
    canvas.delete("one")
    canvas.delete("two")
    canvas.delete("three")
    

    可以简写成

    canvas.delete("one", "two", "three")
    

    混合使用

    不仅如此,delete里面的参数可以id和tag混搭着使用 ,比如

    canvas.delete(r1, "two", "three")
    

    等价于

    canvas.delete(r1)
    canvas.delete("two")
    canvas.delete("three")
    

    2 回头再看*args

    看完1之后,*args这样一个参数就好理解了
    其代表函数能够接受不定数量个参数,可以接受0个,1个,多个。

    展开全文
  • 今天小编就为大家分享一篇在python tkinterCanvas实现进度条显示的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 使用tkinter画pillow生成的图片时,在tkinter中抛出此异常。 解决方案 pip install -I --no-cache-dir Pillow 更新pillow 重启解决一切问题,重新安装解决一切问题 二.tkinter画图片不起作用 tkinter画pillow图片...

    一.ImportError: cannot import name '_imagingtk'

    问题描述

    使用tkinter画pillow生成的图片时,在tkinter中抛出此异常。

    解决方案

    pip install -I --no-cache-dir Pillow
    更新pillow
    重启解决一切问题,重新安装解决一切问题

    二.tkinter画图片不起作用

    tkinter画pillow图片的代码

    import tkinter
    from  PIL import Image, ImageTk
    
    window = tkinter.Tk()
    canvas = tkinter.Canvas(window)
    img=ImageTk.PhotoImage(Image.open("beauty/0.jpg"))
    canvas.create_image(0,0,image=img)
    canvas.pack()
    window.mainloop()

    如果将创建ImageTk.PhotoImage的那句代码放到一个函数中,会出现十分奇葩的现象:图片不显示

    import tkinter
    
    from  PIL import Image, ImageTk
    
    
    def setImage(canvas):
        img = ImageTk.PhotoImage(Image.open("../beauty/0.jpg"))
        x = canvas.create_image(300, 300, image=img) 
        return img
    
    
    window = tkinter.Tk()
    canvas = tkinter.Canvas(window, width=400, height=400, bg='green')
    setImage(canvas)
    canvas.pack()
    window.mainloop()

    这是因为在setImage(canvas)函数结束返回后,img立马就被回收了。
    我只想说:日了狗了才会遇到这种bug。
    解决方法是:所有的PhotoImage在mainloop期间必须有引用指向它们。
    可以将setImage中的img变量定义成全局变量,也可以在把setImage函数返回来的img保存起来,总之,必须有引用指向PhotoImage,否则立马回收。
    这既然是Canvas的bug,那么Canvas该如何改变呢?定义一个数组,把自己画过的所有对象都保存起来。有可能是Canvas底层是C++,导致python和C++不协调。

    转载于:https://www.cnblogs.com/weiyinfu/p/6216484.html

    展开全文
  • 其实前面程序中的高亮显示已经是动画效果了。...下面以一个简单的桌面弹球游戏来介绍使用 Canvas 绘制动画。在游戏界面上会有一个小球,该小球会在界面上滚动,遇到边界或用户挡板就会反弹。该程序涉及两...

    其实前面程序中的高亮显示已经是动画效果了。程序会用红色、黄色交替显示几何图形的边框,这样看上去就是动画效果了。实现其他动画效果也是这个原理,程序只要增加一个定时器,周期性地改变界面上图形项的颜色、大小、位置等选项,用户看上去就是所谓的“动画”了。

    下面以一个简单的桌面弹球游戏来介绍使用 Canvas 绘制动画。在游戏界面上会有一个小球,该小球会在界面上滚动,遇到边界或用户挡板就会反弹。该程序涉及两个动画:

    • 小球转动:小球转动是一个“逐帧动画”,程序会循环显示多张转动的小球图片,这样用户就会看到小球转动的效果。
    • 小球移动:只要改变小球的坐标程序就可以控制小球移动。


    为了让用户控制挡板移动,程序还为 Canvas 的向左箭头、向右箭头绑定了事件处理函数。下面是桌面弹球游戏的程序:

     
    1. from tkinter import *
    2. from tkinter import messagebox
    3. import threading
    4. import random
    5. GAME_WIDTH = 500
    6. GAME_HEIGHT = 680
    7. BOARD_X = 230
    8. BOARD_Y = 600
    9. BOARD_WIDTH = 80
    10. BALL_RADIUS = 9
    11. class App:
    12. def __init__(self, master):
    13. self.master = master
    14. # 记录小球动画的第几帧
    15. self.ball_index = 0
    16. # 记录游戏是否失败的旗标
    17. self.is_lose = False
    18. # 初始化记录小球位置的变量
    19. self.curx = 260
    20. self.cury = 30
    21. self.boardx = BOARD_X
    22. self.init_widgets()
    23. self.vx = random.randint(3, 6) # x方向的速度
    24. self.vy = random.randint(5, 10) # y方向的速度
    25. # 通过定时器指定0.1秒之后执行moveball函数
    26. self.t = threading.Timer(0.1, self.moveball)
    27. self.t.start()
    28. # 创建界面组件
    29. def init_widgets(self):
    30. self.cv = Canvas(root, background='white',
    31. width=GAME_WIDTH, height=GAME_HEIGHT)
    32. self.cv.pack()
    33. # 让画布得到焦点,从而可以响应按键事件
    34. self.cv.focus_set()
    35. self.cv.bms = []
    36. # 初始化小球的动画帧
    37. for i in range(8):
    38. self.cv.bms.append(PhotoImage(file='images/ball_' + str(i+1) + '.gif'))
    39. # 绘制小球
    40. self.ball = self.cv.create_image(self.curx, self.cury,
    41. image=self.cv.bms[self.ball_index])
    42. self.board = self.cv.create_rectangle(BOARD_X, BOARD_Y,
    43. BOARD_X + BOARD_WIDTH, BOARD_Y + 20, width=0, fill='lightblue')
    44. # 为向左箭头按键绑定事件,挡板左移
    45. self.cv.bind('<Left>', self.move_left)
    46. # 为向右箭头按键绑定事件,挡板右移
    47. self.cv.bind('<Right>', self.move_right)
    48. def move_left(self, event):
    49. if self.boardx <= 0:
    50. return
    51. self.boardx -= 5
    52. self.cv.coords(self.board, self.boardx, BOARD_Y,
    53. self.boardx + BOARD_WIDTH, BOARD_Y + 20)
    54. def move_right(self, event):
    55. if self.boardx + BOARD_WIDTH >= GAME_WIDTH:
    56. return
    57. self.boardx += 5
    58. self.cv.coords(self.board, self.boardx, BOARD_Y,
    59. self.boardx + BOARD_WIDTH, BOARD_Y + 20)
    60. def moveball(self):
    61. self.curx += self.vx
    62. self.cury += self.vy
    63. # 小球到了右边墙壁,转向
    64. if self.curx + BALL_RADIUS >= GAME_WIDTH:
    65. self.vx = -self.vx
    66. # 小球到了左边墙壁,转向
    67. if self.curx - BALL_RADIUS <= 0:
    68. self.vx = -self.vx
    69. # 小球到了上边墙壁,转向
    70. if self.cury - BALL_RADIUS <= 0:
    71. self.vy = -self.vy
    72. # 小球到了挡板处
    73. if self.cury + BALL_RADIUS >= BOARD_Y:
    74. # 如果在挡板范围内
    75. if self.boardx <= self.curx <= (self.boardx + BOARD_WIDTH):
    76. self.vy = -self.vy
    77. else:
    78. messagebox.showinfo(title='失败', message='您已经输了')
    79. self.is_lose = True
    80. self.cv.coords(self.ball, self.curx, self.cury)
    81. self.ball_index += 1
    82. self.cv.itemconfig(self.ball, image=self.cv.bms[self.ball_index % 8])
    83. # 如果游戏还未失败,让定时器继续执行
    84. if not self.is_lose:
    85. # 通过定时器指定0.1秒之后执行moveball函数
    86. self.t = threading.Timer(0.1, self.moveball)
    87. self.t.start()
    88. root = Tk()
    89. root.title("弹球游戏")
    90. root.iconbitmap('images/fklogo.ico')
    91. root.geometry('%dx%d' % (GAME_WIDTH, GAME_HEIGHT))
    92. # 禁止改变窗口大小
    93. root.resizable(width=False, height=False)
    94. App(root)
    95. root.mainloop()

    上面程序中第 26、27 行代码通过线程启动了一个定时器,该定时器控制 moveball() 方法每隔 0.1 秒执行一次,而 moveball() 方法中通过改变小球的坐标可以实现小球移动的效果;通过改变小球的图片,可以实现小球滚动的效果。

    运行上面程序,可以看到如图 1 所示的游戏效果:



    图 1 桌面弹球游戏

    展开全文
  • 分类目录——tkinter 先看效果 其中蓝色区域为一块画布(Canvas)区域,在画布上放置了图片,画了圆形、方形、扇形;下方的按钮可以调用方法移动左边的矩形 Canvas应用实例 canvas = tk.Canvas(window, bg='blue', ...
  • [Tkinter 教程08] Canvas 图形绘制

    万次阅读 多人点赞 2017-03-06 22:03:15
    小练习简介CanvasTkinter 提供了绘图功能. 其提供的图形组件包括 线形, 圆形, 图片, 甚至其他控件. Canvas 控件为绘制图形图表, 编辑图形, 自定义控件提供了可能. 在第一个例子里, 我们将演示如何画一条直线. ...

    原系列地址: Python Tkinter

    简介

    Canvas 为 Tkinter 提供了绘图功能. 其提供的图形组件包括 线形, 圆形, 图片, 甚至其他控件. Canvas 控件为绘制图形图表, 编辑图形, 自定义控件提供了可能.
    在第一个例子里, 我们将演示如何画一条直线. create_line(coords, options) 方法用来绘制一条直线. coords 为以整形表示的四个坐标参数: x1, y1, x2, y2 . 这表示所要绘制的直线连接了 (x1, y1) 和 (x2, y2) 这两个点. 除坐标外, 该方法还接受其他可选的 options 参数. 在下面的例子里我们用 options 参数指定颜色为我们网站的主题色: fill=#476042 .
    因为是第一个例子, 所以我们尽量做了简化: 创建一个 canvas 对象然后在其上绘制一条水平直线. 这条直线将 canvas 分割为上下两部分.
    在传入坐标参数时, y = int(canvas_height / 2) 这种强制转换整形的表达式是没有必要的, 因为 create_line() 方法也接受 float 类型作为坐标参数, float 坐标数值将被自动转为整形. 下面是第一个例子的代码:

    from tkinter import *
    master = Tk()
    
    canvas_width = 80
    canvas_height = 40
    w = Canvas(master, 
               width=canvas_width,
               height=canvas_height)
    w.pack()
    
    y = int(canvas_height / 2)
    w.create_line(0, y, canvas_width, y, fill="#476042")
    
    mainloop()

    上述代码在 Python3 下会有如下显示:
    这里写图片描述

    使用 create_rectangle(coords, options) 方法可以绘制矩形. coords 参数依然表示两个点的坐标: 第一个点为左上角坐标, 第二个点为右下角坐标.
    这里写图片描述

    上面的窗口是由以下示例代码生成的:

    from tkinter import *
    
    master = Tk()
    
    w = Canvas(master, width=200, height=100)
    w.pack()
    
    w.create_rectangle(50, 20, 150, 80, fill="#476042")
    w.create_rectangle(65, 35, 135, 65, fill="yellow")
    w.create_line(0, 0, 50, 20, fill="#476042", width=3)
    w.create_line(0, 100, 50, 80, fill="#476042", width=3)
    w.create_line(150,20, 200, 0, fill="#476042", width=3)
    w.create_line(150, 80, 200, 100, fill="#476042", width=3)
    
    mainloop()

    下图阐释了上面两个例子中 create_lines()create_rectangle() 这两个方法中, 用到的各个坐标的含义:
    这里写图片描述

    绘制文字

    接下来我们将说明如何在 canvas 上绘制文字. 我们将直接修改上面的例子以作为新的示例. create_text() 方法用来在 canvas 上绘制文字. 该方法的头两个参数表示所要绘制的文字的坐标. 默认情况下, 文字将以此坐标为中心进行绘制. 当然, 你也可以复写 anchor 属性来改变文字绘制的对齐方式. 比如, anchor = NW 即为指定该点坐标为所绘文字的左上角. text 属性用以指定具体绘制在 canvas 上的文字.

    from tkinter import *
    
    canvas_width = 200
    canvas_height = 100
    
    colours = ("#476042", "yellow")
    box=[]
    
    for ratio in ( 0.2, 0.35 ):
       box.append( (canvas_width * ratio,
                    canvas_height * ratio,
                    canvas_width * (1 - ratio),
                    canvas_height * (1 - ratio) ) )
    
    master = Tk()
    
    w = Canvas(master, 
               width=canvas_width, 
               height=canvas_height)
    w.pack()
    
    for i in range(2):
        w.create_rectangle(box[i][0], box[i][1],box[i][2],box[i][3], fill=colours[i])
    
    w.create_line(0, 0,                 # canvas 原点
                  box[0][0], box[0][1], # box[0] 的左上角坐标
                  fill=colours[0], 
                  width=3)
    w.create_line(0, canvas_height,     # canvas 的左下角坐标
                  box[0][0], box[0][3], # box[0] 的左下角坐标
                  fill=colours[0], 
                  width=3)
    w.create_line(box[0][2],box[0][1],  # box[0] 的右上角坐标
                  canvas_width, 0,      # canvas 的右上角坐标
                  fill=colours[0], 
                  width=3)
    w.create_line(box[0][2], box[0][3], # box[0] 的右下角坐标
                  canvas_width, canvas_height, # canvas 的右下角坐标
                  fill=colours[0], width=3)
    
    w.create_text(canvas_width / 2,
                  canvas_height / 2,
                  text="Python")
    mainloop()

    虽然从代码上来看, 我们对之前的例子做了很大的改动, 但其所输出的结果却与前例相差不大, 仅仅在窗口的中间多了一个显示 “Python” 字样的方框:
    这里写图片描述

    本例中我们改用变量存储坐标等参数, 这使得改动变的方便. 比如, 要将整个画布的宽高设为 90 * 190, 将 box[0] 的宽高比设为 0.3, 在本例中将很容易做到, 但在之前的例子中却要修改很多代码.
    本例运行后显示如下窗口:
    这里写图片描述

    绘制 Oval

    图形 oval 是一个蛋形的曲线. 它形似椭圆, 但并不是椭圆. 事实上, oval 这个概念没有太明确的定义. 很多不同的曲线都被叫做 oval, 他们都有如下共同点:

    • 都是可微分的简单 (非自相交) 凸闭曲线
    • 他们比椭圆曲线简单
    • 至少有一条对称轴

    oval 这个词源自拉丁语中的 ovum, 意为 “蛋”, 这很好的描述了它: 一条描述蛋形状的曲线. 一个 oval 由两条半径不同的弧线组成. 下图是一个特殊的 oval:
    这里写图片描述

    我们可以使用如下方法在 canvas 中创建一个 oval:

    id = C.create_oval ( x0, y0, x1, y1, option, ... )

    该方法的返回值为所创建的 oval 对象在当前 canvas 上的 ID.
    下面的代码绘制了一个圆心在 (75, 75), 半径为 25 的正圆形:

    from tkinter import *
    
    canvas_width = 190
    canvas_height =150
    
    master = Tk()
    
    w = Canvas(master, 
               width=canvas_width, 
               height=canvas_height)
    w.pack()
    
    w.create_oval(50,50,100,100)
    
    mainloop()

    我们可以定义一个专门用来画正圆形的方法:

    def circle(canvas, x, y, r):
        id = canvas.create_oval(x-r, y-r, x+r, y+r)
        return id

    交互式绘图

    我们想要创建一个可在 canvas 上手动绘图的应用, 但 canvas 并未提供画单个点的方法. 我们可以通过绘制小的 oval 图形来解决这个问题:

    from tkinter import *
    
    canvas_width = 500
    canvas_height = 150
    
    def paint( event ):
       python_green = "#476042"
       x1, y1 = ( event.x - 1 ), ( event.y - 1 )
       x2, y2 = ( event.x + 1 ), ( event.y + 1 )
       w.create_oval( x1, y1, x2, y2, fill = python_green )
    
    master = Tk()
    master.title( "Painting using Ovals" )
    w = Canvas(master, 
               width=canvas_width, 
               height=canvas_height)
    w.pack(expand = YES, fill = BOTH)
    w.bind( "<B1-Motion>", paint )
    
    message = Label( master, text = "Press and Drag the mouse to draw" )
    message.pack( side = BOTTOM )
    
    mainloop()

    这里写图片描述

    绘制多边形

    如果要绘制一个多边形, 可以使用 create_polygon(x0, y0, x1, y1, x2, y2, ...) 方法. 至少要传入三个点的坐标才可以绘制一个多边形.
    下例用该方法绘制了一个三角形:

    from tkinter import *
    
    canvas_width = 200
    canvas_height =200
    python_green = "#476042"
    
    master = Tk()
    
    w = Canvas(master, 
               width=canvas_width, 
               height=canvas_height)
    w.pack()
    
    points = [0,0,canvas_width,canvas_height/2, 0, canvas_height]
    w.create_polygon(points, outline=python_green, 
                fill='yellow', width=3)
    
    mainloop()

    运行后显示为如下窗口:
    这里写图片描述

    或许你在读到这篇教程时圣诞节 马上就到了/为时尚早. 这里我们用 Python 和 Tkinter 做一些星星来装点我们的圣诞树. 第一课星星几乎没有用到任何编程技巧:

    from tkinter import *
    
    canvas_width = 200
    canvas_height =200
    python_green = "#476042"
    
    master = Tk()
    
    w = Canvas(master, 
               width=canvas_width, 
               height=canvas_height)
    w.pack()
    
    points = [100, 140, 110, 110, 140, 100, 110, 90, 100, 60, 90, 90, 60, 100, 90, 110]
    
    w.create_polygon(points, outline=python_green, 
                fill='yellow', width=3)
    
    mainloop()

    这里写图片描述

    上例非常没有技术含量. 如果我们要改变星星的大小或胖瘦, 该怎么办? 上例中我们只能重新指定所有点的坐标, 这种做法乏味且易出错. 因此, 我们用了更多的编程技巧改造了上例. 首先, 我们将星星的绘制放在一个方法体中, 并用星星的原点及两个长度指定星星的具体形状:
    这里写图片描述

    经过改造的代码如下:

    from tkinter import *
    
    canvas_width = 400
    canvas_height =400
    python_green = "#476042"
    
    def polygon_star(canvas, x,y,p,t, outline=python_green, fill='yellow', width = 1):
       points = []
       for i in (1,-1):
          points.extend((x,       y + i*p))
          points.extend((x + i*t, y + i*t))
          points.extend((x + i*p, y))
          points.extend((x + i*t, y - i * t))
    
       print(points)
    
       canvas.create_polygon(points, outline=outline, 
                             fill=fill, width=width)
    
    master = Tk()
    
    w = Canvas(master, 
               width=canvas_width, 
               height=canvas_height)
    w.pack()
    
    p = 50
    t = 15
    
    nsteps = 10
    step_x = int(canvas_width / nsteps)
    step_y = int(canvas_height / nsteps)
    
    for i in range(1, nsteps):
       polygon_star(w,i*step_x,i*step_y,p,t,outline='red',fill='gold', width=3)
       polygon_star(w,i*step_x,canvas_height - i*step_y,p,t,outline='red',fill='gold', width=3)
    
    mainloop()

    这个例子的运行结果更像一个X形. 很显然, 用逐个指定坐标点的方法绘制这个图形将无比麻烦.
    这里写图片描述

    绘制Bitmap

    create_bitmap() 方法用来绘制 bitmap. 以下 bitmap 在所有平台上都可用:
    “error”, “gray75”, “gray50”, “gray25”, “gray12”, “hourglass”, “info”, “questhead”, “question”, “warning”
    下例将这些 bitmap 全部都绘制在一个 canvas 上:

    from tkinter import *
    
    canvas_width = 300
    canvas_height =80
    
    master = Tk()
    canvas = Canvas(master, 
               width=canvas_width, 
               height=canvas_height)
    canvas.pack()
    
    bitmaps = ["error", "gray75", "gray50", "gray25", "gray12", "hourglass", "info", "questhead", "question", "warning"]
    nsteps = len(bitmaps)
    step_x = int(canvas_width / nsteps)
    
    for i in range(0, nsteps):
       canvas.create_bitmap((i+1)*step_x - step_x/2,50, bitmap=bitmaps[i])
    
    mainloop()

    结果如下:
    这里写图片描述

    绘制图片

    使用 create_image(x0, x0, options ...) 用来在 canvas 上绘制图片. 该方法不能直接接受图片路径等作为参数, 而是接受一个 PhotoImage 对象作为图片参数. PhotoImage 类用于读取图片, 但其只能读取 GIF 和 PGM/PPM 格式的图片.

    from tkinter import *
    
    canvas_width = 300
    canvas_height =300
    
    master = Tk()
    
    canvas = Canvas(master, 
               width=canvas_width, 
               height=canvas_height)
    canvas.pack()
    
    img = PhotoImage(file="rocks.ppm")
    canvas.create_image(20,20, anchor=NW, image=img)
    
    mainloop()

    上面的代码运行后输出如下窗口:
    这里写图片描述

    小练习

    编写一个方法绘制一个棋盘: checkered(canvas, line_distance), 其中: “canvas” 即 Canvas 对象, 棋盘在其上绘制; “line_distance” 为线间距.
    这里写图片描述

    代码如下:

    from tkinter import *
    
    def checkered(canvas, line_distance):
       # vertical lines at an interval of "line_distance" pixel
       for x in range(line_distance,canvas_width,line_distance):
          canvas.create_line(x, 0, x, canvas_height, fill="#476042")
       # horizontal lines at an interval of "line_distance" pixel
       for y in range(line_distance,canvas_height,line_distance):
          canvas.create_line(0, y, canvas_width, y, fill="#476042")
    
    
    master = Tk()
    canvas_width = 200
    canvas_height = 100 
    w = Canvas(master, 
               width=canvas_width,
               height=canvas_height)
    w.pack()
    
    checkered(w,10)
    
    mainloop()

    上面的代码运行后输出如下窗口:
    这里写图片描述


    译者水平有限, 如有疏漏, 欢迎指正.
    已获得原作者授权. 原文地址: Canvas Widgets

    展开全文
  • Tkinter Canvas

    2020-04-06 11:42:41
    Tkinter Canvas 觉得有用的话,欢迎一起讨论相互学习~ 感谢莫烦 演示效果 创建windows window = tk.Tk() window.title('my window') window.geometry('500x500') 循环刷新窗口 window.mainloop() # 不断刷新主...
  • from tkinter import * window = Tk() w = Canvas(window,width=200,height=200,background="white") w.pack() w.create_line(0,100, 200, 100, fill='blue', dash=(4, 4)) w.create_line(100, 0, 100, 200, fi....
  • 这篇文章主要介绍了python tkinter canvas使用实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 注:在使用 create_arc 绘制弧时,和 create_oval 的用法...
  • from tkinter import * def data(): for i in range(50): Label(frame,text=i).grid(row=i,column=0) Label(frame,text="my text"+str(i)).grid(row=i,column=1) Label(frame,text="..........").grid(row=i,...
  • tkinter中的canvas的边框问题

    千次阅读 2020-02-20 15:00:41
    使用tkinter中创建canvas时,会设置canvas的宽高。一般我们认为canvas中画图区域就是设置的宽高。其实这不太正确,canvas还有一个边框,如果不另外设置,真正的画图区域要减去边框。 比如我们容器的尺寸为width, ...
  • Tkinter打造GUI开发工具(39)Tkinter中的异形花形窗口 在前面我们介绍了以图片为主体的Tkinter皮肤框架,见博客前面的文章:用Tkinter打造GUI开发工具(23)软件窗口皮肤。 ...软件皮肤可以美化了很土气的Tkinter原始...
  • Python tkinter库之Canvas正方形旋转

    千次阅读 2021-03-28 22:11:30
    canvas.create_rectangle() 只能画水平放置的矩形,旋转任意角度的矩形只能用tCanvas.create_polygon() 来达成,如下图: 旋转方式一:以左下角为定点,逆时针旋转a角度; 旋转方式二:以中心点为定点,逆时针...
  • 列举了以下Canvas画布的清理一些方法,简单实用。 #-*- encoding=UTF-8 -*- __author__ = 'daniu' ...import tkinter as tk def clearAll(): canvas.delete(tk.ALL) def clearXX(): canvas.delete(c3) ...
  • import tkinter as tk root = tk.Tk() root.geometry() cv = tk.Canvas(root, bg = 'gray') cv.pack() rt1 = cv.create_rectangle(50,50,110,110, activefill = 'gray75',tag = ('r','r1')) rt2 = cv.create_...
  • tkinter canvas删除某部分内容

    千次阅读 2019-12-25 09:31:49
    canvas.delete("all") 删除部分内容(创建内容时加入标签tags,删除时将“all”改成你设定的标签) e.g. o1=self.create_text(900,150,text="ORB点特征提取",fill='green', font = "time 30 bold underline",tags...
  • 正在尝试着做一个比较完善的画图软件,计划使用tkinter库中的canvas控件来做,目前终于可以拿出来和大家见面了。 不忘初心,方得始终,让我们一起共勉! 好的,言归正传,下面我将详细介绍整个项目的建设过程。 先说...
  • from tkinter import * from PIL import ImageTk root = Tk() numIdx = 6 frames = [ImageTk.PhotoImage(file='./data/'+str(i)+'.jpg') for i in range(1,7)] def update(idx): # 定时器函数 frame = frames...
  • 正在尝试着做一个比较完善的画图软件,计划使用tkinter库中的canvas控件来做,然后正在攻关canvas控件的相关知识,因此作为这个画图软件的附带产出物,整理成了本篇博文,分享给大家,一起研究研究,期待能对你工作...
  • import tkinter as tk import pyautogui as ag import tkinter.messagebox as Msgbox from time import sleep as Delay def Window_Open(W, H): X, Y = ag.size() winSize = str(W)+"x"+str(H) winPos = winSize...
  • tkinter Canvas 实现 鼠标手绘画板 功能

    千次阅读 2020-06-13 10:05:12
    下面代码简单实现了画板功能,其实也是Canvas的教程,后面都给加了注释。 这里通过列表来存储笔画,实现撤销恢复功能,右键有菜单。 import tkinter as tk ... s.win.title("tkinter Canvas") # 窗口标题
  • Tkinter 学习-Canvas

    万次阅读 多人点赞 2018-07-08 14:32:44
    The Tkinter Canvas WidgetCanvas(画布)组件为 Tkinter 的图形绘制提供了基础。Canvas 是一个高度灵活的组件,你可以用它绘制图形和图表,创建图形编辑器,并实现各种自定义的小部件。何时使用 Canvas 组件? ...
  • canvas = tk.Canvas(root,bg='white') canvas.pack(fill=tk.BOTH, expand=1) bt=ttk.Button(frame, width=20,text='0到9出现次数') bt.bind("<Button-1>",tp) bt.grid(row=0, column=0, padx=1, pady=1, sticky=tk.E...
  • 在python tkinter Canvas中画图和显示图像,可以将所画图形和显示图像保存为postscript类型文件,这不是通用的文件格式。本文介绍将其保存为通用格式文件的5种方法。
  • tkinter-canvas详解

    2020-07-08 09:28:58
    在前文tkinter-place详解中,讲解anchor属性时,用到了canvas。如果你不知道什么时canvas,精读本文就对了! canvas的中文意思就是"画布"。在GUI中,canvas是一个非常基础的概念,基本上任何跟GUI相关的编程语言、库...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,199
精华内容 2,079
关键字:

canvastkinter