【问题标题】:Unable to draw to canvas in Tkinter after() loop无法在 Tkinter after() 循环中绘制到画布
【发布时间】:2018-08-31 07:42:34
【问题描述】:

我遇到了一个问题,当我尝试在画布上创建图像时,我无法生成图像。然而,在我的 after() 循环启动之前,我能够创建和配置我的图像。此外,我可以在after() 循环中使用canvas.delete() 从画布中删除对象,因此我仍然可以进行一定程度的控制。

我在 windows 8.1 上,使用 Python 3.5.4

import tkinter as tk
from PIL import Image, ImageTk
from math import floor
import numpy as np
from scipy import ndimage

root = tk.Tk()
HEIGHT = 600
WIDTH = 600
CANVAS_MID_X = WIDTH / 2
CANVAS_MID_Y = HEIGHT / 2

def my_mainloop():
    #THIS WORKS!!! REMOVES THE DIAL CREATED BEFORE THE MAINLOOP
    canvas.delete(dial_1)

    #THIS WORKS BELOW BEFORE MAINLOOP, BUT NOT IT WONT WORK! (use opencv?)
    img = dial_1_img_resized
    img2 = img.rotate(45, expand=True)
    dial_1_photo_new = ImageTk.PhotoImage(img2)
    dial_2 = canvas.create_image((dial_1_center), image=dial_1_photo_new, anchor=tk.E)
    '''CANT DRAW TO CANVAS IN AFTER LOOP'''
    print("loop!")
    root.after(4000,my_mainloop)

'''-------------------Create Canvas, and starting dials in their starting positions---------------------'''

canvas = tk.Canvas(root, width=HEIGHT, height=WIDTH, bg="black")
canvas.grid(row=0, column=0)
dial_1_path = "gauge1.png"
dial_1_width = 400

dial_1_img = Image.open(dial_1_path, 'r') #open image
dial_1_img_ratio = int(dial_1_img.size[1]) / int(dial_1_img.size[0])
dial_1_img_resized = dial_1_img.resize((dial_1_width, floor(dial_1_img_ratio * dial_1_width)), 1)
dial_1_photo = ImageTk.PhotoImage(dial_1_img_resized)
dial_1_center = (CANVAS_MID_X, CANVAS_MID_Y)

#CREATE DIAL ON CANVAS, THIS WORKS!!
dial_1 = canvas.create_image((dial_1_center), image=dial_1_photo)



'''Start Main Loop'''
root.after(0, my_mainloop)
root.mainloop()

因此我的问题是:有没有办法在after() 循环中操作和创建画布图像? (称为my_mainloop)任何帮助表示赞赏!

【问题讨论】:

标签: python python-3.x user-interface canvas tkinter-canvas


【解决方案1】:

您需要保存对您的照片的引用,因为它在 my_mainloop 运行后被垃圾收集。例如,您可以将其添加到您的 canvas 对象中:

canvas.dial_1_photo_new = ImageTk.PhotoImage(img2)
dial_2 = canvas.create_image((dial_1_center), image=canvas.dial_1_photo_new, anchor=tk.E)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    相关资源
    最近更新 更多