canvas画布不显示

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了canvas画布不显示相关的知识,希望对你有一定的参考价值。

参考技术A 微信小程序转支付宝小程序发现微信的画布在支付宝不显示,排查问题所在:参考

https://opensupport.alipay.com/support/helpcenter/144/201602630404?ant_source=opendoc_recommend

canvas画布不显示

(1)创建画布的方法my.createCanvasContext('canvasid')没有放到onReady方法中。

(2)createCanvasContext方法中的id与amxl文件中的canvas的id不一致。

经排查,除掉上述后发现自己的画布是一开始隐藏 点击事件后显示,顾进入页面后直接显示但定位到屏幕外,触发事件后定位到屏幕中间即可。

在 tkinter 画布中显示图像

【中文标题】在 tkinter 画布中显示图像【英文标题】:Display images in tkinter canvas 【发布时间】:2019-06-26 21:23:10 【问题描述】:

我在尝试创建画布图像时遇到了一些问题,一个类处理图像的创建,我希望该类创建与我调用它的时间一样多的图像。

我的代码是这样的

from tkinter import *
from random import *

canvas_width = 800
canvas_height = 800

master = Tk()
canvas = Canvas(master, width=canvas_width, height=canvas_height, bg="black")
canvas.pack()

def images():
    for _ in range(3):
        Image_creator().create_image()

class Image_creator:

    def create_image(self):

        start_x = randint(1, canvas_width//2)
        start_y = randint(1, canvas_height//2)

        img = PhotoImage(file="pac_inizio.png")
        master.img = img
        self.image = canvas.create_image(start_x, start_y, anchor=NW, image=img)

images()

mainloop()

实际上,这段代码只显示了 3 个图像中的 1 个,我认为其他 2 个画布图像已创建但内部没有图像。 我尝试将 create_image 函数更改为创建按钮而不是画布图像,并了解它是否真的像我想的那样。 如果你使用修改后的函数运行代码,它会显示 3 个按钮,但只有一个按钮带有图像。

def create_image(self):

    start_x = randint(1, canvas_width//2)
    start_y = randint(1, canvas_height//2)

    img = PhotoImage(file="pac_inizio.png")
    master.img = img
    self.image = Button( anchor=NW, image=img)
    self.image.place(x=start_x, y=start_y)

我认为问题出在图片参考中,但不知道如何解决

【问题讨论】:

我认为问题在于master.img = img 您在任何时候都只能引用一个图像; otehrs 是垃圾收集的。尝试制作master.img 列表或类似的东西。 (另外,为create_image 方法创建一个类似乎毫无意义。) 阅读Why does Tkinter image not show up if created in a function? 【参考方案1】:

您似乎知道tkinter 中的图像被垃圾收集的常见问题,尽管它们仍在某处被使用,除非明确引用该图像。但是请注意,使用master.img = img,您将始终只能引用三个(相同)图像中的一个。如果这些图像在您的实际代码中有所不同,请将master.img 设为一个列表(或使用全局分数中的任何其他列表来存储图像)。

但是,由于图像是相同的,您也可以直接在全局范围内加载一次图像,而不是在方法中,然后使用该图像。此外,仅针对该一种方法使用该类并没有多大意义(更重要的是,该实例也在循环中被垃圾收集)。

img = PhotoImage(file="pac_inizio.gif") # create once in global score
def create_image():                     # regular function, not method
    start_x = randint(1, canvas_width//2)
    start_y = randint(1, canvas_height//2)
    canvas.create_image(start_x, start_y, anchor=NW, image=img)

【讨论】:

我认为这里的实际问题不是你在第一段中描述的。他们正确地保存了类中的所有三个图像,但没有保存Image_creator 类的实例。由于该实例被垃圾收集,因此其中的图像也被垃圾收集。 @BryanOakley 怎么样?请注意,OP 是 master.img = img,而不是 self.img = img,而 self.image = canvas.create_image(...) 只会保护画布上图像对象的 ID,而不是实际的 PhotoImage,对吧? 哦,哇,我没听懂。 master.img = ... 不好。我注意到的部分是:Image_creator().create_image() - OP 正在为每个图像创建一个 Image_creator 的新实例,但不保存这些实例。我猜代码有两个问题,不是一个。 @BryanOakley 是的,我也试图指出这一点,但实际上我认为这不是什么大问题。该实例似乎根本不需要,因此您可以将其设为常规函数。当然,指出这些事情是好的,因为它们可能暗示对事情如何工作或必须完成的一些误解。

以上是关于canvas画布不显示的主要内容,如果未能解决你的问题,请参考以下文章

wpf 添加了viewbox之后,画布里面的内容就不显示了,怎么解决,我需要画布的内容随着窗口一起放大

Android UICanvas 画布 ⑦ ( Canvas 绘制显示区域 | Canvas 绘制矩形源码分析 )

Java 画布不可见

canvas画布

canvas绘制线条怎么改变线条长度

UserControl 模板不显示画布的子项