【问题标题】:How would I place an image inside of this code so it can scroll?我将如何在此代码中放置图像以便它可以滚动?
【发布时间】:2021-05-29 21:43:49
【问题描述】:

如何在此代码中放置图像以便它可以滚动?

此代码来自此处的答案:tkinter: using scrollbars on a canvas

from tkinter import *
root=Tk()
frame=Frame(root,width=300,height=300)
frame.pack(expand=True, fill=BOTH) #.grid(row=0,column=0)
canvas=Canvas(frame,bg='#FFFFFF',width=300,height=300,scrollregion=(0,0,500,500))
hbar=Scrollbar(frame,orient=HORIZONTAL)
hbar.pack(side=BOTTOM,fill=X)
hbar.config(command=canvas.xview)
vbar=Scrollbar(frame,orient=VERTICAL)
vbar.pack(side=RIGHT,fill=Y)
vbar.config(command=canvas.yview)
canvas.config(width=300,height=300)
canvas.config(xscrollcommand=hbar.set, yscrollcommand=vbar.set)
canvas.pack(side=LEFT,expand=True,fill=BOTH)

root.mainloop()

我尝试了画布上的图像,画布内另一个框架内的图像,以及现有框架内的图像,我在嵌套框架内和现有画布上放置了一个标签。滚动条不适用于大于 300x300 的图像,但滚动条会随着仅文本的标签移动,但标签不会移动。我使用了L_text.place(x=20,y=90)L_text.pack(),结果相同。

如果不修改答案中的代码,只有当鼠标指针悬停在垂直滚动条上时,我才会移动滚动条,而鼠标滚轮会移动它们,但画布/框架区域上的鼠标不会移动滚动条。

Ubuntu 20.04 python 3.8.5

【问题讨论】:

  • 您可以将图像直接添加到画布上,它会滚动。我建议你尝试一下,如果你不能让它工作,你可以向我们展示你尝试过的代码,我们可以帮助修复它。
  • 优秀。我使用了canvas.create_image,它奏效了。我现在必须调整垂直滚动条的运动。但是,鼠标滚轮会滚动它,但在将鼠标悬停在图像上时仍然不会。我会用代码发布一个“答案”。谢谢!

标签: python image tkinter canvas scrollbar


【解决方案1】:

从上述示例修改的发布代码已针对我的应用程序进行了改进。 我需要再调整一些,但这至少是帖子标题中问题的解决方案。

import tkinter as tk
from tkinter import *
import PIL
from PIL import Image, ImageTk

root=Tk()
root.geometry("550x850+50+50")

frame=Frame(root,width=300,height=300)
frame.pack(expand=True,fill=BOTH) 
canvas=Canvas(frame,width=300,height=300,scrollregion=(0,0,500,1200))# 1200 is
# vertical scrollable area inside the window
hbar=Scrollbar(frame,orient=HORIZONTAL)
hbar.pack(side=BOTTOM,fill=X)
hbar.config(command=canvas.xview)
vbar=Scrollbar(frame,orient=VERTICAL)
vbar.pack(side=RIGHT,fill=Y)
vbar.config(command=canvas.yview)
canvas.config(width=300,height=300)
canvas.config(xscrollcommand=hbar.set,yscrollcommand=vbar.set)
canvas.pack(side=LEFT,expand=True,fill=BOTH)

#frame_2=Frame(canvas,width=900,height=900)
#frame_2.pack() # place(x=1,y=1)
file='test_receipt.png'
img=ImageTk.PhotoImage(Image.open(file))
canvas.create_image(1,1,image=img,anchor=NW) #Place image directly on canvas
# 1,1 is upper left corner no padding, anchor required or image isn't alinged
# on its upper left corner.
#L_image=Label(canvas,image=img)
#L_image.pack() # place(x=1,y=1)
#L_text=Label(frame_2,text='label inside')
#L_text.pack()
#L_text.place(x=20,y=90)

root.mainloop()

【讨论】:

    猜你喜欢
    • 2021-07-25
    • 2019-05-17
    • 1970-01-01
    • 2021-09-09
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-31
    相关资源
    最近更新 更多