2016-01-11 70 views
0

我已經在Python turtle圖形中創建了一個程序並創建了一些窗口小部件。但是,這些小部件有一個主要問題:他們只是停留在窗口的底部,我不能在屏幕的任何地方將它們移動到任何地方。它們只是從左到右一直停留在底部窗口中,當擁有多個小部件時,這成爲一個真正的問題。澄清,這裏是我正在談論的形象:Widgets issuePython turtle圖形窗口中的tkinter小部件的問題

我想要的是能夠將窗口小部件移動到窗口的頂部,左側或右側,而不是他們只是堅持到它的底部。而且,正如你所看到的,由於我已經創建了很多小部件,我不能這樣做的事實成爲一個真正的問題。 那麼,爲什麼會發生這種情況,我將如何解決它?此外,爲了以防萬一,下面是我的菜單一個和我的按鈕一個的代碼塊:

菜單代碼塊:

tb = Menubutton(text = "Change pen thickness") 
tb.pack(side = 'left') 
tb.menu = Menu(tb, tearoff = 0) 
tb["menu"] = tb.menu 
thick = tb.menu 
thick.add_command(label = "1", command = width1) 
thick.add_command(label = "2", command = width2) 
thick.add_command(label = "3", command = width3) 
thick.add_command(label = "4", command = width4) 
thick.add_command(label = "5", command = width5) 
thick.add_command(label = "6", command = width6) 
thick.add_command(label = "7", command = width7) 
thick.add_command(label = "8", command = width8) 
thick.add_command(label = "9", command = width9) 
thick.add_command(label = "10", command = width10) 
tb.pack() 

按鈕的代碼塊:

change = Button(text = "Change letter dimensions", command = NewLetterDimensions) 
change.pack(side = 'left') 

窗口小部件打包到左邊的事實不是問題,因爲即使在我這樣做之前,窗口小部件仍會停留在窗口底部。唯一的區別是它們是從上到下堆疊而不是從左到右。

Google在尋找解決方案方面沒有太多幫助,所以我正在轉向SO。任何幫助深表感謝!

編輯:我曾嘗試加入master = getcanvas()並提出,像這樣的小部件之一的大師:

master = getcanvas() 
mb = Menubutton(master, text = "Change color") 

,現在當我運行程序時,它只是掛起並最終崩潰每一次。之前我曾經嘗試過,當時我只有一個小部件,並且它仍然取得了相同的結果。我真的不知道還有什麼要做,所以非常感謝幫助。

編輯#2:我也試圖創建一個Tkinter的框架,我收拾到畫布的底部,然後使該框架菜單的高手,像這樣:

master = Frame() 
master.pack(side = 'top') 
mb = Menubutton(master, text = "Change color") 
mb.pack(side = 'top') 

然而,儘管兩者都設置爲side = 'top',但仍停留在屏幕的底部,只有在小部件上的其他人之上,就像這樣:

New method failure

什麼仍然是G錯了嗎?

編輯#3:這就是我現在越來越爲每答案建議:

What I have now

回答

0

您的問題是在爲了你所呼叫的幾何管理pack

pack將微件添加到主插件/幀/窗口中的可用空間,它粘到指定的邊緣(默認爲top)。所以你的情況,你所呼叫的畫布上pack第一,將它貼到你的窗口的頂部,那麼無論你加下它會被添加,因爲它粘到頂部邊緣,和你的可用空間下。

您有幾種選擇,做你想做的事,你可以改變你的小部件聲明的順序,先聲明這是怎麼回事是在上面,或左,收拾它是這樣。這不是很漂亮。或者你可以聲明所有的小部件,並最終保留所有pack命令,然後按照你需要的順序調用它們,這更好,但仍不是最好的選擇。

我建議爲每個組元素的創建不同的幀,例如菜單的框架,按鈕的幀和用於在畫布幀,管理在每一幀中的元件的內部幾何形狀,然後管理幾何窗口中的幀。

或者你可以使用grid而不是pack管理的幾何形狀。請注意,不建議混用兩者,否則會變得混亂。

+0

我該如何爲畫布創建一個框架?我調用了'getcanvas()',然後執行了這個'mem = getcanvas(); widgetmaster = Frame(mem); widgetmaster.pack(side ='top')'然而,現在每當我啓動程序時,它都會卡住,我必須殺死它。 –

+0

在創建畫布之前創建框架,'FrameCanvas = Frame()'然後在創建畫布時,在框架'YourCanvas = Canvas(FrameCanvas,other_arguments)'中創建它。現在'YourCanvas.pack(側=「你的選擇」)'將確定畫布IN的幀的位置,和'FrameCanvas.pack(側=「你的選擇」)'將確定在窗口 –

+0

的幀的位置好的,所以我創建了畫布。但是我使用了未定義的畫布實例,那麼如何在不創建「RawTurtle」的情況下將畫布重新定義爲「YourCanvas」? –

相關問題