(30-06-2023, 01:18 PM)Neowise Wrote:main.pyShow Content
from tkinter import *
from tkinter import filedialog, messagebox, ttk
import xml.etree.ElementTree as ET
gt= {'Sheep':1,'PeehsDM':2, 'PeehsFB':3, 'PeehsHybrid':4, 'Heep':5, 'Heep15':6, 'Heep2':7, 'Kangaroo':8, 'Manual':9}
gtl=['filler','Sheep','PeehsDM','PeehsFB','PeehsHybrid','Heep','Heep15','Heep2','Kangaroo','Manual']
rt= {'None':0,'Up':1,'Down':2,'Nearest':3}
rtl=['None','Up','Down','Nearest']
def resetProgram():
global myTextbox1, myLabel2, myQuestions, myAnswers, myPlayers, curQ
myQuestions = []
myAnswers = []
myPlayers = []
curQ = 1
myTextbox1.delete(0, END)
myTextbox1.insert(INSERT, curQ)
myTextbox1.grid_forget()
myTextbox1.grid(row=0, column=2)
myLabel2.grid_forget()
myLabel2 = Label(window, text="Click Sheep > Edit Questions... to begin.")
myLabel2.grid(row=0, column=4)
return
def edQL(edQText):
edQL.filename = filedialog.askopenfilename(title="Load Questions from File", filetypes=[("txt files", "*.txt")] )
#print(edQL.filename) #debug code
file1 = open(edQL.filename, 'r')
strvar=file1.read()
edQText.delete(1.0,END)
edQText.insert(INSERT, strvar)
return(edQText)
def edSave(edQW,edQText):
global myQuestions
global myLabel2
global curQ
myQuestions = edQText.get("1.0",END).splitlines()
window.deiconify()
if curQ==0:curQ=1
if curQ>len(myQuestions): curQ=len(myQuestions)
myTextbox1.delete(0, END)
myTextbox1.insert(INSERT, curQ)
myTextbox1.grid_forget()
myTextbox1.grid(row=0, column=2)
if len(myQuestions) >= curQ:
myLabel2.grid_forget()
myLabel2 = Label(window, text=myQuestions[curQ - 1])
myLabel2.grid(row=0, column=4)
edQW.destroy()
def edPCancel(edAW,object):
edAW.deiconify()
object.destroy()
def newPlayer(edAW):
global myPlayers
edAW.withdraw()
newPW = Toplevel(edAW)
newPW.title("New Player")
newPLabel = Label(newPW, text="Enter new player name:").grid(row=0,column=0)
newPEntry = Entry(newPW).grid(row=1,column=0)
newPOK = Button(newPW, text='OK').grid(row=2,column=3)
newPCancel = Button(newPW,text='Cancel', command=lambda:edPCancel(edAW,newPW)).grid(row=2,column=4)
def edAnswers(window):
window.withdraw()
myfile="\n".join(item for item in myAnswers)
edAW = Toplevel(window)
edAW.title("Edit Entries")
edALabel = Label(edAW, text="Player:")
edALabel.grid(row=0,column=0)
combo = ttk.Combobox(edAW,state="readonly",values=["Python", "C", "C++", "Java"])
combo.grid(row=0,column=1)
spacer=Label(edAW).grid(row=0,column=2)
edALabel = Label(edAW, text="Starting Score:", padx=10)
edALabel.grid(row=1,column=0)
edAText = Text(edAW)
edAText.insert(INSERT, 'Click Load... to load players and answers\nfrom a PM text file, or click New Player\nto add players manually.')
edAText.grid(column=0,columnspan=3, rowspan=10, padx=5, pady=5)
edALoad = Button(edAW,text="Load", padx=20, command=lambda:edQL(edAText)).grid(row=0, column=3, padx=10,pady=5)
edANP = Button(edAW, text="New Player", padx=4,command=lambda:newPlayer(edAW)).grid(row=1, column=3, padx=10,pady=5)
edACN = Button(edAW, text="Change Name", padx=0).grid(row=2 ,column=3, padx=10,pady=5)
edADP = Button(edAW, text="Delete Player", padx=0).grid(row=3, column=3, padx=10,pady=5)
edASave = Button(edAW,text="Save Changes",command=lambda:edSave(edAW,edAText)).grid(row=9, column=3,padx=10, pady=5)
edACancel = Button(edAW,text="Cancel", padx=20,command=lambda:edCancel(edAW)).grid(row=10, column=3, padx=10, pady=5)
edAW.rowconfigure(4, weight=1)
edAW.columnconfigure(2, weight=1)
return
def edQuestions(window):
window.withdraw()
myfile="\n".join(item for item in myQuestions)
edQW = Toplevel(window)
edQW.title("Edit Questions")
edQLabel = Label(edQW, text="Click Load... to load the questions from a text file, or just type them in here one per line")
edQLabel.grid(row=0,columnspan=2)
edQText = Text(edQW)
edQText.insert(INSERT,myfile)
edQText.grid(column=0, rowspan=10, padx=5, pady=5)
edQLoad = Button(edQW,text="Load", padx=20, command=lambda:edQL(edQText)).grid(row=1, column=1)
edQSave = Button(edQW,text="Save Changes",command=lambda:edSave(edQW,edQText)).grid(row=9, column=1)
edQCancel = Button(edQW,text="Cancel", padx=20,command=lambda:edCancel(edQW)).grid(row=10, column=1)
return
def validate_entry(text):
return text.isdecimal()
myQuestions = []
myAnswers = []
myPlayers = []
curQ=1
window = Tk()
window.geometry("680x450")
window.title("Sheep Score Foggies Edition")
Outputtype = IntVar()
Outputtype.set(1)
Gametype = IntVar()
Gametype.set(1)
Roundtype = IntVar()
Roundtype.set(0)
menubar = Menu(window)
window.config(menu=menubar)
fileMenu=Menu(menubar,tearoff=0)
menubar.add_cascade(label="File",menu=fileMenu)
def dothis():
global myQuestions
print(myQuestions)
print(myAnswers)
print(myPlayers)
print(gtl[Gametype.get()])
print(rtl[Roundtype.get()])
def loadReveal():
global myQuestions, myLabel2, myPlayers, Gametype, Roundtype
filename = filedialog.askopenfilename(title="Load Sheep Scoring File", filetypes=[("Sheep Score 2017 File", "*.sheep17")])
tree = ET.parse(filename)
root = tree.getroot()
print(root.tag)
if root.tag == "SheepScore2012Game":
myQuestions = []
for child in root:
if child.tag == "Question":
myQuestions.append(child.text)
elif child.tag == "Player":
myPlayers.append([child.text,child.attrib['StartScore']])
elif child.tag == "ScoringMethod":
Gametype.set(gt[child.text])
elif child.tag == "Rounding":
Roundtype.set(rt[child.text])
elif child.tag == "Group":
pass # To do
if len(myQuestions) >= curQ:
myLabel2.grid_forget()
myLabel2 = Label(window, text=myQuestions[curQ - 1])
myLabel2.grid(row=0, column=4)
else:
qdown()
else:
messagebox.showinfo(title="Greetings", message="This is not a recognized sheep file!")
fileMenu.add_command(label="New Reveal", command=resetProgram)
fileMenu.add_command(label="Load Reveal...", command=loadReveal)
fileMenu.add_command(label="Save Reveal...")
fileMenu.add_command(label="Debug", command=dothis)
fileMenu.add_separator()
fileMenu.add_command(label="Exit",command=quit)
sheepMenu = Menu(menubar,tearoff=0)
menubar.add_cascade(label="Sheep",menu=sheepMenu)
sheepMenu.add_command(label="Edit Questions...", command=lambda:edQuestions(window))
sheepMenu.add_command(label="Edit Entries...", command=lambda:edAnswers(window))
scoringMenu=Menu(menubar,tearoff=0)
sheepMenu.add_cascade(label="Scoring",menu=scoringMenu)
scoringMenu.add_radiobutton(label="Sheep",value=1, variable=Gametype)
peehsMenu=Menu(menubar,tearoff=0)
scoringMenu.add_cascade(label="Peehs",menu=peehsMenu)
peehsMenu.add_radiobutton(label="DM Scoring",value=2, variable=Gametype)
peehsMenu.add_radiobutton(label="FB Scoring",value=3, variable=Gametype)
peehsMenu.add_radiobutton(label="Hybrid",value=4, variable=Gametype)
heepsMenu=Menu(menubar,tearoff=0)
scoringMenu.add_cascade(label="Heeps",menu=heepsMenu)
heepsMenu.add_radiobutton(label="2x Heep Bonus",value=7, variable=Gametype)
heepsMenu.add_radiobutton(label="1.5x Heep Bonus",value=6, variable=Gametype)
heepsMenu.add_radiobutton(label="No Heep Bonus",value=5, variable=Gametype)
scoringMenu.add_radiobutton(label="Kangaroo",value=8, variable=Gametype)
scoringMenu.add_radiobutton(label="Manual",value=9, variable=Gametype)
scoringMenu.add_separator()
roundingMenu=Menu(menubar,tearoff=0)
scoringMenu.add_cascade(label="Rounding",menu=roundingMenu)
roundingMenu.add_radiobutton(label="No Rounding",value=0, variable=Roundtype)
roundingMenu.add_radiobutton(label="Round Up",value=1, variable=Roundtype)
roundingMenu.add_radiobutton(label="Round Down",value=2, variable=Roundtype)
roundingMenu.add_radiobutton(label="Round Nearest",value=3, variable=Roundtype)
outputMenu=Menu(menubar,tearoff=0)
menubar.add_cascade(label="Output",menu=outputMenu)
outputMenu.add_command(label="Copy answers for this question")
outputMenu.add_command(label="Copy total scores up to this question")
outputMenu.add_command(label="Copy score table up to this question")
outputMenu.add_command(label="Copy Player list")
outputMenu.add_separator()
styleMenu=Menu(menubar,tearoff=0)
outputMenu.add_cascade(label="Output Style",menu=styleMenu)
styleMenu.add_radiobutton(label="Forum Table",value=1, variable=Outputtype)
styleMenu.add_radiobutton(label="Forum Formatted Text",value=2, variable=Outputtype)
styleMenu.add_radiobutton(label="Unformatted Text",value=3, variable=Outputtype)
def qdown():
global curQ
global myLabel2
if curQ>len(myQuestions): curQ = len(myQuestions)
if curQ>1:
curQ=curQ-1
myTextbox1.delete(0, END)
myTextbox1.insert(INSERT, curQ)
myTextbox1.grid_forget()
myTextbox1.grid(row=0, column=2)
if curQ == 0: return
if len(myQuestions) >= curQ:
myLabel2.grid_forget()
myLabel2 = Label(window, text=myQuestions[curQ-1])
myLabel2.grid(row=0, column=4)
def qup():
global curQ
global myLabel2
if curQ > len(myQuestions): curQ = len(myQuestions)
if curQ < len(myQuestions):
curQ = curQ + 1
else:
curQ == 1
myTextbox1.delete(0,END)
myTextbox1.insert(INSERT, curQ)
myTextbox1.grid_forget()
myTextbox1.grid(row=0, column=2)
if curQ == 0: return
if len(myQuestions) >= curQ:
myLabel2.grid_forget()
myLabel2 = Label(window, text=myQuestions[curQ-1])
myLabel2.grid(row=0, column=4)
qButton1 = Button(window, text="<",command=qdown).grid(row=0,column=1)
qButton2 = Button(window, text=">",command=qup).grid(row=0,column=3)
myLabel1 = Label(window, text="Q #", padx=5).grid(row=0,column=0)
myLabel2 = Label(window, text="Click Sheep > Edit Questions... to begin.")
myLabel2.grid(row=0,column=4)
myTextbox1 = Entry(window,width=4 ,validate="key",
validatecommand=(window.register(validate_entry), "%S"))
myTextbox1.insert(INSERT,curQ)
myTextbox1.grid(row=0,column=2)
myTextbox2 = Text(window,state=DISABLED,padx=10,pady=5)
myTextbox2.grid(row=1,column=0,columnspan=5)
window.columnconfigure(4, weight=1)
window.mainloop()
Nice, I was looking at pygame recently, looks like a handy enough library.