2015-09-17 22 views
1

我想構建一個非常簡單的GUI,在這種方式之前完成,從來沒有問題。現在,在Mac上,我似乎無法使其工作。爲什麼這個簡單的Python TK Gui編程需要100%的CPU

這是代碼

from Tkinter import * 

class App: 
    def __init__(self, master): 

     # Gui Creation Block 
     frame = Frame(master, bd=2, relief=SUNKEN) 
     self.master = master 

     self.top = Frame(frame, height=150, width=700, relief=SUNKEN) 
     self.left = Frame(frame , height=400, width=200, relief=SUNKEN) 
     self.right = Frame(frame, height=400, width=500, relief=SUNKEN) 

     self.top.grid(row=0, column=0, columnspan=2) 

     self.left.grid(row=1, column=0) 
     self.right.grid(row=1, column=1) 

     # Sample Label 
     self.lbl = Label(frame, text="Log file locaction") 
     self.lbl.grid(row=0, column=0) 

     self.top.pack() 

     frame.pack() 

# Run the programs 
root = Tk() 
app = App(root) 

root.mainloop() 

當我運行,CPU使用率焰火至100%,並保持在那裏,直到我硬殺傷的Python實例運行在那裏。如果我將標籤註釋掉,那不會發生。那麼這裏有什麼問題?

------更新-------

好吧,改變了文件定位器的事情啊,這是一個混亂的一個。並從頂部刪除包()解決了100%的CPU問題。

但是,它仍然不像我想要的那樣。

self.top = Frame(frame, bg="black", height=150, width=700, relief=SUNKEN) 
    self.left = Frame(frame , height=400, width=200, relief=SUNKEN) 
    self.right = Frame(frame, height=400, width=500, relief=SUNKEN) 

應該建立3塊,我可以把其他小部件,但只要我添加第三個標籤,像這樣的;

# Sample Label 
    self.lbl = Label(self.top, text="Top") 
    self.lbl.pack() 

    # Sample Label 
    self.lbl2 = Label(self.left, text="Left") 
    self.lbl2.pack() 

    # Sample Label 
    self.lbl3 = Label(self.right, text="Right") 
    self.lbl3.pack() 

它將我的整個應用調整到最小尺寸。 我錯在認爲內部小部件不會更改其父容器,或者我犯了另一個錯誤嗎?

+1

pack,grid together?只使用網格方法! – dsgdfg

+0

在'self.top'上使用pack和grid。 – Jkdc

+0

Tkinter框架自動調整其大小以適應其內容,但有一種方法可以覆蓋該行爲。我會盡快發佈一些代碼。 –

回答

4

什麼dsgdfg & Jkdc說:你有self.top.grid()self.top.pack()
不要這樣做!正如您發現的那樣,當您在單親中混合使用pack() & grid()時,Tkinter表現不佳。

至於你更新...

一個Tkinter的框架自動調整自身以適應其內容。大多數時候這是可取的,但幸運的是,當您想要使用固定的幀大小時,有一種方法可以覆蓋該行爲。

這裏有一個稍微修改過的代碼版本,它爲框架使用不同的彩色背景,以便更容易地看到哪個位置。 (是的,這些顏色看起來很糟糕,但是一旦你完成了在GUI中鋪設的東西,你會改變它們到更好的地方)。我已經將borderwidth arg添加到內部框架,以便可以看到SUNKEN浮雕。我也調整了內部框架的位置,因爲您在外部框架中的第一個標籤與self.top框架相同。此外,您正嘗試使用self.lbl作爲兩個不同的標籤。

from Tkinter import * 

class App: 
    def __init__(self, master): 
     self.master = master 

     # Gui Creation Block 
     master.title("LumenScriptor") 
     frame = Frame(master, bd=2, relief=SUNKEN) 
     frame.pack() 

     self.top = Frame(frame, bg="red", height=150, width=700, relief=SUNKEN, borderwidth=2) 
     self.left = Frame(frame, bg="yellow", height=400, width=200, relief=SUNKEN, borderwidth=2) 
     self.right = Frame(frame, bg="blue", height=400, width=500, relief=SUNKEN, borderwidth=2) 

     self.top.grid(row=0, column=1, columnspan=2) 
     self.left.grid(row=1, column=1) 
     self.right.grid(row=1, column=2) 

     self.top.pack_propagate(0) 
     self.left.pack_propagate(0) 
     self.right.pack_propagate(0) 

     # Sample Label 
     self.lbl = Label(frame, text="Log file location") 
     self.lbl.grid(row=0, column=0) 

     # Sample Label 
     self.lbl1 = Label(self.top, text="Top") 
     self.lbl1.pack() 

     #Sample Label 
     self.lbl2 = Label(self.left, text="Left") 
     self.lbl2.pack() 

     # Sample Label 
     self.lbl3 = Label(self.right, text="Right") 
     self.lbl3.pack() 

# Run the programs 
root = Tk() 
app = App(root) 

root.mainloop() 
+0

好的,改變了那個文件定位器的東西是的,那是一個混亂的。並從頂部刪除包()解決了100%的CPU問題。 – Eloque

+0

優秀且有洞察力。謝謝。看起來我很sl,,可能很累。 – Eloque

+0

@Eloque:別擔心。像列和行數字一樣混亂很容易。因此,您只需在添加內容時繼續測試代碼,以便在發生錯誤時立即修復錯誤,而不是在添加了另外50個小部件之後。 :) PS。你現在有足夠的代表進行投票:D –

相關問題