2014-06-20 79 views
-1

我肯定會誤解與包和網格的東西... 我正在製作一個python應用程序的GUI,它可以在多個終端類控制檯中獲取調試消息。製作Tkinter GUI的新功能Tkinter網格框架被垂直堆疊,而不是水平網格

首先,爲什麼我需要打包buttonframe才能顯示它?不應該相當於包裝?

GUI由按鈕框頂部的一系列按鈕和一系列垂直控制檯組成,並以列的形式顯示。相反,我得到的是所有控制檯垂直堆疊。

控制檯是帶有文本的框架,其中的文本由應用程序中的其他線程編寫。

如果我不控制控制檯[idx],它不會改變(所以我認爲它不起作用)。如果我不包裝控制檯[idx],GUI將開始閃爍。

請注意,如果我改爲調用create_Hterms,而不是垂直堆疊一堆水平控制檯。

如何正確地將我的控制檯放置爲垂直列?

import Tkinter as tikei 

NCONSOLES = 4 
HORZ_CONSOLE_W = 10 
HORZ_CONSOLE_H = 12 

# FakeConsole: one of the consoles that are spawned by MainWindow. 
class FakeConsole(tikei.Frame): # from Kevin in http://stackoverflow.com/questions/19479504/how-can-i-open-two-consoles-from-a-single-script 
    def __init__(self, root, cust_width, cust_height, *args, **kargs): 
     tikei.Frame.__init__(self, root, *args, **kargs) 
     self.grid(row=0) 

     #white text on black background 
     self.text = tikei.Text(root, bg="black", fg="white", width=cust_width, height=cust_height) 
     self.text.grid(row=0) 
     self.text.insert(tikei.END, 'ASD') 
     self.text.see(tikei.END) 

    def clearConsole(self): 
     self.text.delete(1.0,tikei.END) 



class MainWindow(tikei.Frame): 
    counter = 0 
    consoles = [] 
    consoleFormat = '' 
    e_Vvar = '' 
    e_Hvar = '' 
    var1 = '' 
    ctrlCmdRecipient = '' 

    def __init__(self, *args, **kwargs): 
     tikei.Frame.__init__(self, *args, **kwargs) 
     self.consoleFormat = 'H' 
     self.cF = tikei.StringVar() 

     self.grid(row=0) 

     self.buttonframe = tikei.Frame(self) 
     self.buttonframe.grid(row=0) 
     tikei.Button(self.buttonframe, text = "Clear Consoles", command=self.clearConsoles).grid(row=0, column=0) 
     tikei.Button(self.buttonframe, text = "start").grid(row=0, column=1) 
     tikei.Button(self.buttonframe, text = "stop").grid(row=0, column=2) 

     self.consoleFrame = tikei.Frame(self) 

     self.create_Hterms() 

     self.consoleFrame.grid(row=1) 

     # create a status bar 
     self.statusTxt = tikei.StringVar() 
     self.statusTxt.set('-') 
     self.statusLab = tikei.Label(self.buttonframe, text="Status: ", anchor=tikei.W, height=1).grid(row=1, column=0, sticky=tikei.W) 
     self.statusBar = tikei.Label(self.buttonframe, textvariable=self.statusTxt, anchor=tikei.W, height=1).grid(row=1, column=1, columnspan=4, sticky=tikei.W) 


    def clearConsoles(self): 
     for i in range(NCONSOLES): 
      self.consoles[i].clearConsole() 

    def create_Hterms(self): 
     ctr = NCONSOLES 
     idx = 0 

     cons_w = HORZ_CONSOLE_W 
     cons_h = HORZ_CONSOLE_H 

     while ctr > 0: 
      self.consoles.append(FakeConsole(self.consoleFrame, cons_w, cons_h)) # 
      self.consoles[idx].grid(row=idx+1, column=0) 
      ctr -= 1 
      idx += 1 
     return idx+1 



root = tikei.Tk() 
mainTk = MainWindow(root) 
root.wm_title("TOOLS") 
mainTk.grid(row=0) 
root.mainloop() 
+0

我在運行代碼時遇到了一些麻煩。 indentation不正確,第3行的'self'未定義,'def create_Vterms()'後面沒有冒號,並且缺少self參數,'self.clearConsoles'不存在,'NCONSOLES'和' VERT_CONSOLE_W'和'VERT_CONSOLE_H'沒有定義,並且使用了'threading'但是沒有被導入。請[提供代碼](http://sscce.org/),可以複製並粘貼並運行,這表現了您的問題。 – Kevin

+0

不要在同一個元素上使用'pack()'和'grid()'! 'pack()'和'grid()'是互斥的。 – furas

+0

您有相當多的語法缺陷。這不可能是你的實際代碼。你可以給我們的代碼運行嗎? –

回答

0

首先爲什麼需要收拾buttonframe已顯示出它? 不應該相當於包裝?

不,一般來說,你不需要打包buttonframe來顯示它。使用包或網格,但不能在同一個小部件上。但是,在這種特定情況下,使用pack掩碼會在您的代碼中出現更深層次的錯誤,並且看起來像調用pack是必需的。

問題是您使用packself.consoleFrame,並且self.consoleFrameself.buttonFrame都具有相同的父級。因爲他們共享同一個家長,所以你必須使用包或網格。

圖形用戶界面由按鈕框頂部的一系列按鈕以及以下列顯示的一系列垂直控制檯組成。相反,我得到的是所有控制檯垂直堆疊。

這是因爲您使用grid,然後您使用pack。你只能使用其中一個,而最後一個使用「勝利」。因此,你使用的是pack,而你沒有給它任何選擇,所以它默認從上到下打包東西。

雖然這是完全安全的在同一應用程序同時使用gridpack,這是毫無意義的同一部件同時使用,並且它使用不同的藥粥共享相同的父控件的錯誤。

該問題的解決方案與您使用的gridpack一致。如果您打算使用grid,請確保您一致地使用共享相同父級的所有窗口小部件。

這同樣適用於pack - 一致地使用它。此外,我建議始終明確地將side,fillexpand參數添加到pack,以便清楚您的意圖是什麼。

+0

我很欣賞你的見解。你提到持續使用包的論點,但是有沒有關於網格的指導?我有這樣的感覺,在while構造中使用grid(row = idx,column = 0)不會將控制檯堆棧成行,儘管我在每次迭代時都指定了一個新的行索引。也許網格應該提供一些額外的選項? –

+0

@KeinReverbLeonardoGabrielli:是的,總是指定一個明確的行和列以及'sticky'屬性是一個好主意。歧義是敵人。 –