2016-03-21 54 views
-1

我希望整個事情擴大,因爲用戶擴大它,沒有小部件,如列表框,重塑。我希望它能像擴展保持寬高比的靜止圖像一樣。我該怎麼做呢?如何正確展開我的tkinter窗口?

from tkinter import * 
import random 
from random import * 
import threading 

selected = 0 

contained = {} 
contained[0] = [] 

name = {} 

maxEventItems = 100 

i = 0 
while i < 10 ** 3: 
    contained[0].append(i) 
    name[i] = 'Event {}'.format(i) 

    i += 1 

# Beginning of thread part, in the future. 
def eventViewerListboxItems(): 
    i = 0 
    while i < len(contained[selected]): 
     eventNumber = contained[selected][i] 

     eventViewerListbox.insert(END,'{}'.format(name[eventNumber])) 

     i += 1 

master = Tk() 

masterCanvas = Canvas(master) 
masterCanvas.grid(row = 0,column = 0,sticky = N + S + E + W) 

masterFrame = Frame(masterCanvas) 
masterFrame.grid(row = 0,column = 0) 

main = Frame(masterFrame) 
main.grid(row = 0,column = 0) 

topButtons = Frame(main) 
topButtons.grid(row = 0, column = 0) 

saveButton = Button(topButtons,text = 'Save') 
saveButton.grid(row = 0,column = 0,sticky = W) 

loadButton = Button(topButtons,text = 'Load') 
loadButton.grid(row = 0,column = 1,sticky = W) 

createEventButton = Button(topButtons,text = 'Create event') 
createEventButton.grid(row = 0,column = 2,sticky = W) 

eventViewer = Frame(main) 
eventViewer.grid(row = 1, column = 0) 

eventViewerListboxScrollbar = Scrollbar(eventViewer) 
eventViewerListboxScrollbar.grid(row = 1,column = 1, sticky = W + N + S) 

eventViewerListbox = Listbox(eventViewer) 
eventViewerListbox.grid(row = 1,column = 0,sticky = W) 

eventViewerListbox.config(yscrollcommand = eventViewerListboxScrollbar.set) 
eventViewerListboxScrollbar.config(command = eventViewerListbox.yview) 

bottomButtons = Frame(main) 
bottomButtons.grid(row = 2, column = 0,sticky = E) 

simulateButton = Button(bottomButtons,text = 'Simulate') 
simulateButton.grid(row = 0,column = 0,sticky = E) 

callEventViewerListboxItems = threading.Thread(target = eventViewerListboxItems) 
callEventViewerListboxItems.start() 

partial_contained = {} 
partial_contained[selected] = [] 
i = 0 
while i < maxEventItems and i < len(contained[selected]): 
    partial_contained[selected].append(contained[selected][i]) 
    i += 1 

print('I started putting the items from contained[{}] into the listbox in the event viewer.'.format(contained[selected][0])) 
print() 

print('Below, I will show the first {} items that are in contained:'.format(i,contained[selected])) 
print(partial_contained[selected]) 
print() 

master.mainloop() 
+0

我不明白這句話:「沒有小工具,像列表框一樣,重塑」。你想要擴展什麼?列表框?除列表框之外的所有東西? –

+0

所有內容,但是當列表框展開時,請注意略微改變形狀。它不像靜止圖像。 –

回答

0

問題是您正在使用網格,但您沒有給予任何行或列的權重。權重決定了哪些行和列會被賦予額外的空間,例如用戶調整窗口大小時。默認情況下,每行和每列的權重爲零,這意味着它們沒有額外的權重。根據經驗法則,您需要至少爲一行和一列調用grid_rowconfiguregrid_columnconfigure,併爲該行或列指定正的權重。您需要爲使用網格來管理子項的每個小部件執行此操作。

您也沒有一致地使用sticky屬性,所以即使您獲得列的增長和縮小,您的小部件也不會擴展以填充它們提供的區域。

您需要有條不紊地創建複雜的佈局。我的建議是重新開始,只是讓masterCanvas像你期望的那樣增長和縮小。給它一個大膽的,有特色的封面,以便你可以看到它(例如:如果它具有與背景相同的顏色,不可能知道它是否在增長或縮小以填充該區域)

一旦得到masterCanvas它在哪裏不斷增長和收縮,移動到masterFrame,然後main,然後eventViewer,最後是列表框。在每一步中,一定要給小部件一個獨特的顏色,以便您可以將其可視化。

您可能還想考慮去除如此多的嵌套幀。你擁有的越多,讓他們一起工作就越困難。但是,如果採取有條不紊的方法,多個領域都很容易,並且不要試圖讓六種不同的框架一起工作。得到一個工作,然後專注於其直接的孩子。當他們工作時,專注於他們的孩子,等等。