2014-03-30 51 views
0

我是新來的Tkinter而在此之前已經開發了只有一個GUI的量後崩潰。我決定創建一個隨機地形生成器,使用標籤來表示一個10×10的網格塊。我已經完成了它並通過製作大量標籤來修復內存泄漏。我還實現了一個隨機按鈕和滾動。然而,在大約100次(大約98次最後一次檢查)網格更新之後,它會出現一個灰色邊框出現在窗口之外,並且世界的頂部將顯示爲灰色,然後程序將停止響應。沒有錯誤信息,所以我不知道如何解決這個問題。代碼位於:pastebin:http://pastebin.com/SASFuQCZ,雖然它很長。任何幫助解決這個將不勝感激。謝謝。的Tkinter程序使用

+2

我想你贏得最重複的獎品。你可以將這1800條線路敲下來,只需幾百個循環即可。這會讓你的代碼更容易理解。 –

回答

0

也許別人可以計算出來,但對我來說你的代碼簡直太難以理解。但是,即使我無法解決問題,我也可以給出一些建議,以幫助您刪除大概一千行代碼,這可能會使問題更容易被發現。

你知道,你可以創建循環部件?您可以使用非常簡單的技術輕鬆刪除幾百行代碼。另外,您是否意識到您可以更改現有標籤的顏色而不破壞它並重新創建它?

最後,你並不需要所有的STRINGVAR這些實例,因爲你只存儲它們的顏色。一個正常的變量會做。當您試圖將兩個或更多小部件的標籤或值綁定在一起時,StringVars確實非常有用。如果您想將單元格顏色存儲在變量中,請將它們存儲在與標籤相同的數據結構中,然後重繪函數只需執行一次循環即可將每種顏色應用於每個單元格。

例如,可將所有的初始顏色爲「皇家藍」,你可以這樣做以下。我用一本字典,但你可以只是簡單地使用一個列表的列表:

color = {} 
for row in range(10): 
    for column in range(10): 
     color[(row, column)] = "royal blue" 

接下來,您可以創建10×10的標籤網格具有相同的簡單循環。這可以代替200行代碼(加上另外100個空白行),只用6行代碼就可以創建原始標籤。

# to create the labels and store them in a dictionary: 
cell = {} 
for row in range(10): 
    for column in range(10): 
     l = Label(app, text="  ", background=color[(row, column)]) 
     l.grid(row=row, column=column) 
     cell[(row,column)] = l 

您可以使用configure更新每個標籤。因此,例如,更改標籤0,0爲紅色,你這樣做:

cell[(0,0)].configure(background="red") 

可以檢索標籤與cget方法的背景色。例如,這將打印「紅」:

print cell[(0,0)].cget("background") 

使用所有這些技術可能會降低你的代碼下降到只有幾百行,這將使你更容易發現任何錯誤。

+0

感謝您提供縮短代碼的建議。我會這樣做,看看問題是否消失。如果沒有,我會在這裏發佈新的代碼,這應該更容易看到。我知道這有點長,但我很難找到關於這類事情的文檔,所以再次感謝關於凝聚我的計劃的幫助。 – user3477719