2012-06-25 65 views
1

我已經在Tkinter中創建了一個「表格」,但作爲與OptionMenu關聯的單獨函數,我創建了另一個需要根據選擇添加/刪除的框架。我的代碼如下:等大小'表格'框架和刪除單個框架

def ChoiceBox(choice): 

    choice_frame = Frame(win1, bg='black') 
    choice_frame.grid(row=2, column=1, sticky="ew", padx=1, pady=1) 
    column = 0 
    if choice == "Fixed": 
     choice_frame.grid_forget()  
     tkMessageBox.showinfo("Message", "Fixed.") 
    elif choice == "List": 
     i = [0, 1, 2, 3] 
     for i in i: 
      choice_title = Label(choice_frame, text='Value %g'% float(i+1), bg='white', borderwidth=0, width=0) 
      choice_title.grid(row=0, column=column+i, sticky="nsew", padx=1, pady=1) 

      box = Entry(choice_frame, bg='white', borderwidth=0, width=0) 
      box.grid(row=1, column=column+i, sticky="ew", padx=1, pady=1) 
    elif choice == "Between" or "Bigger": 
     i = [0, 1] 
    choice_title1 = Label(choice_frame, text='Min Value', bg='white', borderwidth=0, width=0) 
     choice_title1.grid(row=0, column=column, sticky="nsew", padx=1, pady=1) 
     choice_title2 = Label(choice_frame, text='Max Value', bg='white', borderwidth=0, width=0) 
     choice_title2.grid(row=0, column=column+1, sticky="nsew", padx=1, pady=1) 
     for i in i: 
      box = Entry(choice_frame, bg='white', borderwidth=0, width=0) 
      box.grid(row=1, column=column+i, sticky="nsew", padx=1, pady=1) 

我目前得到兩個獨立的表,但choice_frame「表」不是尺寸與其他同一個。因此,我希望將此表格作爲第一張表格的框架的一部分(然後以某種方式刪除本節),我已經開始工作了。另一個框架是frame_table(我製作原始表格的那個框架),並希望加入這個框架。

否則我想保持它像一個單獨的表,但我不能讓它消失選擇'固定'。此代碼純粹是我之前創建的OptionMenu的命令。任何幫助,我將不勝感激!謝謝。

更新:現在需要根據選擇獲取每行的單獨幀(請參閱下圖)。我在這非常掙扎!

enter image description here

+0

我很困惑你要在這裏做什麼。你說的另一個框架是什麼('win1'也許?)?每次你調用這個函數,你都在創建一個新的框架。我認爲你想持有對創建框架的引用,然後決定是將它放在網格上還是「grid_forget」它(或者可能會銷燬舊的「Frame」,然後用新的框架替換它)... – mgilson

+0

另一個框架是我在其中創建表格並且不是根框架。當我想根據選擇做幾件不同的事情時,我覺得我很困惑。 – user2063

+0

當我按下按鈕時,我期待從這些Entry小部件中獲取值,但是我正在混合所有的定義。我會如何去做這件事? – user2063

回答

0

這裏有一個稍微好一點的例子(相對於一個我以前有):

import Tkinter as tk 

class TableWithFrame(tk.Frame): 
    def __init__(self,master=None,*args,**kwargs): 
     tk.Frame.__init__(self,master,*args,**kwargs) 
     self.table=tk.Frame(self) 
     self.table.grid(row=0,column=0) 

     self.optionmenu=None 
     self.option=tk.StringVar() 

     self.frames={} 
     self.options=[] 
     self.current_choice=None 

     self.add_optionmenu() 
     self.option.trace("w",self.option_changed) 


    def add_option(self,option_string,frame): 
     self.options.append(option_string) 
     if(self.optionmenu is not None): 
      self.optionmenu.destroy() 
     self.add_optionmenu() 
     self.frames[option_string]=frame 

    def add_optionmenu(self): 
     if(self.optionmenu is not None): 
      self.optionmenu.destroy() 

     if(self.options): 
      self.optionmenu=tk.OptionMenu(self,self.option,*self.options) 
      self.optionmenu.grid(row=1,column=0) 

    def option_changed(self,*args): 
     choice=self.option.get() 
     if(self.current_choice is not None): 
      self.current_choice.grid_forget() 
     self.current_choice=self.frames[choice] 
     self.current_choice.grid(row=0,column=1) 


if __name__ == "__main__": 
    def populate_table(table): 
     """ junk data """ 
     for j in range(3): 
      for i in range(10): 
       l=tk.Label(table,text='%d'%(i*j)) 
       l.grid(row=j,column=i) 


    def create_opt_frames(TWF): 
     #Fixed Frame 
     F=tk.Frame(TWF) 
     F.boxes={} 
     TWF.add_option('Fixed',F) 

     #List Frame 
     F=tk.Frame(TWF) 
     F.boxes={} 
     for i in (1,2,3,4): 
      choice_title = tk.Label(F, text='Value %g'% float(i+1)) 
      choice_title.grid(row=0, column=i, sticky="news") 
      box = tk.Entry(F, bg='white') 
      box.grid(row=1, column=i, sticky="ew") 
      F.boxes[i]=box 

     TWF.add_option('List',F) 

     #Bigger and Between Frame 
     F=tk.Frame(TWF) 
     F.boxes={} 
     choice_title1 = tk.Label(F, text='Min Value') 
     choice_title1.grid(row=0, column=0, sticky="news") 
     choice_title2 = tk.Label(F, text='Max Value') 
     choice_title2.grid(row=0, column=1, sticky="news") 
     for i in (1,2): 
      box = tk.Entry(F) 
      box.grid(row=1, column=i-1, sticky="nsew", padx=1, pady=1) 
      F.boxes[i]=box 

     TWF.add_option('Between',F) 
     TWF.add_option('Bigger',F) 

    def print_boxes(TWF): 
     """ Example of how to get info in Entry fields """ 
     if(TWF.current_choice is not None): 
      for k,v in TWF.current_choice.boxes.items(): 
       print ("boxnum (%d) : value (%s)"%(k,v.get())) 
     TWF.after(1000,lambda : print_boxes(TWF)) 

    root=tk.Tk() 
    App=TableWithFrame(root) 
    populate_table(App.table) 
    create_opt_frames(App) 
    print_boxes(App) 
    App.grid(row=0,column=0) 
    root.mainloop() 

這是通過創建在選項菜單中每個選項的框架。實際上,這可以全部在這個班級以外完成。你所做的只是爲你想要的每個選項添加一個框架。

+0

我真的很感謝你的幫助和解答。不過,我想知道是否有可能在聊天中向我展示我的整個代碼,因爲它更像是一個整合的問題......我也沒有使用過自己等等。你認爲這是可能的嗎? – user2063

+0

@ user2063 - 查看更新的代碼。 (尤其是'if __name__ =='__main __''中的東西) – mgilson

+0

我已經回過頭來回答這個問題,因爲我已經在課堂上進一步瞭解了一些內容。然而,我很難將其他一些定義合併爲I不明白如何解決'如果__name__ =='__main__''並且不斷收到'自我未定義'的錯誤。你能解釋一下這條線是怎麼做的,以及如何在沒有這個錯誤的情況下繼續添加我的其他函數?謝謝。 – user2063