#!/bin/env python # # gui.py # by Nick Loadholtes # # This is a GUI I built to help build script files as # an experiment to build a Choose-Your-Own-Adventure # style game. # # Use tester.py to run the file generated by this program. # Use at your own risk, no warranty. from Tkinter import * from tkFileDialog import * import pickle class CYOAGUI(Frame): def __init__(self, master=None): Frame.__init__(self, master) self.datafield = "" self.namefield = "" self.nodes = {} # contains {node id : (node title, node text, (child relationships)) self.editing = None self.counter = -1 self.loading = False self.grid() self.createControlWidgets() def createControlWidgets(self): self.createMenus() self.createTextFields() def createMenus(self): self.MENUBAR = Menu(self.master) self.MENUBAR.add_command(label="Open", command=self.fileopen) self.MENUBAR.add_command(label="Save", command=self.filecmd) self.MENUBAR.add_command(label="Quit", command=self.quitapp) self.master.config(menu=self.MENUBAR) def createTextFields(self): self.NAMEFIELDLABEL = Label(text="Node Title:", justify=LEFT).grid(row=0, column=0) self.NAMEFIELD = Text(width=30, height=1) self.NAMEFIELD.grid(row=0, column=1) self.DATAFIELDLABEL = Label(text="Node Text:", justify=LEFT).grid(row=1, column=0) self.DATAFIELD = Text(self.master, width=30, height=5) self.DATAFIELD.grid(row=1, column=1) self.PARENTLISTLABEL = Label(text="Child Nodes: ", justify=LEFT).grid(row=2, column=0) self.PARENTLIST = Listbox(self.master, height=4, width=30, selectmode=EXTENDED) self.scrollbar = Scrollbar(self.master, command=self.PARENTLIST.yview) self.scrollbar.grid(row=2, column=2, sticky=W+E) self.PARENTLIST.bind("<Double-Button-1>", self.loadnode) self.PARENTLIST.grid(row=2, column=1) self.SAVE = Button(self.master) self.SAVE["text"] = "Save" self.SAVE["command"] = self.save self.SAVE.grid(row=3, column=0) self.NEWNODE = Button(self.master) self.NEWNODE["text"] = "New Node" self.NEWNODE["command"] = self.newnode self.NEWNODE.grid(row=3, column=1) self.populatefields() def populatefields(self): self.PARENTLIST.delete(0, END) if self.loading == True: self.loading = False else: self.PARENTLIST.insert(END, "The End") for item in sorted(self.nodes.keys()): node = self.nodes[item] print "=>", node self.PARENTLIST.insert(END, node[0]) self.counter = len(self.nodes.keys()) def newnode(self): self.save() self.DATAFIELD.delete(0.0, END) self.NAMEFIELD.delete(0.0, END) def loadnode(self, event): selected = self.PARENTLIST.curselection() print selected if selected == (): selected=0 else: selected = selected[0] key = self.nodes.keys()[int(selected)-1] #I think this is the only place this is needed node = self.nodes.get(key) self.NAMEFIELD.delete(0.0, END) self.NAMEFIELD.insert(0.0, node[0]) self.DATAFIELD.delete(0.0, END) self.DATAFIELD.insert(0.0, node[1]) self.editing = key self.PARENTLIST.select_clear(selected) for i in node[2]: self.PARENTLIST.select_set(i) def save(self): nodetitle = self.NAMEFIELD.get(0.0, END).strip() nodetext = self.DATAFIELD.get(0.0, END).strip() selected = self.PARENTLIST.curselection() print selected if selected == (): selected=0 if self.editing != None: key = self.editing self.editing = None else: self.PARENTLIST.insert(END, nodetitle) self.counter = self.counter + 1 key = self.counter self.nodes[key] = (nodetitle, nodetext, selected) def filecmd(self): filename = asksaveasfilename() if filename: f = open(filename, 'w') pickle.dump(self.nodes, f) f.close() def fileopen(self): filename = askopenfilename() if filename: self.loadfile(filename) def loadfile(self, filename): f = open(filename) self.nodes = pickle.load(f) f.close() self.populatefields() def quitapp(self): print "nodes: " + str(self.nodes) self.quit() root = Tk() root.title("Script Builder") gui = CYOAGUI() gui.mainloop()