Delete __main__.py
old file, will be replaced
This commit is contained in:
parent
f4aa53cc01
commit
87d0d92f4d
455
__main__.py
455
__main__.py
@ -1,455 +0,0 @@
|
|||||||
import tkinter as tk
|
|
||||||
from tkinter import ttk
|
|
||||||
from tkinter import messagebox, font
|
|
||||||
from ttkthemes import ThemedTk
|
|
||||||
from tkinter.scrolledtext import ScrolledText
|
|
||||||
import json
|
|
||||||
import webbrowser
|
|
||||||
from subprocess import Popen, PIPE
|
|
||||||
from pathlib import Path
|
|
||||||
import threading
|
|
||||||
from sys import platform
|
|
||||||
import requests
|
|
||||||
from hashlib import sha256
|
|
||||||
from os import listdir
|
|
||||||
from os.path import isfile, join, exists
|
|
||||||
import shutil
|
|
||||||
|
|
||||||
logarr = []
|
|
||||||
with open('lang.json') as f: lang=json.load(f)
|
|
||||||
|
|
||||||
class menus:
|
|
||||||
def clientmenu(file, mainframe):
|
|
||||||
for child in mainframe.winfo_children(): child.destroy()
|
|
||||||
checkclient = str(helpers.check4client(helpers.getclientpath(file)))
|
|
||||||
clientdetect = ttk.Label(mainframe, text=f"Was Bootstrapper found: {checkclient}", anchor=tk.W)
|
|
||||||
clientdetect.grid(row=0, sticky=tk.W)
|
|
||||||
#not threading this prob stalls the gui, but it's not like the server, where I actually need it to run in the background; in otherwords, I do not care :)
|
|
||||||
dlldownload = ttk.Button(mainframe, text="Download Latest Bootstrapper", command=lambda: helpers.downloadlatestdll(helpers.getclientpath(file)))
|
|
||||||
dlldownload.grid(row=1, sticky=tk.W)
|
|
||||||
|
|
||||||
#menu for pluto scripts; running them is not currently implemented
|
|
||||||
def plutomenu(file, mainframe):
|
|
||||||
for child in mainframe.winfo_children(): child.destroy()
|
|
||||||
openwfpath = helpers.getclientpath(file) + "/OpenWF/scripts/"
|
|
||||||
def openfolder(folder):
|
|
||||||
Popen(['xdg-open', folder])
|
|
||||||
|
|
||||||
onlyfiles = [f for f in listdir(openwfpath) if isfile(join(openwfpath, f))]
|
|
||||||
i = 0
|
|
||||||
for file in onlyfiles:
|
|
||||||
filelabel = ttk.Label(mainframe, text=file, anchor=tk.W)
|
|
||||||
filelabel.grid(row = i, column = 0, sticky = tk.W, pady = 2)
|
|
||||||
plutorun = ttk.Button(mainframe, text="Running not implemented yet", command=lambda: runpluto(file))
|
|
||||||
plutorun.grid(row = i, column = 1, sticky = tk.W, pady = 2, padx=10)
|
|
||||||
i += 1
|
|
||||||
|
|
||||||
# Input would be a json file
|
|
||||||
def settingsmenu(file, mainframe, vcmd):
|
|
||||||
|
|
||||||
for child in mainframe.winfo_children(): child.destroy()
|
|
||||||
if Path(file).is_file():
|
|
||||||
with open(file) as f:
|
|
||||||
settings = json.load(f)
|
|
||||||
i = 0
|
|
||||||
frameunder = ttk.Frame(mainframe)
|
|
||||||
tempsettings = {}
|
|
||||||
print(settings)
|
|
||||||
for key in settings.keys():
|
|
||||||
if key in lang.keys():
|
|
||||||
item = ttk.Label(frameunder, text=(lang[key] + " : "))
|
|
||||||
else:
|
|
||||||
item = ttk.Label(frameunder, text=(key + " : "))
|
|
||||||
item.grid(row = i, column = 0, sticky = tk.W, pady = 2)
|
|
||||||
print (type(settings[key]))
|
|
||||||
if type(settings[key]) is str:
|
|
||||||
value = ttk.Entry(frameunder, width=50)
|
|
||||||
value.insert(0,settings[key])
|
|
||||||
|
|
||||||
elif type(settings[key]) not in [str, bool, int, dict]:
|
|
||||||
value = ttk.Label(frameunder, text="N/A")
|
|
||||||
elif type(settings[key]) is bool:
|
|
||||||
boeol = tk.StringVar()
|
|
||||||
value = ttk.OptionMenu(frameunder, boeol, settings[key], True, False)
|
|
||||||
|
|
||||||
elif type(settings[key]) is int:
|
|
||||||
value = ttk.Entry(frameunder, width=50, validate='key', validatecommand=(vcmd, '%P'))
|
|
||||||
value.insert(0,settings[key])
|
|
||||||
#stupid ass nested dicts eat my whole balls
|
|
||||||
elif type(settings[key]) is dict:
|
|
||||||
value = {}
|
|
||||||
for k in settings[key].keys():
|
|
||||||
value[k] ={}
|
|
||||||
if type(settings[key][k]) is str:
|
|
||||||
value[k]["value"] = ttk.Entry(frameunder, width=50)
|
|
||||||
value[k]["value"].insert(0,settings[key][k])
|
|
||||||
elif type(settings[key][k]) not in [str, bool, int]:
|
|
||||||
value[k]["value"] = ttk.Label(frameunder, text="N/A")
|
|
||||||
elif type(settings[key][k]) is bool:
|
|
||||||
boeol = tk.BooleanVar()
|
|
||||||
value[k]["value"] = ttk.OptionMenu(frameunder, boeol, settings[key][k], True, False)
|
|
||||||
boeol.set(settings[key][k])
|
|
||||||
value[k]["valueop"] = boeol
|
|
||||||
elif type(settings[key][k]) is int:
|
|
||||||
value[k]["value"] = ttk.Entry(frameunder, width=50, validate='key', validatecommand=(vcmd, '%P'))
|
|
||||||
value[k]["value"].insert(0,settings[key][k])
|
|
||||||
value[k]["type"] = type(settings[key][k])
|
|
||||||
|
|
||||||
|
|
||||||
if type(value) is not dict:
|
|
||||||
value.grid(row = i, column = 1, sticky = tk.W, pady = 2)
|
|
||||||
i += 1
|
|
||||||
else:
|
|
||||||
i+=1
|
|
||||||
sp1=ttk.Separator(mainframe,orient='horizontal')
|
|
||||||
sp1.grid(row=i,column=1,sticky='ew')
|
|
||||||
i+=1
|
|
||||||
for k in value.keys():
|
|
||||||
print(k)
|
|
||||||
dictlabel = ttk.Label(frameunder, text=(k + " : "))
|
|
||||||
dictlabel.grid(row = i, column = 0, sticky = tk.E, pady = 2)
|
|
||||||
value[k]["value"].grid(row = i, column = 1, sticky = tk.W, pady = 2)
|
|
||||||
i+=1
|
|
||||||
ttk.Separator(mainframe, orient=tk.HORIZONTAL).grid(row=i)
|
|
||||||
i+=1
|
|
||||||
if type(settings[key]) is bool:
|
|
||||||
tempsettings[key] = {
|
|
||||||
"value" : boeol,
|
|
||||||
"type" : type(settings[key])
|
|
||||||
}
|
|
||||||
else:
|
|
||||||
tempsettings[key] = {
|
|
||||||
"value" : value,
|
|
||||||
"type" : type(settings[key])
|
|
||||||
}
|
|
||||||
|
|
||||||
save = ttk.Button(frameunder, command=lambda: helpers.savefile(file, tempsettings), text="SAVE")
|
|
||||||
save.grid(row=i, column=2, sticky=tk.E, pady=2)
|
|
||||||
frameunder.grid()
|
|
||||||
|
|
||||||
|
|
||||||
def servermenu(mainframe, configfile):
|
|
||||||
for child in mainframe.winfo_children(): child.destroy() #oneline to destroy everything in the main frame
|
|
||||||
side1 = ttk.Frame(mainframe)
|
|
||||||
side2 = ttk.Frame(mainframe)
|
|
||||||
# Side one of the 'server' menu
|
|
||||||
logarea = ScrolledText(side2,
|
|
||||||
wrap = tk.WORD,
|
|
||||||
state="disabled")
|
|
||||||
|
|
||||||
startb = ttk.Button(side1, text="Start Server", command=lambda: [helpers.bgthread(helpers.serverbackground, [helpers.getsnpath(configfile), logarea])])
|
|
||||||
startb.grid(row = 0, column = 0, sticky = tk.W, pady = 2)
|
|
||||||
# Side two of the 'server' menu
|
|
||||||
|
|
||||||
logarea.grid(row = 0, column = 0, sticky = tk.E, pady = 2)
|
|
||||||
|
|
||||||
side1.grid(row = 0, column = 0, sticky = tk.N, pady = 2)
|
|
||||||
side2.grid(row = 0, column = 1, sticky = tk.N, pady = 2)
|
|
||||||
|
|
||||||
class helpers:
|
|
||||||
def downloadlatestdll(filepath):
|
|
||||||
x = requests.get('https://openwf.io/supplementals/client%20drop-in/meta')
|
|
||||||
meta = json.loads(x.text)
|
|
||||||
url = f"https://openwf.io/supplementals/client%20drop-in/{meta['version']}/dwmapi.dll"
|
|
||||||
|
|
||||||
content = requests.get(url, stream=True).content
|
|
||||||
hashofdll = sha256()
|
|
||||||
hashofdll.update(content)
|
|
||||||
|
|
||||||
if hashofdll.hexdigest() == meta['sha256']:
|
|
||||||
with open(filepath + "dwmapi.dll", "wb") as out_file:
|
|
||||||
out_file.write(content)
|
|
||||||
messagebox.showinfo(title="Bootstrapper Downloaded", message="Bootstrapper Downloaded!")
|
|
||||||
else:
|
|
||||||
messagebox.showerror(title="Unknown Error.", message="SpaceninGUI could not verify the hash of the Bootstrapper. Sorry :(")
|
|
||||||
|
|
||||||
def check4client(clientpath):
|
|
||||||
onlyfiles = [f for f in listdir(clientpath) if isfile(join(clientpath, f))]
|
|
||||||
if "dwmapi.dll" in onlyfiles:
|
|
||||||
return True
|
|
||||||
else:
|
|
||||||
return False
|
|
||||||
|
|
||||||
# Not implemented yet lol
|
|
||||||
def runpluto(name):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def is_number(data):
|
|
||||||
"""Validate the contents of an entry widget as a int."""
|
|
||||||
if data == '':
|
|
||||||
return True
|
|
||||||
try:
|
|
||||||
rv = int(data)
|
|
||||||
except ValueError:
|
|
||||||
return False
|
|
||||||
return True
|
|
||||||
|
|
||||||
def savefile(file, save):
|
|
||||||
if Path(file).is_file:
|
|
||||||
with open(file) as f:
|
|
||||||
data = json.load(f)
|
|
||||||
|
|
||||||
for key in save.keys():
|
|
||||||
if save[key]["type"] is bool:
|
|
||||||
if save[key]['value'].get() == '1':
|
|
||||||
data[key] = True
|
|
||||||
else:
|
|
||||||
data[key] = False
|
|
||||||
print(save[key]['value'].get())
|
|
||||||
elif save[key]["type"] is str:
|
|
||||||
data[key] = str(save[key]["value"].get())
|
|
||||||
elif save[key]["type"] is int:
|
|
||||||
data[key] = int(save[key]["value"].get())
|
|
||||||
elif save[key]["type"] is dict:
|
|
||||||
for k in save[key]['value'].keys():
|
|
||||||
if save[key]['value'][k]["type"] is bool:
|
|
||||||
data[key][k] = bool(save[key]['value'][k]["valueop"].get())
|
|
||||||
elif save[key]['value'][k]["type"] is str:
|
|
||||||
data[key][k] = str(save[key]['value'][k]["value"].get())
|
|
||||||
elif save[key]['value'][k]["type"] is int:
|
|
||||||
data[key][k] = int(save[key]['value'][k]["value"].get())
|
|
||||||
|
|
||||||
with open(file, "w") as f:
|
|
||||||
json.dump(data, f, indent=2)
|
|
||||||
|
|
||||||
def getclientpath(file):
|
|
||||||
if Path(file).is_file():
|
|
||||||
with open(file) as f:
|
|
||||||
d = json.load(f)
|
|
||||||
return d["wfpath"]
|
|
||||||
else:
|
|
||||||
return False
|
|
||||||
|
|
||||||
# Grabs the serverpath, returns false if non-existant
|
|
||||||
def getsnpath(file):
|
|
||||||
if Path(file).is_file():
|
|
||||||
with open(file) as f:
|
|
||||||
d = json.load(f)
|
|
||||||
return d["spaceninjapath"]
|
|
||||||
else:
|
|
||||||
return False
|
|
||||||
|
|
||||||
def getlogmax():
|
|
||||||
file = 'sngconfig.json'
|
|
||||||
if Path(file).is_file():
|
|
||||||
with open(file) as f:
|
|
||||||
d = json.load(f)
|
|
||||||
return int(d["maxlogsize"])
|
|
||||||
else:
|
|
||||||
return False
|
|
||||||
|
|
||||||
def bgthread(func, args):
|
|
||||||
th = threading.Thread(target=func, args=args)
|
|
||||||
th.daemon = True
|
|
||||||
th.start()
|
|
||||||
|
|
||||||
def serverbackground(cd, logarea): # To my knowledge, running the server in the main thread would stall the gui, fuck that lol
|
|
||||||
logmax = helpers.getlogmax()
|
|
||||||
|
|
||||||
def mongo():
|
|
||||||
sysctl = Popen(['systemctl', 'start', 'mongodb'])
|
|
||||||
sysctl.wait()
|
|
||||||
|
|
||||||
|
|
||||||
def execute(cd):
|
|
||||||
popen = Popen(['npm', 'run', 'dev'], stdin=PIPE, stdout=PIPE, universal_newlines=True, cwd=cd)
|
|
||||||
for stdout_line in iter(popen.stdout.readline, ""):
|
|
||||||
yield stdout_line
|
|
||||||
popen.stdout.close()
|
|
||||||
return_code = popen.wait()
|
|
||||||
if return_code:
|
|
||||||
raise subprocess.CalledProcessError(return_code)
|
|
||||||
|
|
||||||
if platform == "linux":
|
|
||||||
print("Running on linux requires mongodb to be started!")
|
|
||||||
mongo()
|
|
||||||
|
|
||||||
for path in execute(cd):
|
|
||||||
if len(logarr) < logmax:
|
|
||||||
logarr.append(path)
|
|
||||||
else:
|
|
||||||
logarr.pop(0)
|
|
||||||
logarr.append(path)
|
|
||||||
if logarea:
|
|
||||||
logarea.configure(state="normal")
|
|
||||||
logarea.delete(1.0, "end")
|
|
||||||
for element in logarr:
|
|
||||||
logarea.insert(tk.INSERT, element)
|
|
||||||
logarea.configure(state="disabled")
|
|
||||||
|
|
||||||
def check4sn(configfile):
|
|
||||||
file = helpers.getsnpath(configfile) + "package.json"
|
|
||||||
if Path(file).is_file():
|
|
||||||
with open(file) as f:
|
|
||||||
d = json.load(f)
|
|
||||||
if (d["name"] == "wf-emulator"):
|
|
||||||
return True
|
|
||||||
else:
|
|
||||||
return False
|
|
||||||
|
|
||||||
def on_closing(root):
|
|
||||||
if messagebox.askokcancel("Quit", "Do you want to quit?"):
|
|
||||||
root.destroy()
|
|
||||||
|
|
||||||
class main:
|
|
||||||
def __init__(self, configfile):
|
|
||||||
|
|
||||||
root = ThemedTk(theme='black', themebg=True)
|
|
||||||
root.title('SpaceNinGui Version 1.0')
|
|
||||||
root.minsize(400, 300)
|
|
||||||
serverlogs = tk.StringVar()
|
|
||||||
wfemucheck = str(helpers.check4sn(configfile))
|
|
||||||
menubar = tk.Menu(root)
|
|
||||||
vcmd = root.register(helpers.is_number)
|
|
||||||
filemenu = tk.Menu(menubar, tearoff=0)
|
|
||||||
filemenu.add_command(label="Options", command=lambda: menus.settingsmenu(file = configfile, mainframe=mainframe, vcmd=vcmd))
|
|
||||||
filemenu.add_separator()
|
|
||||||
filemenu.add_command(label="Exit", command=lambda: helpers.on_closing(root))
|
|
||||||
menubar.add_cascade(label="SpaceNinGUI", menu=filemenu)
|
|
||||||
menubar.add_separator()
|
|
||||||
|
|
||||||
menubar.add_command(label="\u22EE", activebackground=menubar.cget("background"))
|
|
||||||
|
|
||||||
menubar.add_command(label="Server", command=lambda: menus.servermenu(mainframe, configfile))
|
|
||||||
menubar.add_command(label="Settings", command=lambda: menus.settingsmenu(file=(helpers.getsnpath(configfile) + "config.json"), mainframe=mainframe, vcmd=vcmd))
|
|
||||||
mainframe = ttk.Frame(root)
|
|
||||||
menubar.add_command(label="\u22EE", activebackground=menubar.cget("background"))
|
|
||||||
menubar.add_command(label="Client", command=lambda: menus.clientmenu(file="sngconfig.json", mainframe=mainframe))
|
|
||||||
menubar.add_command(label="Settings", command=lambda: menus.settingsmenu(file=(helpers.getclientpath(configfile) + "/OpenWF/client_config.json"), mainframe=mainframe, vcmd=vcmd))
|
|
||||||
menubar.add_command(label="Scripts", command=lambda: menus.plutomenu(file="sngconfig.json", mainframe=mainframe))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
checklabel = ttk.Label(mainframe, text=f"Was Spaceninja Found: {wfemucheck}", anchor=tk.W, font=("Arial", 16, "bold"))
|
|
||||||
checklabel.grid(row = 0, column = 0, sticky = tk.W, pady = 2)
|
|
||||||
mainframe.grid(row = 0, column = 0, pady = 2)
|
|
||||||
root.protocol("WM_DELETE_WINDOW", lambda: helpers.on_closing(root))
|
|
||||||
root.config(menu=menubar)
|
|
||||||
root.mainloop()
|
|
||||||
|
|
||||||
class install():
|
|
||||||
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
self.step = 1
|
|
||||||
|
|
||||||
self.config = {}
|
|
||||||
self.elements = {}
|
|
||||||
|
|
||||||
root = ThemedTk(theme='black', themebg=True)
|
|
||||||
self.root = root
|
|
||||||
self.installstep=tk.StringVar()
|
|
||||||
self.installprog=tk.IntVar()
|
|
||||||
self.installprog.set(0)
|
|
||||||
self.installstep.set("Init")
|
|
||||||
#font options lmao
|
|
||||||
standard = ('Noto Sans', 10)
|
|
||||||
standardbold = ('Noto Sans', 10, "bold")
|
|
||||||
self.standard = standard
|
|
||||||
self.standardbold = standardbold
|
|
||||||
|
|
||||||
root.title('SpaceNinGui Installer')
|
|
||||||
root.minsize(400, 300)
|
|
||||||
leftframe = ttk.Frame(root, borderwidth=10)
|
|
||||||
rightframe = ttk.Frame(root, borderwidth=1)
|
|
||||||
steps=["1: Initial Message", "2: Install Spaceninja Server", "3: Install Warframe Bootstrapper", "4: Final Steps"]
|
|
||||||
ttk.Label(leftframe, text="Steps:").grid(padx=20)
|
|
||||||
self.steplabel=[]
|
|
||||||
for step in steps:
|
|
||||||
label=ttk.Label(leftframe, text=step, anchor=tk.W)
|
|
||||||
self.steplabel.append(label)
|
|
||||||
for label in self.steplabel:
|
|
||||||
label.grid(padx=20, pady=5, sticky=tk.W)
|
|
||||||
|
|
||||||
|
|
||||||
self.steplabel[0].config(font=standardbold)
|
|
||||||
rightinnerframe = ttk.Frame(rightframe)
|
|
||||||
ttk.Label(rightinnerframe, text="Welcome to SpaceNinGui! \nFirst, We have to get some inital settings setup. \nWe will start with the server configuration.").grid()
|
|
||||||
leftframe.grid(row=0, column=0, sticky=tk.W)
|
|
||||||
|
|
||||||
rightinnerframe.grid()
|
|
||||||
rightframe.grid(row=0, column=1, sticky=tk.E)
|
|
||||||
nextbutton = ttk.Button(rightframe, text="Next", command=lambda: self.next(rightinnerframe))
|
|
||||||
nextbutton.grid(row=1, sticky=tk.SE)
|
|
||||||
root.protocol("WM_DELETE_WINDOW", lambda: helpers.on_closing(root))
|
|
||||||
root.mainloop()
|
|
||||||
|
|
||||||
def configsave(self):
|
|
||||||
with open('sngconfig.json', 'w') as f:
|
|
||||||
tot = {}
|
|
||||||
tot["spaceninjapath"] = self.elements['serverpath'].get()
|
|
||||||
tot["wfpath"] = self.elements['clientpath'].get()
|
|
||||||
tot['maxlogsize']=10
|
|
||||||
json.dump(tot, f, indent=2)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def install(self, clientpath, serverpath):
|
|
||||||
#first install server
|
|
||||||
self.installstep.set("Downloading Server Through Git")
|
|
||||||
sysctl = Popen(['git', 'clone', 'https://openwf.io/SpaceNinjaServer.git', serverpath])
|
|
||||||
self.installprog.set(1)
|
|
||||||
sysctl.wait()
|
|
||||||
self.installstep.set("Installing Server Requirements (via npm)")
|
|
||||||
self.installprog.set(25)
|
|
||||||
sysctl = Popen(["npm", '--prefix', f'{serverpath}', 'install'])
|
|
||||||
sysctl.wait()
|
|
||||||
self.installstep.set("Copying Config File")
|
|
||||||
shutil.copy(serverpath + "/config.json.example", serverpath + "/config.json")
|
|
||||||
self.installstep.set("Starting Bootstrapper Download")
|
|
||||||
self.installprog.set(50)
|
|
||||||
print("Server install worked. ")
|
|
||||||
helpers.downloadlatestdll(clientpath)
|
|
||||||
self.installprog.set(99)
|
|
||||||
self.installstep.set("Install Complete!\nPress next then restart to get started!")
|
|
||||||
|
|
||||||
|
|
||||||
def next(self, inner):
|
|
||||||
if self.step == 1:
|
|
||||||
self.step+=1
|
|
||||||
for child in inner.winfo_children(): child.destroy()
|
|
||||||
self.elements["serverpath"] = tk.StringVar()
|
|
||||||
path = ttk.Entry(inner, width=50, textvariable=self.elements["serverpath"])
|
|
||||||
flavortext = ttk.Label(inner, text="Please input a path that you would like to install the Server in!")
|
|
||||||
flavortext.grid(padx=10)
|
|
||||||
path.grid(padx=10)
|
|
||||||
self.steplabel[0].config(font=self.standard)
|
|
||||||
self.steplabel[1].config(font=self.standardbold)
|
|
||||||
elif self.step == 2:
|
|
||||||
self.step+=1
|
|
||||||
self.elements["clientpath"] = tk.StringVar()
|
|
||||||
for child in inner.winfo_children(): child.destroy()
|
|
||||||
path = ttk.Entry(inner, width=50, textvariable=self.elements["clientpath"])
|
|
||||||
flavortext = ttk.Label(inner, text="Please input the path that has Warframe installed\nI highly suggest making a copy to prevent potental bans.", anchor=tk.CENTER)
|
|
||||||
flavortext.grid(padx=10, pady=5)
|
|
||||||
path.grid(padx=10)
|
|
||||||
self.elements["wfpath"] = path
|
|
||||||
self.steplabel[1].config(font=self.standard)
|
|
||||||
self.steplabel[2].config(font=self.standardbold)
|
|
||||||
elif self.step == 3:
|
|
||||||
self.step+= 1
|
|
||||||
print("final step!!!")
|
|
||||||
for child in inner.winfo_children(): child.destroy()
|
|
||||||
flavortext = ttk.Label(inner, text="Thank you! The OpenWF setup should be downloading in the background!", anchor=tk.CENTER)
|
|
||||||
flavortext.grid(padx=10, pady=5)
|
|
||||||
statustext = ttk.Label(inner, textvariable=self.installstep, anchor=tk.CENTER)
|
|
||||||
statustext.grid(padx=10, pady=5)
|
|
||||||
statusbar = ttk.Progressbar(inner, variable=self.installprog)
|
|
||||||
statusbar.grid()
|
|
||||||
helpers.bgthread(self.install, [self.elements["clientpath"].get(), self.elements["serverpath"].get()])
|
|
||||||
elif self.step == 4:
|
|
||||||
if self.installstep.get() == "Install Complete!\nPress next then restart to get started!":
|
|
||||||
self.configsave()
|
|
||||||
self.root.destroy()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
if isfile('sngconfig.json'):
|
|
||||||
main('sngconfig.json')
|
|
||||||
else:
|
|
||||||
install()
|
|
Loading…
x
Reference in New Issue
Block a user