Python tkinter最大画布大小?

Python tkinter最大画布大小?,python,canvas,tkinter,Python,Canvas,Tkinter,似乎我达到了某种预设的最大可滚动画布大小,我不知道 我在Tkinter中编写了一个简单的iTunes替换版本 因为我喜欢相册封面视图,一张相册至少需要200x200px大小,而且我有很多相册(~1600),因此我需要很多空间 但我发现,在35000px的高度以上,窗户无法显示它们 这里我编写了一个示例代码——它需要ImageMagick的转换,大约15秒才能在我的机器上运行。 您可以看到窗口仅显示170个正方形中的163个 from Tkinter import * import subpro

似乎我达到了某种预设的最大可滚动画布大小,我不知道

我在Tkinter中编写了一个简单的iTunes替换版本

因为我喜欢相册封面视图,一张相册至少需要200x200px大小,而且我有很多相册(~1600),因此我需要很多空间

但我发现,在35000px的高度以上,窗户无法显示它们

这里我编写了一个示例代码——它需要ImageMagick的转换,大约15秒才能在我的机器上运行。 您可以看到窗口仅显示170个正方形中的163个

from Tkinter import *

import subprocess

def main():

    root = Tk()
    root.geometry("%dx%d+0+0" % (1800,1000))
    cv = Canvas(root)
    vscrollbar = Scrollbar(root, orient=VERTICAL)
    vscrollbar.pack(fill=Y, side=RIGHT)
    vscrollbar.config(command=cv.yview)
    cv.config(yscrollcommand=vscrollbar.set)
    cv.configure(scrollregion=(0,0, 4000, 50000))      
    cv.pack(side=LEFT, fill=BOTH, expand=TRUE)    
    fcv=Frame(root)
    cv.create_window(0, 0, anchor = "nw", window=fcv)    


    memimages=[]    
    for row_index in range(170):
        a=subprocess.Popen("convert -size 200x200 -pointsize 22  -gravity center label:%d test.gif" % row_index, shell=True,
                           stdout=subprocess.PIPE,stderr=subprocess.PIPE) 
        output, errors = a.communicate()
        iconimage = PhotoImage(file="test.gif")
        b=Button(fcv,image=iconimage)
        memimages.append(iconimage)             
        b.grid(row=row_index, column=0, sticky=N+S+E+W)  

    mainloop()

main()

我修改了您的代码以显示特定像素高度位置的图像,例如,一个在y=0,一个在y=32000,一个在y=50000。画布可以从0一直移动到50000像素的高度,我们可以看到预期的图像

这意味着画布可以一直滚动到y=50000像素,问题不在于画布的像素高度限制,但我猜可能是按钮放置在画布窗口框架中的方式,或者画布窗口中框架的放置方式,或者画布窗口本身放置在画布中的方式帆布

您可以运行这个修改后的代码来了解我的意思。一直滚动到底部。希望这能让您更深入地了解代码的疑难解答

from Tkinter import *

def main():

    root = Tk()
    root.geometry("%dx%d+0+0" % (1800,1000))
    cv = Canvas(root)
    vscrollbar = Scrollbar(root, orient=VERTICAL)
    vscrollbar.pack(fill=Y, side=RIGHT)
    vscrollbar.config(command=cv.yview)
    cv.configure(yscrollcommand=vscrollbar.set)
    cv.configure(scrollregion=(0,0, 4000, 50000))      
    cv.pack(side=LEFT, fill=BOTH, expand=TRUE)
    iconimage = PhotoImage(file="monkey.gif")
    testimage = cv.create_image(300, 0, image=iconimage)
    testimage1 = cv.create_image(300, 32000, image=iconimage)
    testimage2 = cv.create_image(300, 50000, image=iconimage)
    mainloop()

main()
更新:进一步测试后,似乎对由
Canvas.create\u window()
方法形成的窗口的显示高度有限制。我添加了下面的代码,就在
mainloop()
之前,它试图创建具有100x100像素图像的按钮和标签。可显示的最大按钮行数为316+,而可显示的最大标签行数为322+。如果按钮和标签一起创建,则可以显示的最大行数为316+。我的结论似乎与你的一致

很抱歉未能回答您的问题。然而,我希望用我的答案来支持你,并推荐一位更有知识的人来解释这种行为的原因

fcv=Frame(cv)
cv.create_window(0, 0, anchor = "nw", window=fcv)    
iconimage = PhotoImage(file="monkey100.gif") # Image dimension is 100x100 pixels
for row_index in range(340):
    b=Button(fcv,image=iconimage)
    b.grid(row=row_index, column=0, sticky=N+S+E+W)
    lb=Label(fcv,text=str(row_index), image=iconimage, compound=LEFT)
    lb.grid(row=row_index, column=1, sticky=N+S+E+W)

Tkinter确实有一些技术限制。也就是说,它有多有用?我在视频中笑了。。。但说真的,我只是在复制任何类似itunes的程序在封面视图中的功能。在200x200px时,我的屏幕一次显示约12x7=84张专辑,因此我只需滚动20个屏幕就可以全部看到它们——这也算不上是“巨人”,Tkinter有一些技术限制。它不会像本机应用程序那样执行。和大多数网站搜索结果一样,有多个页面有什么不对?同样,您可能会考虑一个更有用的接口,它可能包括搜索、排序和过滤。当然,SHICH/SORT/FULL是在待办事项列表中。无论如何,这正是我这么做的原因:我个人不喜欢其他选择。无论如何,我们偏离了这个问题:我们真的确定这是一个Tkinter限制吗?它真的是硬编码的吗?我不知道,但这不是我第一次看到Tkinter像这样挣扎。