2012-06-08 25 views
0

因此,我對Tkinter中的某些事情有更多的好奇心。這不是必需的,但我有點想實現它。無論如何,我想要做的是在選擇了apSelect列表框中的某個項目時,我想要創建一個或兩個多列表框,然後使用文件中的數據填充它們(爲了簡單起見,我們只需說它來自預設)除此之外,如果在apSelect中選擇了不同的條目,我希望它們消失。另一件事,那就是抓住那些動態列表框中選擇的數據(假設它們存在)。這是使用Tkinter的代碼。真正唯一重要的部分是init_方法(這可能是我可以設置爲動態生成的地方)和生成方法(我將需要提取數據)。動態添加和刪除tkinter中的列表框

class App: 
    def __init__(self, master): 
     dateFrame= Frame(master) 
     dateFrame.pack() 
     apSelectFrame = Frame(master) 
     apSelectFrame.pack() 
     entryFrame = Frame(master) 
     entryFrame.pack() 
     buttonFrame = Frame(master) 
     buttonFrame.pack() 

     Label(dateFrame, text="Period:").grid(row=0) 
     self.period = Entry(dateFrame) 
     self.period.grid(row=0, column=1) 
     Label(dateFrame, text="Year:").grid(row=1) 
     self.year = Entry(dateFrame) 
     self.year.grid(row=1, column=1) 

     Label(apSelectFrame, text="Select Report Type:").grid(row=0) 
     self.apSelect = Listbox(apSelectFrame, selectmode=SINGLE, height=3) 
     self.apSelect.grid(row=1) 
     for item in ["Artists", "Publishers", "Both"]: 
      self.apSelect.insert(END, item) 
     self.allTheThings = IntVar() 
     self.checkAll = Checkbutton(apSelectFrame, text="All?", variable=self.allTheThings) 
     self.checkAll.grid(row=1, column=1) 

     Label(entryFrame, text="Client Name: ").grid(row=0) 
     self.client = Entry(entryFrame) 
     self.client.grid(row=0, column=1) 
     Label(entryFrame, text="Publisher Name: ").grid(row=1) 
     self.pub = Entry(entryFrame) 
     self.pub.grid(row=1, column=1) 

     self.generateBt = Button(buttonFrame, text="Generate!", command=self.generate) 
     self.generateBt.pack(side=LEFT) 
     self.resetBt = Button(buttonFrame, text="Reset!", command=self.reset) 
     self.resetBt.pack(side=LEFT) 
     self.quitBt = Button(buttonFrame, text="Quit!", fg="red", command=buttonFrame.quit) 
     self.quitBt.pack(side=LEFT) 

    def fileChecker(self, filename): 
     if(not os.path.isfile(filename)): 
      return "Missing file: "+filename+"\n" 

    def checkForFiles(self, srFilename): 
     errorFlag = False 
     errorReport = []  
     errorReport.append(self.fileChecker("albums.csv")) 
     errorReport.append(self.fileChecker("clients.csv")) 
     errorReport.append(self.fileChecker("composition_copyright_holders.csv")) 
     errorReport.append(self.fileChecker("compositions.csv")) 
     errorReport.append(self.fileChecker("copyright_holders.csv")) 
     errorReport.append(self.fileChecker("track_compositions.csv")) 
     #errorReport.append(self.fileChecker("track_copyright_holders.csv")) 
     errorReport.append(self.fileChecker("tracks.csv")) 
     errorReport.append(self.fileChecker("copyright_holders_previously_owed.csv")) 
     errorReport.append(self.fileChecker("artist_override.csv")) 
     errorReport.append(self.fileChecker(srFilename)) 
     if(errorFlag): 
      tkMessageBox.showerror("Error", 
       "Either select all or enter publisher name!") 
     else: 
      return 

    def generate(self): 
     #TODO File checker 
     month = self.period.get() 
     #month = 'q1' 
     year = self.year.get() 
     #year = '2012' 
     clname = self.client.get() 
     pubname = self.pub.get() 
     report_type = self.apSelect.curselection() 
     #report_type = '1' 
     allTheThings = self.allTheThings.get() 
     #allTheThings = True 
     if len(month)==0: 
      tkMessageBox.showerror("Error", 
       "You forgot to enter a period!") 
      return 
     if len(year)==0: 
      tkMessageBox.showerror("Error", 
       "You forgot to enter a year!") 
      return 
     if len(report_type)==0: 
      tkMessageBox.showerror("Error", 
       "You forgot to select a report type!") 
      return 
     if report_type[0]=='0' and allTheThings==0 and clname=="": 
      tkMessageBox.showerror("Error", 
       "Either select all or enter a client name!") 
      return 
     if report_type[0]=='1' and allTheThings==0 and pubname=="": 
      tkMessageBox.showerror("Error", 
       "Either select all or enter publisher name!") 
      return 
     if report_type[0]=='2' and allTheThings==0 and clname=="" and pubname=="": 
      tkMessageBox.showerror("Error", 
       "Either select all or enter a client and publisher name!") 
      return 
     if(not os.path.exists("reports")): 
      os.makedirs("reports") 
     if(not os.path.exists('reports/'+month+'_'+year+'')): 
      os.makedirs('reports/'+month+'_'+year) 
     if(not os.path.exists('reports/'+month+'_'+year+'/artists')): 
      os.makedirs('reports/'+month+'_'+year+'/artists') 
     if(not os.path.exists('reports/'+month+'_'+year+'/publishers')): 
      os.makedirs('reports/'+month+'_'+year+'/publishers') 
     if(not os.path.exists('reports/'+month+'_'+year+'/artists/empty')): 
      os.makedirs('reports/'+month+'_'+year+'/artists/empty') 
     if(not os.path.exists('reports/'+month+'_'+year+'/publishers/empty')): 
      os.makedirs('reports/'+month+'_'+year+'/publishers/empty') 
     srFilename="sr1_"+month+"_"+year+".csv" 
     self.checkForFiles(srFilename) 
     tester=ACR_CALC() 
     tester.calc(month, year, clname, pubname, report_type, allTheThings,srFilename) 

    def reset(self): 
     print "RESETING!" 
     self.period.delete(0, END) 
     self.year.delete(0, END) 
     self.allTheThings.set(0) 
     self.client.delete(0, END) 
     self.pub.delete(0, END) 
     self.apSelect.select_clear(0,END) 

root = Tk() 
app = App(root) 
root.mainloop() 

回答

1

使用網格幾何管理器,你就可以輕鬆擁有一個部件出現/消失在一個給定的事件,正如我在我下面的例子一樣。

pack有一個類似的pack_forget方法,但我想如果它不侷限於固定的專用幀,可能會讓你的小部件消失/重新出現在相同的地方會更困難一些。

此代碼中的小部件在按下按鈕時會出現/消失,但如果您瞭解如何綁定Tkinter中的事件,則可以使用此方法使窗口小部件(dis)出現在您想要的任何事件上查看bind方法獲取更多信息)。

import Tkinter as tk 

class App(tk.Frame): 
    def __init__(self,master): 
     tk.Frame.__init__(self,master) 
     self.b=tk.Button(self,text='hide',command=self.hide) 
     self.lbl=tk.Label(self,text="This is a label you can hide") 
     self.b.grid(row=0,column=0) 
     self.lbl.grid(row=0,column=1) 

    def hide(self): 
     self.lbl.grid_forget() 
     self.b.config(command=self.show,text='show') 

    def show(self): 
     self.lbl.grid(row=0,column=1) 
     self.b.config(command=self.hide,text='hide') 

if __name__ == '__main__': 
    root = tk.Tk() 
    f=App(root) 
    f.grid(row=0,column=0) 
    root.mainloop() 

我不能完全肯定,我已經在這裏回答了全部問題 - 有很多你的問題進行梳理,通過...讓我知道,如果你有其他疑問...

+0

那麼這個或多或少會爲linkbox工作?我可以在鏈接框的初始化中添加一個'command =',並且當您選擇它再次運行該命令時? – bagelbits

+0

'command = func'是按鈕特定的。但是,您可以將任意命令綁定到任意小部件。例如'MyLabel.bind(「」,func2)''當你點擊標籤時會運行'func2'。 (谷歌搜索「tkinter綁定」應該給你很多的信息,我特別喜歡這個網頁:http://www.pythonware.com/library/tkinter/introduction/events-and-bindings.htm) – mgilson

+0

謝謝,這正是我正在尋找。 – bagelbits