From 1868150e731f8fcb5ccb1e557c59da41ab957ac0 Mon Sep 17 00:00:00 2001 From: spinel Date: Sat, 18 Feb 2023 21:15:31 +0100 Subject: [PATCH] implement teams and terrains --- __pycache__/scenario.cpython-310.pyc | Bin 597 -> 597 bytes __pycache__/team.cpython-310.pyc | Bin 2292 -> 3852 bytes __pycache__/terrain.cpython-310.pyc | Bin 602 -> 2347 bytes data/team.json | 2 +- data/terrain.json | 1 + main.py | 3 +- team.py | 151 +++++++++++++++++++-------- terrain.py | 68 +++++++++++- 8 files changed, 176 insertions(+), 49 deletions(-) create mode 100644 data/terrain.json diff --git a/__pycache__/scenario.cpython-310.pyc b/__pycache__/scenario.cpython-310.pyc index 3462f5dba3204a0c917be2e84c51a0c3ad2a6304..d5aad0f69dd99c5677b69dfae218addea7eead9a 100644 GIT binary patch delta 20 acmcc0a+QTUpO=@50SLYteB8+G#RLF3O$BcN delta 20 acmcc0a+QTUpO=@50SM|6-frafVgdj+7zHE% diff --git a/__pycache__/team.cpython-310.pyc b/__pycache__/team.cpython-310.pyc index c20093bd9a8ed8ede4a921443936e8c8a3a657bf..f24e88513469f3069650e7df8cf7b7cb9945f70c 100644 GIT binary patch literal 3852 zcmaJ^TW=f36`q;BaCsFaE3p*2PMY4prk2{YjZsxm<2Z>EG*Qzk2vPw7vEr;{u9jS8 zb|qOX_2d9iAM_9MuzV??zcjCT(qmo&wCHzcNJ^B8E-^D_?&tcQVOp)i zGWH#Hu755%@1SH`s3em-VY{~FyWI4}u7g%2qUY|qoJnWbd(5OOy|0<{A}98rJG&*x zcUa56#2IY6#kG^?2g8O8^Kd~UjGC-@1SHKqly?^w<{!<;%kO09qFRQ zHPT1x$&w7v`m!u5XiKsxYiI*mmkqRKxgeWpD{>KxEa~!RxHkJV+>bgAPM>~6dnk`k zvY0cLvzQlR#72B9AR8O8wv)5M9TVlvD1Szk_Gu=_%W(y}SnNrDj{WWGh!wRl<1|){ z>r&tc5zZYuQZ%H8nFYEfZ-QEU&ZU1K)Q7abSdyiEKIWKX@vRY)0Y;Z)`P{)tm8+95 z`x0g$`nfQ7K=^Yyk;N|?ZhYbfGYe453+u#2@RJufd|L5pL z2SgAHx=PgKBHNkVrHBU&9;~ROq_AfNPL(bvX(&I#NT%I=)s@=a>-MFtXHov}>S`y6 z`r4z7nf9_g%p>i;dzj~GUspQNRc<--J`VSyM0@X(w0eQoPndX2M+X_irMqAeH;a-d z+8=}}>gPBl#g;TlB6Y#kn_&2dKdnDad(nC}==P&z{nNv}q}y4~LKQw;m(fv_q=O!I zu7_!MoT@}-_XlB@)MFuGaH3Xm3fUn0C8`GZc|}xs1?`duP@23U8vLGE5qJ3tr&8lh z{+bvr8EsH-uT9O+A*YyrM3bFOly87AaZQnlSf9kGQ@GMZ97eq)P!1@M}vK>;;BT)q}ji6Snd27T+!n7>*NBnJjerY5K!AFGi{zyRm$P&_l z%KedFRPt(3qnWYwI=`q}PqeofMZ4STci@&{uTOvh95bk-OFaupnjg0s>Mqu3XCDqn zu6N~iij-!p^A=HWQ}stw+B;U=JW`b6wI>gIgG@aH-6~lNI53BLpH_cB)ni%)Bn^A& zJ?h^u%^Jr3fRgY!eYHgy4ev|8DvL92l`ImS8Zr^0j!K;!B5|clymaa*R>v ziIHuLw%5=jYnhQ%%(ach3eq!NdKGSLa;!fYab_dPfM$IO5e;{@5sh8tqB8BZJgf5? z;N03!06lPb{6XD0WBe9P`^htb!ra)2)w+Zx}Rai-%yNKH~5nI)e!Ry zF}!`{)pN)`=h>tw@@_)6tO1-m<5n*SUr{(`@U1i6Hls1{jb0A)K9KGy#$)e2_T__r zvfPhLwC@b>w^b&6WPew>@NKj9+H7ey%dgD_v{we-uy6PiVV+}wtm38O%Gz`lTK55> z?W+}l4ZsCFRc2HbH`L7iJg&(43%5__s*|}F?`~js{pOt}f)=*bEvQB_pYHj0lE%0 zld!iZ!>uQD7}=}BhWD>*`$A$^+f33`q0wKrK>5@csjT13`ZulrG6ALlQnQ z4+gbDD}F*1EvfWC{A{W>4s`9E^c`88>OhS=|-GmZB-#J1>r zXM)ssDELzyCR_XA09i{K!CH>BsDVS; zb2El_F*ZQS$e#%Ont(q7zTiJK?|Kx^>GK7=BZ(i;F=Rz6E&hWTB(rZ6l0p3ylim$zG0dd^bDq33M7-AmnfHp#Gn57t0h&cXQj4N{ukrFGb&boAwDjc8C?*3I@Zerh#&0#K2DfTeMe}%N uQG!w%sPKF~==PDatXESQnM`JVo>u>_YY=>v_bni!eNvgbpa56AEdC2t`(w`l literal 2292 zcmaJ?%WfP+6s=eH^gKKS6M{iJA_xf$BqJn1BC;HdD6jyHA{num%}|~y+db}{9;$2n z81+aG}fUMKY>w1(UkP6FYQs^W<3sHma?J8dgzWyfln-5VD9Xn;S@9|jfN z+(RhE=U@^tBbE&5oLRb{X2o(#6+L1zYQ;P#={#JJ1)UM7)fR-3lE8wj>!^t%$MV97 zv9vob)CWmnp_PyI$O&B61!*o7xQv#{1%os%bj)0U8w2lFlIl}p+OUVeA9Qx|Om~WL zGSX@1@nkbi2Ax70xzka4PpA1f(<9rFd9k0HR26r}GBL?$y9#oA=<2xC4>)mzfwjO0 z+M*5GrV$m?Tm#1dV?Tcas9^CptU<++BQj$p#Hr|SY{pAoLTi;+YMEkyhbYCIdra5@ zkOCwGVgpBqi103iCPp&Tt~SUgBWn&F-H&U2Wdjr;2A6ZezDcY$xJwtPNj5G_6Y6nb zUd2AkXmIyVAWUWn+Xzu*Uco<6A@?-Kia`}|m;96PiLhQAJ_ zxDG}WL$5VQVFyM+M32w#IzpuV4yIh_9jBz8)1y?U{e?|)<>l4~E~ym$%?GQD*H^u2yR86~#gzqgv^1DO_UP^kt$6hMOmiTSQN&O(irUPqKA35nQ!I?PNX1ECwBEAh;Q2@%JCGW z8WdJq0PpLGwfQIxohWp=<-)NvAUSgjCaDNnvk>if`Vdi<*@jN_z~*Ohet^A@oaR$7 z??CaqY}1fMYz0Kvg7-F?E?NXKIe{Kq^RnD^mlcYrgUKQB=Kckup)`ee=* z9%2*i8qC4EYf;3yQ7%|&0> z;|Uu!RDkz_mkt?XZ@4qA_?s|y^n^U2TTIne1H{uj;b$qT)tv@ifcbt*%^e5?K5xQj z3Ka4A>b_TriNR+OP$xDZ(Odx%!SM>gTxAIaN*5R+*dw+<%uR5|%%>p7x3#Ur!CVt* zbGDR=uz{O-t`qYi48%lpe^g>_-UjMpdxfshciHsymqz2!GGF0r&$IkNc(4(HI3NlEQAE*l>qh%u&?Nqc diff --git a/__pycache__/terrain.cpython-310.pyc b/__pycache__/terrain.cpython-310.pyc index d7cc3ed800f49bf41be1c7539f58f4bff2b4ccdd..f5a8d2673572ad280927c48740641dde0826ba3d 100644 GIT binary patch literal 2347 zcmZuy%WoS+7@wJac|)@%tWIEG{+}o?jmQnfwzm_6Kb) zKR!0w808iw$t2I%?qub=-0j7#hgD>v@9+AYNpCm!fk|HmubB*#*9%X*-J0Y(tR0?1 z2J5uB^^7?fUX!tjH;mFcPVmMvWQaA8 zH5p+IWnDI~*5m?oHf{6giH7oNysr`uf@TlV0mc)I@-Iw=_4r6stm0zb(Ui@WQ$?Z*nqf$^e{2l4@F@mQJ}04}{*P z`=e!9+vj5r9_wAJn1t-!imab`kkoi13Eb=8F39GYa5@%c>x?9_-VJ9>NY;R}Bo}Ae zrxKSTadj$jNnV?LCmHZrp>Q;fdTEYgoyL2aI_E&b3U%D}Y?u_;VL!K?E{<(jnlw2$ z8Q$33d{XrHioN3Hj>=SGl-%0V?yE?vSQdG9GF<4WZDD=VU~5Uy@5i}3r>q(V zow%>QXmh=Q-8luLEp!cwMk2CvioNxB;v;n)67QxJ=D-HuYkXy+Za2+S)9u>DI5Fvw znyRw(9i!8H|5>bUW13n&suQ~~rAeiBlB1aqc4^9+I8$ib%!*h}1(w#|*QvDrUYbk0 zTq^U;oIWp8xs9e0N*k0WHp+&N4~;2uyO;nFb75TYQ@p1#8+?}=4Vy~%HdO(rO8Ga>-fcnR7WZ+27P?F z5f|lgp)*-N7{n=IaZzG}6MX}M>KNrcOf4SrhG_5=5n(LzmT2+&VoluR>teV%1Axlr z;SBDC!aRG3rm(sCSqI@NhH3y+G_3}2oq#{05kI9eY!@jPo|HEdI!@wMoBpV^Z7C#-kCFX4)QsBDejbc&faGrQrOyM`_5v? zH<=MV*lWBo*KeD^cv75-SKNf7TE$1vn2kBz2VE!cOaq>>(ZZOW;=IR6g7ebr*zhRM z4pnKnZa4KhR88C!1@dVSn-?}zFVoUsR}7FqK6O7EP~PE)ipT~@R+P&68LnCXK%JDR z4noBG&r@W@6pl?OR~B>*&9sPq7?U-_fR z)JFuRKX!?N6F^FhbE<*bl;6=G!y@bFRQ>!IsNSNzx37%L8BG98kbX!M{V?<=bR{^} zsZshfN6W+hpwyp(MjARaJwU5BiCM!f`W5LfvAc@zdpIM(u5cQ_HbT+(!vA;Kj|gkg z5G$Oh;o2P9muftr{F^;&>(+5Yj12HN6<+W(DEOk zuq{{e?lXj$e>+#NeejeNP^&Y{v`Sn&k`~il4q~jLk3mCb}%gVF#RTiL_Uxq0}AYpAd@F%?4L^KgfjkEjAX^J zaT#fyTpVEf?+Ag6=>waQ8GU3lReXlNfZelk2B-(wJ?;ZR-Ok{8Z6K%L-ovyoGf^O$+5f5(+ZIB7!c zRn`P&wU+LQxR0p%Z@)OVwJdz2jMT;Pro@WP4n0_3ICwyBX>2PP)?aq z5f%g3Y5uwoD3q@36Kv2g?0Ty`o}Hz+0S*qG8gz_Kdu3T$nCP_bm*t;{(2GBFy}7#< xd_rlLUM9_Veo&Y6>3j!OSHp!e$n?j+{B&8DL}K^H;@I6Z)pw=O>_4imj$!}+ diff --git a/data/team.json b/data/team.json index e7c58f5..86ac027 100644 --- a/data/team.json +++ b/data/team.json @@ -1 +1 @@ -{"s": {"name": "s", "country": "s"}, "df": {"name": "df", "country": "fa"}, "dfdsfaf": {"name": "dfdsfaf", "country": "fa"}, "aaaaa": {"name": "aaaaa", "country": "ssss"}, "": {"name": "", "country": ""}} \ No newline at end of file +{"dfd": {"name": "dfd", "country": "fa", "members": []}, "dfaaa": {"name": "dfaaa", "country": "fa", "members": [{"name": "d", "army": "a"}, {"name": "fds", "army": "adfs"}]}, "Daniel": {"name": "Daniel", "country": "Austria", "members": []}, "Sarah": {"name": "Sarah", "country": "s", "members": []}, "dfg": {"name": "dfg", "country": "fdsa", "members": []}, "Test": {"name": "Test", "country": "asd", "members": []}} \ No newline at end of file diff --git a/data/terrain.json b/data/terrain.json new file mode 100644 index 0000000..ed5bf08 --- /dev/null +++ b/data/terrain.json @@ -0,0 +1 @@ +{"fgddgfd": {"name": "fgddgfd"}} \ No newline at end of file diff --git a/main.py b/main.py index e252b79..e7b8c64 100644 --- a/main.py +++ b/main.py @@ -6,7 +6,6 @@ from tkinter import ttk Screen = ( team.TeamsPage, - team.EditTeamPage, terrain.TerrainsPage, scenario.ScenarioPage ) @@ -17,7 +16,7 @@ class App(tk.Tk): tk.Tk.wm_title(self, "AoS Worlds Pairing Assistant") tk.Tk.option_add(self, "*tearOff", False) - container = ttk.Frame(self)#, padding="100 100 100 100") + container = ttk.Frame(self, padding="100 100") container.pack() container.columnconfigure(0, minsize=500, weight=1) container.rowconfigure(0, minsize=300, weight=1) diff --git a/team.py b/team.py index d6db4fa..5bfda55 100644 --- a/team.py +++ b/team.py @@ -5,60 +5,121 @@ from tkinter import ttk path = "data/team.json" -def loadTeams(): - teams = {} - if os.path.exists(path): - file = open(path, "r") - teams = json.loads(file.read()) - file.close() - return teams - -def saveTeam(name, country): - teams = loadTeams() - team = { - "name": name, - "country": country - } - teams[name] = team - - file = open(path, "w") - file.write(json.dumps(teams)) - file.close() - class TeamsPage(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) + self.activeTeam = None - teams = loadTeams() + self.teamKey = tk.StringVar() + self.teamName = tk.StringVar() + self.teamCountry = tk.StringVar() + self.teamMembers = [] - teamKey = tk.StringVar() - teamSelector = ttk.Combobox(self, textvariable=teamKey, values=list(teams.keys())) - teamSelector.grid(column=1, row=1)#, sticky="ew") - if len(teams) == 0: - teamSelector.state(["readonly"]) + self.teamSelector = ttk.Combobox(self, textvariable=self.teamKey) + self.loadTeams() + + self.teamSelector.grid(column=1, row=1, sticky="ew") + self.teamSelector.bind("<>", self.setActiveTeam) + + if len(self.teams) == 0: + self.teamSelector.state(["readonly"]) - tk.Button(self, text="New Team", command=lambda: controller.showFrame(EditTeamPage)).grid(column=1, row=2)#, sticky="ew") + tk.Button(self, text="New Team", command=self.createTeam).grid(column=4, row=1, sticky="ew") -class EditTeamPage(tk.Frame): - def __init__(self, parent, controller, team=None): - tk.Frame.__init__(self, parent) + tk.Label(self, text="Name:").grid(column=1, row=3) + tk.Entry(self, textvariable=self.teamName).grid(column=2, row=3, sticky="ew") + tk.Label(self, text="Country:").grid(column=1, row=4) + tk.Entry(self, textvariable=self.teamCountry).grid(column=2, row=4, sticky="ew") + tk.Label(self, text="Members:").grid(column=1, row=5) + self.teamMembersGrid = ttk.Frame(self) + self.teamMembersGrid.grid(column=2, row=5) + + tk.Button(self, text="Save", command=self.saveTeam).grid(column=2, row=6) + + def createTeam(self): + self.activeTeam = None + self.teamSelector.selection_clear() + + self.teamName.set("") + self.teamCountry.set("") + self.teamMembers = [] + self.renderTeamMembers() + + def loadTeams(self): + self.teams = {} + self.teamSelector["values"] = [] + if os.path.exists(path): + file = open(path, "r") + self.teams = json.loads(file.read()) + file.close() + self.teamSelector["values"] = list(self.teams.keys()) + + def saveTeam(self): + key = self.teamKey.get() + name = self.teamName.get() + country = self.teamCountry.get() + members = self.teamMembers + + if name != "" and country != "": + self.loadTeams() + team = { + "name": name, + "country": country, + "members": members + } + + if key != "" and key != name: + del self.teams[key] + self.teamKey.set(name) + + self.teams[name] = team + + file = open(path, "w") + file.write(json.dumps(self.teams)) + file.close() + self.loadTeams() + + def setActiveTeam(self, event): + if self.teamKey.get() != "": + self.activeTeam = self.teams[self.teamKey.get()] + self.teamName.set(self.activeTeam["name"]) + self.teamCountry.set(self.activeTeam["country"]) + self.teamMembers = self.activeTeam["members"] + + self.renderTeamMembers() + else: + self.teamSelector.selection_clear() - teamName = tk.StringVar() - teamCountry = tk.StringVar() + def renderTeamMembers(self): + self.teamMembersGrid.destroy() + self.teamMembersGrid = ttk.Frame(self) + self.teamMembersGrid.grid(column=2, row=5) - if (team != None): - teamName.set(team.name) - teamCountry.set(team.value) - - label = tk.Label(parent, text="Name:") - # .grid(column=0, row=1) - label.pack() - entry = tk.Entry(parent, textvariable=teamName) - # .grid(column=0, row=0) - entry.pack() - tk.Label(parent, text="Country:").grid(column=0, row=2) - tk.Entry(parent, textvariable=teamCountry).grid(column=0, row=2) + row = 1 + for m in self.teamMembers: + tk.Label(self.teamMembersGrid, text=m["name"]).grid(column=1, row=row) + tk.Label(self.teamMembersGrid, text=m["army"]).grid(column=2, row=row) + tk.Button(self.teamMembersGrid, text="X", command=lambda: self.removeTeamMember(m)).grid(column=3, row=row) + row += 1 - tk.Button(parent, text="Save", command=lambda: saveTeam(teamName.get(), teamCountry.get()))#.grid(column=2, row=3) + self.newTeamMemberName = tk.StringVar() + self.newTeamMemberArmy = tk.StringVar() + tk.Entry(self.teamMembersGrid, textvariable=self.newTeamMemberName).grid(column=1, row=row) + tk.Entry(self.teamMembersGrid, textvariable=self.newTeamMemberArmy).grid(column=2, row=row) + tk.Button(self.teamMembersGrid, text="+", command=self.addTeamMember).grid(column=3, row=row) + def addTeamMember(self): + name = self.newTeamMemberName.get() + army = self.newTeamMemberArmy.get() + if name != "" and army != "": + self.teamMembers.append({ + "name": name, + "army": army, + }) + + self.renderTeamMembers() + + def removeTeamMember(self, member): + self.teamMembers.remove(member) + self.renderTeamMembers() \ No newline at end of file diff --git a/terrain.py b/terrain.py index 2a85878..d65d46d 100644 --- a/terrain.py +++ b/terrain.py @@ -1,7 +1,73 @@ +import json +import os import tkinter as tk +from tkinter import ttk + +path = "data/terrain.json" class TerrainsPage(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) + self.activeTerrain = None + + self.terrainKey = tk.StringVar() + self.terrainName = tk.StringVar() + + self.terrainSelector = ttk.Combobox(self, textvariable=self.terrainKey) + self.loadTerrains() + + self.terrainSelector.grid(column=1, row=1, sticky="ew") + self.terrainSelector.bind("<>", self.setActiveTerrain) + + if len(self.terrains) == 0: + self.terrainSelector.state(["readonly"]) - tk.Label(self, text="New Terrain").grid(column=1, row=1) \ No newline at end of file + tk.Button(self, text="New Terrain", command=self.createTerrain).grid(column=4, row=1, sticky="ew") + + tk.Label(self, text="Name:").grid(column=1, row=3) + tk.Entry(self, textvariable=self.terrainName).grid(column=2, row=3, sticky="ew") + + tk.Button(self, text="Save", command=self.saveTerrain).grid(column=2, row=6) + + def createTerrain(self): + self.activeTerrain = None + self.terrainSelector.selection_clear() + self.terrainName.set("") + + def loadTerrains(self): + self.terrains = {} + self.terrainSelector["values"] = [] + if os.path.exists(path): + file = open(path, "r") + self.terrains = json.loads(file.read()) + file.close() + self.terrainSelector["values"] = list(self.terrains.keys()) + + def saveTerrain(self): + key = self.terrainKey.get() + name = self.terrainName.get() + + if name != "": + self.loadTerrains() + terrain = { + "name": name + } + + if key != "" and key != name: + del self.terrains[key] + self.terrainKey.set(name) + + self.terrains[name] = terrain + + file = open(path, "w") + file.write(json.dumps(self.terrains)) + file.close() + self.loadTerrains() + + def setActiveTerrain(self, event): + if self.terrainKey.get() != "": + self.activeTerrain = self.terrains[self.terrainKey.get()] + self.terrainName.set(self.activeTerrain["name"]) + + else: + self.terrainSelector.selection_clear() \ No newline at end of file