-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathplanets.py
More file actions
187 lines (157 loc) · 6.77 KB
/
planets.py
File metadata and controls
187 lines (157 loc) · 6.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
# -*- coding: cp1252 -*-
import sys
sys.path.append("bin")
sys.path.append("gui")
sys.path.append("io")
import Tkinter
import tkMessageBox
import urllib
import os
import webbrowser
import sidebar
import graphics
import planet_manager
import io_gui
import controls
import threading
import settings_editor
class PlanetsGUI:
"""Die zentrale Klasse des Programm Planets"""
Separator = "sep"
def __init__(self):
self.Data()
self.CreateWindow()
self.BuildTopMenu()
self.PlanetManager = planet_manager.PlanetManager(self)
self.Graphics = graphics.Graphics(self, self.PlanetManager)
sidebar.Sidebar(self, self.PlanetManager.Simulation, self.ShowMenu)
controls.Controls(self, self.PlanetManager)
self.IO = io_gui.IOGui("plts", self.Window, "Planets-Datei", "example")
self.NewFile()
def Data(self):
"""legt verschiedene Metadaten für das Programm fest"""
self.Title = "Planets"
self.Version = "1.2.1"
self.Author = "Simon Krogmann"
self.Website = "http://planetssoftware.funpic.de/"
# Methoden um GUI zu erstellen
def CreateWindow(self):
"""erstellt das Fenster und legt die Grundeigenschaften fest"""
self.Window = Tkinter.Tk()
self.Window.geometry("900x500")
self.Window.title(self.Title)
self.Window.protocol("WM_DELETE_WINDOW", self.Close)
self.Window.grid_rowconfigure(1, weight = 1, pad = 0)
self.Window.grid_columnconfigure(2, weight = 1, pad = 0)
def BuildTopMenu(self):
"""erstellt das Hauptmenü"""
# Menüvorlage
self.MenuBarTemplate = (("New File", self.NewFile),
("Load", self.Load),
("Save", self.Save),
("Save As", self.SaveAs),
PlanetsGUI.Separator,
("Settings", self.Settings),
PlanetsGUI.Separator,
("Update", self.Update),
("About", self.About),
("Help", self.Help),
PlanetsGUI.Separator,
("Close", self.Close)
)
self.MenuBarDict = {}
# erstellt Menü
self.Menu = Tkinter.Menu(None, tearoff=0, takefocus=0)
self.BuildMenu(self.MenuBarTemplate, self.Menu, self.MenuBarDict)
def BuildMenu(self, MenuTemplate, CurrentMenu, MenuDict):
"""rekursive Funktion um ein Menü aus einer Vorlage zu erstellen"""
for MenuEntry in MenuTemplate:
if MenuEntry == PlanetsGUI.Separator:
# Neuer Trennstrich
CurrentMenu.add_separator()
elif type(MenuEntry[1]) == tuple:
# Neues Untermenü
NewMenu = Tkinter.Menu(CurrentMenu, tearoff = 0)
CurrentMenu.add_cascade(label = MenuEntry[0], menu = NewMenu)
self.BuildMenu(MenuEntry[1], NewMenu, MenuDict)
else:
# Neuer Eintrag
CurrentMenu.add_command(label = MenuEntry[0], command = MenuEntry[1])
# speichert Ort eines Eintrags für spätere Bearbeitung
MenuDict[MenuEntry[0]] = CurrentMenu
# Methoden um GUI zu bearbeiten
def ConfigMenuEntry(self, Label, MenuDict, Enabled = True):
"""aktiviert/deaktiviert einen Menüeintrag eines mit BuildMenu erstellten Menüs"""
Menu = MenuDict[Label]
Index = Menu.index(Label)
if Enabled:
Menu.entryconfig(Index, state = Tkinter.NORMAL)
else:
Menu.entryconfig(Index, state = Tkinter.DISABLED)
# Methoden für Nutzeraktionen
def ShowMenu(self, X, Y):
"""zeigt das Menü an, X und Y müssen als Bildschirmkoordinaten angegeben werden"""
self.Menu.tk_popup(X, Y)
def NewFile(self):
"""lädt eine leere Vorlage in das Programm"""
Obj = self.IO.LoadTemplate("io/empty.plts")
if Obj:
self.PlanetManager.Load(Obj[0])
self.Graphics.Load(Obj[1])
def Load(self):
"""lässt den Benutzer eine Datei zum Laden auswählen"""
Obj = self.IO.Load()
if Obj:
self.PlanetManager.Load(Obj[0])
self.Graphics.Load(Obj[1])
def Save(self):
"""speichert die aktuellen Daten in der aktuellen Datei"""
Obj = self.PlanetManager.Save(), self.Graphics.Save()
self.IO.Save(Obj)
def SaveAs(self):
"""speichert die aktuellen Daten an einem vom Nutzer ausgewählten Ort"""
Obj = self.PlanetManager.Save(), self.Graphics.Save()
self.IO.SaveAt(Obj)
def Settings(self):
"""öffnet das EInstellungsfenster"""
settings_editor.SettingsEditor(self, self.PlanetManager)
def Update(self):
"""ruft die aktuelle Versionsnummer aus dem Internet ab und bietet ein Update an,
wenn eine neue Version vorhanden ist"""
try:
VersionData = urllib.urlopen("{0}version.data".format(self.Website)).read()
except:
tkMessageBox.showinfo("Update", "The update server is currently unavailable.\n\
Check your internet connection or try again later.")
return
NewVersion = VersionData.splitlines()[0]
if NewVersion == self.Version:
tkMessageBox.showinfo("Update", "You are using the newest version of Planets.")
else:
if tkMessageBox.askyesno("Update", "You are using version {0}. \
Do you want to upgrade to version {1}?".format(self.Version, NewVersion)):
VersionFile = file("update/version.data", "w")
VersionFile.write(self.Version)
VersionFile.close()
UpdateData = urllib.urlopen(self.Website + "update/{0}.py".format(NewVersion)).read()
UpdateFile = file("update/update.py", "w")
UpdateFile.write(UpdateData)
UpdateFile.close()
os.system("py update/update.py")
self.Close()
def About(self):
"""zeigt Versionsnummer und Credits an"""
tkMessageBox.showinfo("Version {0}".format(self.Version), "Created by {0}".format(self.Author))
def Help(self):
"""öffnet die Hilfe im Webbrowser"""
os.system("start explorer \"help\help.pdf\"")
def Close(self):
"""schließt das Programm"""
if self.PlanetManager.Simulating:
self.PlanetManager.SetState("stop")
Obj = self.PlanetManager.Save(), self.Graphics.Save()
if self.IO.Close(Obj):
self.Window.after(100, self.Window.destroy)
if __name__ == "__main__":
Program = PlanetsGUI()
Program.Window.mainloop()