tkinter最大画布尺寸?

时间:2017-03-16 09:30:31

标签: python canvas tkinter

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

我已经在Tkinter写了一个简单的简单的iTunes替代品。

由于我喜欢专辑封面视图,因此专辑需要至少200x200像素大小,并且我有很多专辑(~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()

1 个答案:

答案 0 :(得分:2)

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

这意味着画布能够一直滚动到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_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)