因此,我對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()
那麼這個或多或少會爲linkbox工作?我可以在鏈接框的初始化中添加一個'command =',並且當您選擇它再次運行該命令時? – bagelbits
'command = func'是按鈕特定的。但是,您可以將任意命令綁定到任意小部件。例如'MyLabel.bind(「」,func2)''當你點擊標籤時會運行'func2'。 (谷歌搜索「tkinter綁定」應該給你很多的信息,我特別喜歡這個網頁:http://www.pythonware.com/library/tkinter/introduction/events-and-bindings.htm) –
mgilson
謝謝,這正是我正在尋找。 – bagelbits