使用Python Tkinter中Canvas的一些问题

报错:

AttributeError:type object ‘Image‘ has no attribute 'fromarray'

AttributeError:'PhotoImage' has no attribute '_PhotoImage__photo'

导入模块的时候需要注意:
不同的两个module中可能存在相同的type,比如PIL和tkinter中都存在Image,这时候就要注意区分。

from PIL import Image,ImageTk
from tkinter import *

↑这样写就会报错

解决:

from PIL import Image, ImageTk # 导入图像处理函数库
import tkinter           # 导入GUI界面函数库

修改代码把tkinter的前缀们加上就跑的通了。此时程序就知道我们要调用的是PIL里的Image,而不是tkinter里的。

问题:

tkinter中在canvas上图片不显示

image = Image.open(filename)
im = ImageTk.PhotoImage(image)
canvas.create_image((33, 33), image=im)

↑这个代码是对的 但运行之后不显示图片。

解决:

把canvas.create_image(width,height,image = im)中的第三个参数image声明为全局变量。

# 使用之前先声明
image = None
im = None

#使用时声明全局变量
global image
global im
image = Image.open(filename)
im = ImageTk.PhotoImage(image)
canvas.create_image((33, 33), image=im)

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 使用TkinterCanvas自适应可以通过绑定Canvas的尺寸调整事件来实现。当Canvas的尺寸发生变化时,可以通过事件处理函数重新计算绘制的内容,以适应新的尺寸。 下面是一个简单的示例代码,演示如何实现自适应的Canvas: ``` python import tkinter as tk class App: def __init__(self): self.root = tk.Tk() self.canvas = tk.Canvas(self.root) self.canvas.pack(fill=tk.BOTH, expand=True) self.canvas.bind("<Configure>", self.on_canvas_resize) self.draw() def draw(self): self.canvas.delete("all") # 在Canvas上绘制图形 def on_canvas_resize(self, event): self.draw() app = App() app.root.mainloop() ``` 在上面的代码,我们创建了一个Canvas,并将其添加到窗口。我们还将Canvas绑定到了“<Configure>”事件,这个事件会在Canvas的尺寸发生变化时触发。我们定义了一个事件处理函数on_canvas_resize,当Canvas尺寸变化时,它会被调用。在事件处理函数,我们调用draw()方法重新绘制Canvas上的内容。 注意,在draw()方法,我们使用self.canvas.delete("all")来清空Canvas上的所有内容,然后重新绘制新的图形。这是因为Canvas上的内容不会自动清空,如果不手动清空的话,Canvas上的内容会重叠在一起。 通过这种方式,我们可以让Canvas自适应窗口大小,以便图形始终填充整个窗口。 ### 回答2: 使用TkinterCanvas来实现自适应,可以通过以下步骤来实现: 1. 创建一个Tkinter窗口并初始化Canvas,设置Canvas的宽度和高度为窗口的宽度和高度。 ```python import tkinter as tk root = tk.Tk() canvas_width = root.winfo_screenwidth() canvas_height = root.winfo_screenheight() canvas = tk.Canvas(root, width=canvas_width, height=canvas_height) canvas.pack() ``` 2. 绑定一个函数来处理窗口大小的变化事件,当窗口大小改变时,重新设置Canvas的宽度和高度。 ```python def resize_canvas(event): canvas.config(width=event.width, height=event.height) root.bind("<Configure>", resize_canvas) ``` 3. 创建并添加图形对象到Canvas,这里以创建一个矩形为例。 ```python rectangle = canvas.create_rectangle(100, 100, 200, 200, fill='red') ``` 4. 当需要自适应时,可以调用Canvas的scale方法来调整图形对象的大小。例如,将矩形的宽度和高度缩放到Canvas的50%。 ```python canvas_width = canvas.winfo_width() canvas_height = canvas.winfo_height() new_width = canvas_width * 0.5 new_height = canvas_height * 0.5 canvas.scale(rectangle, 0, 0, new_width / (200 - 100), new_height / (200 - 100)) ``` 这样就可以根据窗口的大小自动调整Canvas和其的图形对象的大小了。希望对你有帮助! ### 回答3: 在使用Pythontkintercanvas组件实现自适应大小的功能,我们可以采取以下几个步骤: 首先,我们需要创建一个canvas对象,并设置其相关参数,例如宽度和高度等。 接下来,通过监听canvas的大小变化事件,我们可以获取canvas的新宽度和高度。 然后,我们可以在canvas的大小变化事件调用一个函数,用来重新调整canvas内部元素的位置和大小。可以根据需求使用canvas对象的方法(例如itemconfigure)来调整元素的大小和位置。 为了实现自适应,我们可以将canvas的宽度和高度与内部元素的位置和大小进行比例调整。例如,可以根据新的宽度和高度,计算并更新元素的位置和大小。 最后,我们需要确保在canvas大小变化后重新调用上述函数,以便使内部元素保持自适应。 总结起来,我们可以通过监听canvas的大小变化事件,并在这个事件重新计算和调整canvas内部元素的位置和大小,从而实现canvas的自适应。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值