2017-03-16 246 views
1

看来我正在触及某种预设的最大可滚动画布大小,我并不知道...tkinter最大画布尺寸?

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

由于我喜欢的专辑封面视图,专辑至少需要200×200像素的尺寸,并且我的相册(〜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

确实,Tkinter有一些技术上的限制。也就是说,如何让[巨型列表中的一页中的所有内容](https://www.youtube.com/watch?v=9BnLbv6QYcA)有用? – TigerhawkT3

+0

我对视频大笑......但认真的是,我只是复制了任何类似iTunes的程序在封面视图中所做的事情。在200x200px的时候,我的屏幕一次显示〜12x7 = 84个专辑,所以我只需滚动20个屏幕即可看到它们 - 这几乎不是'巨人' – alessandro

+0

再次,Tkinter有一些技术限制。它不会像本地应用程序那样执行。有多个网页有什么问题,就像大多数网站对搜索结果所做的一样?再次,您可能会考虑一个更有用的界面,其中可能包括搜索,排序和筛选。 – TigerhawkT3

回答

1

我修改您的代码,以显示在特定的像素高度的位置,例如图像一个在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_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)