2017-03-16 254 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)