【问题标题】:Python Tkinter:Frames are not going under each otheerPython Tkinter:框架不会相互向下
【发布时间】:2021-11-07 12:19:58
【问题描述】:

我正在制作一个简单的 tkinter GUI,其中包含滚动框架,但它对我来说并不是那么完美。起初我只使用了一个框架,但我发现框架对数量有限制。他们可以容纳的小部件,所以我开始使用多个框架。但是我遇到了这个问题:框架没有按照我想要的方向移动。我希望框架在前一个框架之下,但是框架在另一个之上,这是相同的屏幕截图:

(第0帧是第一帧)

这是代码(我只保留了重要的部分)

i=0
image_no=0
for video in videos:
    
    u = urllib.request.urlopen(video["thumbnail"]["thumbnails"][0]["url"])
    raw_data = u.read()
    u.close()

    im = Image.open(BytesIO(raw_data))
    image = ImageTk.PhotoImage(im.resize((470,210)))
    a.append(image)

    tk.Label(fr[i], image=a[image_no]).pack()
    image_no+=1
    tk.Label(fr[i], text=("Video:"+str(image_no)+" frame:"+str(i)),wraplength=470,font=("ariel",11,"bold"),bg="white").pack()
    tk.Label(fr[i], text=video["title"]["accessibility"]["accessibilityData"]['label'].replace(video["title"]["runs"][0]["text"],""),wraplength=470,font=("ariel",10),bg="white",fg="grey").pack(anchor="w")
    canvas.configure(yscrollcommand=scroll_y.set)

    canvas.configure(scrollregion=canvas.bbox("all"))
    print(image_no)
    print(video["title"]["runs"][0]["text"])
    if image_no%10==0:
        time.sleep(3)
    if image_no%110==0:
        i+=1
    if image_no%440==0:
        break

有什么办法可以让它往下走吗?

编辑:

这是帧数限制的截图

黑色区域是画布

【问题讨论】:

  • AFAIK, pack 根据职位的可用性从上到下放置。还有你是怎么做相框的。如果您使用append 将它们添加到fr,那么最后附加的项目将是列表中的最后一个。大胆猜测:试试fr[::-1][i] 而不是fr[i]
  • ok 将尝试这样做
  • 没用 :(
  • “我发现框架对它们可以容纳的小部件数量有限制” - 你是如何得出这个结论的?如果有限制,那就是数万或更多。
  • 这不是对框架中小部件数量的限制,而是对画布可以显示的对象大小(以像素数衡量)的限制。画布没有无限大小。

标签: python tkinter tkinter-canvas


【解决方案1】:

这里是问题tkinter maximum canvas size?的链接

我已经修改了代码,因为图像的数量可能是原因,或者画布可能有一些最大高度。

现在这将用图像填充整个画布高度,每个图像之间有 10 磅的空间。

我已经为 python 3.x 更新了它并将高度增加到 100000!

工作没有问题。

选择您自己的图片(gif 或 png)

import tkinter as tk
from tkinter import filedialog as fido

root = tk.Tk()
root.rowconfigure(0, weight = 1)
root.columnconfigure(0, weight = 1)

picture = fido.askopenfilename(title = "Pick a pic")

iconimage = tk.PhotoImage(file = picture)
wide, high = iconimage.width(), iconimage.height()

frame = tk.LabelFrame(root, labelanchor = "s", text = "0|0")
frame.grid(row = 0, column = 0, sticky = "nsew")
frame.rowconfigure(0, weight = 1)
frame.columnconfigure(0, weight = 1)

cv = tk.Canvas(
    frame, width = 1200, height = 700,
    scrollregion = "0 0 2000 100000")
cv.grid(row = 0, column = 0, sticky = "nsew")

vscrollbar = tk.Scrollbar(
    frame, orient = "vertical", command = cv.yview)
vscrollbar.grid(row = 0, column = 1, sticky = "ns")
cv.config(yscrollcommand = vscrollbar.set)

def rowcol(ev):
    frame["text"] = f"{cv.canvasx(ev.x)} | {cv.canvasy(ev.y)}"

cv.bind("<Motion>", rowcol)
root.update()

testimage = []
for pos in range( 0, 100000 - high - 10, high + 10):
     testimage.append(cv.create_image(100, pos, anchor = "nw", image = iconimage))

print(f"Number of images = {len(testimage)}, width = {wide}, height = {high}")

root.mainloop()

所以它似乎不是Canvas 高度或显示图像数量的限制。

【讨论】:

  • 它工作正常,但是图像和滚动条的黑白空间很大
  • 如何在不影响图像的情况下删除它,因为当我尝试更改宽度和高度时,图像仅部分显示
  • 您可以通过将cv.create_image(100,更改为适当的值来修改图像的x位置。画布宽度设置为 1200 x 700,因此可以更改以适合,也可以修改 scrollregion 以适合最大图像宽度。
  • 好一个@Code2D,编码愉快。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-20
  • 2018-06-28
  • 1970-01-01
  • 1970-01-01
  • 2023-01-21
  • 2021-09-18
相关资源
最近更新 更多