如何让Tkinter在没有滚动条的情况下显示非常大的图像?

如何让Tkinter在没有滚动条的情况下显示非常大的图像?,tkinter,tkinter-canvas,Tkinter,Tkinter Canvas,我试图让Tkinter从url显示一个非常大的图像,但该图像没有完全显示在窗口中。我希望能够看到整个图像而不必滚动。我试过调整大小之类的,但似乎没有多大效果。任何帮助都将不胜感激。 img链接: 我的代码: from tkinter import * import io import urllib.request from PIL import ImageTk, Image canvas = Tk() page = urllib.request.urlopen("https://web2.hi

我试图让Tkinter从url显示一个非常大的图像,但该图像没有完全显示在窗口中。我希望能够看到整个图像而不必滚动。我试过调整大小之类的,但似乎没有多大效果。任何帮助都将不胜感激。 img链接:

我的代码:

from tkinter import *
import io
import urllib.request
from PIL import ImageTk, Image

canvas = Tk()
page = urllib.request.urlopen("https://web2.hirez.com/smite-media//wp-content/uploads/2017/07/Fafnir.jpg")
background = Image.open(io.BytesIO(page.read()))
tkimage = ImageTk.PhotoImage(background)
panel1 = Label(canvas, image=tkimage)
panel1.grid(ipadx=0, ipady=0, sticky=E)
mainloop()

背景=背景。调整大小((w,h),图像。反别名)

背景=背景。调整大小((w,h),图像。反别名)

使用
size
属性和
resize(w,h)
方法执行所需操作。以下是一个将图像大小减半的示例:

from tkinter import *
import io
import urllib.request
from PIL import ImageTk, Image


canvas = Tk()
page = urllib.request.urlopen("https://web2.hirez.com/smite-media//wp-content/uploads/2017/07/Fafnir.jpg")
background = Image.open(io.BytesIO(page.read()))
width, height = background.size
background = background.resize((width // 2, height // 2))
tkimage = ImageTk.PhotoImage(background)
panel1 = Label(canvas, image=tkimage)
panel1.grid(ipadx=0, ipady=0, sticky=E)
mainloop()
注意:不要使用
width/2
,而是使用
width//2
——否则,如果除法结果为浮点,则会导致类型错误


注1:如果输出图像的质量比速度更重要,请使用
背景。调整大小((宽度//2,高度//2),图像。反别名)

使用
大小
属性和
调整大小(w,h)
方法执行所需操作。以下是一个将图像大小减半的示例:

from tkinter import *
import io
import urllib.request
from PIL import ImageTk, Image


canvas = Tk()
page = urllib.request.urlopen("https://web2.hirez.com/smite-media//wp-content/uploads/2017/07/Fafnir.jpg")
background = Image.open(io.BytesIO(page.read()))
width, height = background.size
background = background.resize((width // 2, height // 2))
tkimage = ImageTk.PhotoImage(background)
panel1 = Label(canvas, image=tkimage)
panel1.grid(ipadx=0, ipady=0, sticky=E)
mainloop()
注意:不要使用
width/2
,而是使用
width//2
——否则,如果除法结果为浮点,则会导致类型错误


注1:如果输出图像的质量比速度更重要,请使用
background.resize((宽度//2,高度//2),image.ANTIALIAS)

是否尝试过
background=background.resize(宽,高)
其中w和h是所需的宽度和高度?@acw1668如果我尝试使用background=background.resize(19201080)将大小调整为1920x1080,我会得到以下错误:“ValueError:未知重采样过滤器(1080)。使用Image.NEAREST(0)、Image.LANCZOS(1)、Image.BILINEAR(2)、Image.BICUBIC(3)、Image.BOX(4)或Image.HAMMING(5)”应
调整大小((w,h))
@acw1668谢谢,它现在正在工作。我正在使用Image.antialas作为paramter@acw1668我认为op应该将原始图像分开。使用
background=background.resize(w,h)
如果用户多次调整大小,图像将降级。您是否尝试过
background=background.resize(w,h)
其中w和h是所需的宽度和高度?@acw1668如果我尝试使用background=background.resize(19201080)将大小调整为1920x1080,我会得到以下错误:“ValueError:未知重采样过滤器(1080)。使用Image.NEAREST(0)、Image.LANCZOS(1)、Image.BILINEAR(2)、Image.BICUBIC(3)、Image.BOX(4)或Image.HAMMING(5)”应
调整大小((w,h))
@acw1668谢谢,它现在正在工作。我正在使用Image.antialas作为paramter@acw1668我认为op应该将原始图像分开。使用
background=background.resize(w,h)
如果用户多次调整大小,图像将降级。