from RssReader import generateRsses from Tkinter import * from tkFileDialog import askopenfilename currentFeeds = {} rssDisplay = None chooseChannel = None currentChannel = None currentFeeds = None # The overall window def rssWindow(): root = Tk() root.title("Rss Reader") root.geometry("750x500") root = channelFrame(root) root = buttonFrame(root) return root # The upper window with the dropdown and listbox def channelFrame(parent): channelFrame = Frame(parent) channelSelectFrame = Frame(channelFrame) channelSelectFrame = channelLabel(channelSelectFrame) channelSelectFrame = channelSelect(channelSelectFrame) channelSelectFrame.pack(side=LEFT) channelFrame = rssDisplay(channelFrame) channelFrame.pack(side=TOP, expand=YES, fill=BOTH) return parent def rssDisplay(parent): global rssDisplay rssDisplay = Listbox(parent) rssDisplay.pack(side=RIGHT, expand=YES, fill=BOTH) return parent def channelLabel(parent): label = Label(parent, text="Select a channel:") label.pack(side=TOP) return parent def channelSelect(parent): global chooseChannel, currentChannel currentChannel = StringVar(parent) channelList = ["None"] currentChannel.set(channelList[0]) chooseChannel = OptionMenu(parent, currentChannel, *channelList) chooseChannel.pack(side=BOTTOM) return parent # The lower window with the two buttons def buttonFrame(parent): buttonFrame = Frame(parent) buttonFrame = setConfigFileButton(buttonFrame) buttonFrame = loadRssButton(buttonFrame) buttonFrame.pack(side=RIGHT, expand=YES, fill=X) return parent def setConfigFileButton(parent): button = Button(parent, command=setConfigFile) button["text"] = "Set Config File" button.pack(side=LEFT) return parent def loadRssButton(parent): button = Button(parent, command=loadRss) button["text"] = "Load Feeds" button.pack(side=RIGHT) return parent # Commands called by various elements def loadRss(): global chooseChannel, currentChannel chooseChannel["menu"].delete(0, END) channelList = currentFeeds.keys() for channelName in channelList: chooseChannel["menu"].add_command(label=channelName, command=lambda temp = channelName: selectChannel(temp)) selectChannel(channelList[0]) ## Lambda, functions are first class objects def selectChannel(channelName): global chooseChannel, rssDisplay chooseChannel.setvar(chooseChannel.cget("textvariable"), value = channelName) rssDisplay.delete(0, END) for feed in currentFeeds[channelName]: rssDisplay.insert(END, feed) # http://www.prasannatech.net/2009/06/tkinter-optionmenu-changing-choices.html def setConfigFile(): global currentFeeds currentFeedFile = askopenfilename(filetypes=[("allfiles", "*"), ("textfiles","*.txt")]) currentFeeds = combineFeeds(currentFeedFile) loadRss() def combineFeeds(fileName): feeds = {} for feed in generateRsses(fileName): for channelName in feed.keys(): if feeds.has_key(channelName): feeds[channelName] += feed[channelName] else: feeds[channelName] = feed[channelName] return feeds if __name__ == "__main__": rssWindow().mainloop()