【发布时间】: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)任何帮助表示赞赏!
【问题讨论】:
-
不清楚您期望发生的事情没有发生。尝试将代码简化为基本要素。见stackoverflow.com/help/mcve
-
您的图像可能正在被垃圾收集。这篇文章可能有用stackoverflow.com/questions/16424091/…
-
我试图简化我的代码,感谢busybear,我会仔细阅读它
标签: python python-3.x user-interface canvas tkinter-canvas