diff --git a/.idea/JDE.iml b/.idea/JDE.iml new file mode 100644 index 0000000..6711606 --- /dev/null +++ b/.idea/JDE.iml @@ -0,0 +1,11 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..fa16f6a --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + Python + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..73e5ee5 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/JDE/Images/background.png b/JDE/Images/background.png new file mode 100644 index 0000000..da1809d Binary files /dev/null and b/JDE/Images/background.png differ diff --git a/JDE/Images/file.png b/JDE/Images/file.png new file mode 100644 index 0000000..317cd87 Binary files /dev/null and b/JDE/Images/file.png differ diff --git a/JDE/Images/start.png b/JDE/Images/start.png new file mode 100644 index 0000000..164d5ca Binary files /dev/null and b/JDE/Images/start.png differ diff --git a/JDE/Interfaces/desktop.py b/JDE/Interfaces/desktop.py new file mode 100644 index 0000000..3654b22 --- /dev/null +++ b/JDE/Interfaces/desktop.py @@ -0,0 +1,291 @@ +import logging +import os +import time +import webbrowser +from tkinter import * + +from JDE.Interfaces import start +from Programs import jpad + +desktopLog = logging.getLogger("desktop.py") + +desktopLog.debug("Atempting to read settings file") +try: + config = {} + exec(open("JDE/Settings/settings.conf").read(), config) + desktopLog.debug("System settings Detected!") +except Exception as e: + desktopLog.error(str(e)) + + +class desktop: + def box(self, event): + desktopLog.debug("Running box") + try: + if (self.clicked == False): + self.searchvar.set("") + self.search.config(fg="black") + self.clicked = True + except Exception as e: + desktopLog.error(str(e)) + + def search_internet(self, event): + desktopLog.debug("Running search_internet") + # TODO: Find a way to implement a browser + try: + webbrowser.open_new_tab("https://www.google.co.uk/#q=" + self.searchvar.get().replace(" ", "+")) + except Exception as e: + desktopLog.error(str(e)) + + def reposition(self, event): + desktopLog.debug("Running reposition") + try: + self.cHeight = self.window.winfo_height() + self.cWidth = self.window.winfo_width() + + self.centerWidth = self.window.winfo_x() + int(int(self.cWidth) / 2) + self.centerHeight = self.window.winfo_y() + int(int(self.cHeight) / 2) + + self.screenCenter = str(self.centerWidth) + "+" + str(self.centerHeight) + + # self.startPic.place_configure(x=int(0), y=int(self.cHeight) - 55) + + self.search.place_configure(x=57, y=int(self.cHeight) - 55, height=55, width=200) + + # versionText.place(x=int(cWidth) - 300, y=int(cHeight) - 120) + + self.toolbar.place_configure(x=258, y=int(self.cHeight) - 55, height=55, width=int(self.cWidth)) + + self.notifcationBar.place_configure(x=int(self.cWidth) - 500, y=int(self.cHeight) - 55, height=55, + width=500) + + self.windowX = self.window.winfo_x() + self.windowY = (self.window.winfo_y() + self.window.winfo_height()) + + # displayTime.pack_configure(side=RIGHT) + except Exception as e: + desktopLog.error(str(e)) + + def fullScreen(self, event): + desktopLog.debug("Running fullscreen") + try: + if self.max == 0: + self.window.attributes('-fullscreen', True) + self.max = 1 + else: + self.window.attributes('-fullscreen', False) + self.max = 0 + except Exception as e: + desktopLog.error(str(e)) + + def clockTick(self): + desktopLog.debug("Running clockTick") + try: + self.desktopRefresh() + # cTime = time.strftime("%H:%M:%S") + # print(cTime) + self.cTime = time.strftime("%H:%M") + if self.cTime != self.time1: + self.time1 = self.cTime + self.displayTime.configure(text=self.cTime) + self.displayTime.after(1000, self.clockTick) + else: + self.displayTime.after(1000, self.clockTick) + except Exception as e: + desktopLog.error(str(e)) + + def createSearch(self): + desktopLog.debug("Running createSearch") + try: + self.searchText = Label(self.window, text="Search for: ") + self.searchvar = StringVar() + self.search = Entry(self.window, textvariable=self.searchvar, font=(14), bg=self.menuColour) + self.search.bind("", self.box) + self.search.bind("", self.search_internet) + self.search.place(x=57, y=350, height=50, width=100) + self.search.insert(0, "Search") + except Exception as e: + desktopLog.error(str(e)) + + def contextMenuPopup(self, event): + desktopLog.debug("Running contextMenuPopup") + try: + # start.start(self.menuColour, event.x_root, event.y_root) + self.contextMenu.post(event.x_root, event.y_root) + except Exception as e: + desktopLog.error(str(e)) + + def nothing(self): + pass + + def addContextMenuEntry(self, label="New Label", command=nothing, state=NORMAL): + self.contextMenu.add_command(label=label, command=command, state=state) + + def createContextMenu(self): + desktopLog.debug("Running createContextMenu") + try: + self.contextMenu = Menu(self.window, tearoff=0) + + self.contextMenu.add_command(label="Refresh", command=self.desktopRefresh) + self.contextMenu.add_command(label="Jpad", command=jpad.jpadEditor) + self.contextMenu.add_command(label="File Explorer", state=DISABLED) + self.contextMenu.add_command(label="Hardware Monitor", state=DISABLED) + self.contextMenu.add_command(label="Music Player", state=DISABLED) + self.contextMenu.add_command(label="Info", state=DISABLED) + self.contextMenu.add_command(label="Terminal", state=DISABLED) + self.contextMenu.add_command(label="Settings", state=DISABLED) + self.contextMenu.add_command(label="Restart", state=DISABLED) + self.contextMenu.add_command(label="Shutdown", command=sys.exit) + + except Exception as e: + desktopLog.error(str(e)) + + def desktopRefresh(self): + try: + desktopLog.debug("Running desktopRefresh") + self.fileImage = PhotoImage(file="JDE/Images/file.png") + self.f = [] + self.l = [] + fName = [] + self.place = [] + files = -1 + self.space = 80 + + prefix = self.user_dir + + # prefix = os.path.expanduser("~") + def openFile(self): + # print(fName) + self.fileURL = prefix + "/Desktop/" + str(fName[files]) + # print(fileURL) + self.a = jpad + self.a.jpadEditor(str(self.fileURL)) + + def openFolder(self): + self.folderURL = prefix + "/Desktop/" + str(fName[files]) + self.file_Explorer(self.folderURL) + + try: + for self.file in os.listdir(self.prefix + "/Desktop"): + if self.file not in fName: + self.l.append(Label(self.window, text=self.file, font=("Arial", 11, "bold"))) + + files += 1 + + fName.append(self.file) + self.place.append(files) + + self.space += 80 + + self.f.append(Button(self.window, image=self.fileImage)) + + self.f[files].place(x=int(80), y=int(20) + self.space, width=40, height=40) + + if ".txt" in self.file: + self.f[files].bind("", openFile) + elif ".py" in self.file: + self.f[files].bind("", openFile) + elif ".pyw" in self.file: + self.f[files].bind("", openFile) + elif os.path.isdir(prefix + "/Desktop/" + self.file): + self.f[files].bind("", openFolder) + else: + pass + self.l[files].place(x=int(100), y=int(70) + self.space, anchor=CENTER) + except: + pass + except Exception as e: + desktopLog.error(str(e)) + + def refresh(self): + desktopLog.debug("Running refresh") + try: + self.desktopRefresh() + except Exception as e: + desktopLog.error(str(e)) + + def createStart(self): + desktopLog.debug("Running createStartPic") + try: + start.start(self.menuColour, int(0), int(self.window.winfo_height())) + except Exception as e: + desktopLog.error(str(e)) + pass + + def createBackground(self): + try: + desktopLog.debug("Running createBackground") + self.background_image = PhotoImage(file=self.background) + self.canvas.create_image(0, 0, image=self.background_image, anchor=NW) + except Exception as e: + desktopLog.error(str(e)) + + def createIcon(self): + desktopLog.debug("Running createIcon") + try: + self.window.wm_iconbitmap("System/JordonOS Logo.ico") + except Exception as e: + desktopLog.error(str(e)) + + def createWindow(self): + desktopLog.debug("Running createWindow") + try: + self.window = Tk() + self.window.title("Jordon's Desktop Environment") + self.window.geometry(self.widthHeight) + self.window.minsize(640, 360) + self.windowX = self.window.winfo_x() + self.windowY = self.window.winfo_y() + + self.canvas = Canvas(self.window, width=self.width, height=self.height) + self.canvas.pack(expand=YES, fill=BOTH) + + self.toolbar = Frame(self.window, bg=self.menuColour) + self.toolbar.place(x=0, y=int(self.height) - 55) + + self.notifcationBar = Frame(self.window, bg=self.menuColour) + self.notifcationBar.place(x=int(self.width) - 100, y=int(self.height) - 55) + + self.window.attributes('-fullscreen', False) + self.max = 0 + + self.displayTime = Label(self.notifcationBar, text=self.cTime, bg=self.menuColour, font=("System", 20)) + self.displayTime.pack(side=RIGHT) + + self.window.bind("", self.refresh) + + self.window.bind("", self.fullScreen) + self.window.bind("", self.reposition) + + self.window.bind("", self.contextMenuPopup) + + self.createBackground() + self.createIcon() + self.createSearch() + self.createContextMenu() + self.clockTick() + + self.window.mainloop() + except Exception as e: + desktopLog.error(str(e)) + + def __init__(self, windowTitle="Desktop Environment", width="1920", height="1080", minWidth="", username=""): + desktopLog.debug("Running __init__") + try: + self.width = width + self.height = height + self.widthHeight = str(self.width + "x" + self.height) + self.windowTitle = windowTitle + self.cTime = time.strftime("%H:%M") + self.time1 = "" + self.menuColour = config["colour"].replace("\n", "") + self.startMenuPic = config["startPic"].replace("\n", "") + self.background = config["background"] + self.user_dir = config["userDirs"] + username + "/" + self.prefix = self.user_dir + self.clicked = 0 + + self.createWindow() + + except Exception as e: + desktopLog.error(str(e)) diff --git a/JDE/Interfaces/login.py b/JDE/Interfaces/login.py new file mode 100644 index 0000000..41b2edc --- /dev/null +++ b/JDE/Interfaces/login.py @@ -0,0 +1,130 @@ +import logging +from tkinter import * + +loginLog = logging.getLogger("login.py") + + +class login: + def reposition(self, event): + loginLog.debug("Running reposition") + self.frame.place_configure(x=int(self.window.winfo_width() / 3), y=self.window.winfo_height() / 3, + width=int(int(self.window.winfo_width()) / 3), + height=int(int(self.window.winfo_height()) / 3)) + + def callback(self, event): + loginLog.debug("Running callback") + self.username = self.user.get() + + try: + self.file = open(self.userDirs + self.username.lower() + ".profile", "r") + self.file.close() + except: + self.message.configure(text="Err: Username or password is incorrect!") + self.file = open(self.userDirs + self.username.lower() + ".profile", "r") + + self.line = self.file.readlines() + + self.password = self.passw.get() + if self.username == self.line[1].strip() and self.password == self.line[2].strip(): + self.message.configure(text="Logged in.") + self.active = self.username + self.tmp = open("active", "w") + self.tmp.write(self.active) + self.window.destroy() + # user_dir = line[4] + else: + self.message.configure(text="Err: Username and password don't match the profile") + + def createWidgets(self): + loginLog.debug("Running createWidgets") + self.titleLabel = Label(self.frame, text="Login to " + self.windowTitle + "\n", bg=self.bgColour) + self.usertitle = Label(self.frame, text="---Username---", bg=self.bgColour) + self.passtitle = Label(self.frame, text="---Password---", bg=self.bgColour) + self.message = Label(self.frame, bg=self.bgColour) + self.user = Entry(self.frame) + self.passw = Entry(self.frame, show="*") + self.go = Button(self.frame, text="Log in!", bg="#00FF00") + + self.titleLabel.pack() + self.usertitle.pack() + self.user.pack() + self.passtitle.pack() + self.passw.pack() + self.go.pack() + self.message.pack() + + self.user.focus() + + self.go.bind("", self.callback) + self.go.bind("", self.callback) + self.passw.bind("", self.callback) + self.window.bind("", self.reposition) + + self.window.mainloop() + + def createColour(self): + loginLog.debug("Running createColour") + try: + self.window.configure(bg=self.bgColour) + except: + pass + + def createIcon(self): + loginLog.debug("Running createIcon") + try: + self.window.wm_iconbitmap(self.icon) + except: + pass + + def createBackground(self): + loginLog.debug("Running createBackground") + try: + self.background_image = PhotoImage(file=self.bg) + self.canvas.create_image(0, 0, image=self.background_image, anchor=NW) + self.canvas.pack(expand=YES, fill=BOTH) + except Exception as e: + loginLog.error(str(e)) + + def fullScreen(self, event): + loginLog.debug("Running fullscreen") + if self.max == 0: + self.window.attributes('-fullscreen', True) + self.max = 1 + else: + self.window.attributes('-fullscreen', False) + self.max = 0 + + def createWindow(self): + loginLog.debug("Running createWindow") + self.window = Tk() + self.window.title(self.windowTitle) + self.window.geometry(self.widthHeight) + self.canvas = Canvas(self.window, width=self.bgWidth, height=self.bgHeight) + self.frame = Frame(self.canvas) + self.frame.configure(bg=self.bgColour) + + self.canvas.pack() + + self.window.attributes('-fullscreen', True) + self.max = 1 + self.window.bind("", self.fullScreen) + + def __init__(self, windowTitle="Login Window", widthHeight="1920x1080", icon="", bgColour=None, bg=None, + bgWidth="350", bgHeight="250", + userDirs=""): + loginLog.debug("Running __init__") + self.windowTitle = windowTitle + self.widthHeight = widthHeight + self.icon = icon + self.bgColour = bgColour + self.bg = bg + self.bgWidth = bgWidth + self.bgHeight = bgHeight + self.userDirs = userDirs + self.username = "" + self.active = "" + + self.createWindow() + self.createBackground() + self.createIcon() + self.createWidgets() diff --git a/JDE/Interfaces/start.py b/JDE/Interfaces/start.py new file mode 100644 index 0000000..b6de711 --- /dev/null +++ b/JDE/Interfaces/start.py @@ -0,0 +1,64 @@ +from tkinter import * + + +class start: + def createWidgets(self): + self.allPrograms = Frame(self.window) + self.allPrograms.configure(bg=self.menuColour) + + self.window.geometry("242x310") + + self.hardwareMonitorButton = Button(self.allPrograms, text="Hardware Monitor", state=DISABLED, + width=100, + bg=self.menuColour) + self.musicPlayerButton = Button(self.allPrograms, text="Music Player - Experimental", state=DISABLED, + width=100, bg=self.menuColour) + self.infoButton = Button(self.allPrograms, text="Glass OS Info Panel", state=DISABLED, width=100, + bg=self.menuColour) + self.CustomAppLauncherButton = Button(self.allPrograms, text="Custom App Launcher", state=DISABLED, width=100, + bg=self.menuColour) + self.terminalButton = Button(self.allPrograms, text="Terminal", state=DISABLED, width=100, bg=self.menuColour) + self.restartButton = Button(self.allPrograms, text="Restart", state=DISABLED, width=100, bg=self.menuColour) + self.jpadButton = Button(self.allPrograms, text="Jpad", state=DISABLED, width=100, bg=self.menuColour) + self.chkUpdates = Button(self.allPrograms, text="Check for Updates", state=DISABLED, width=100, + bg=self.menuColour) + self.settingsButton = Button(self.allPrograms, text="Settings", state=DISABLED, width=100, bg=self.menuColour) + self.fileExplorer = Button(self.allPrograms, text="File Explorer", state=DISABLED, width=100, + bg=self.menuColour) + self.shutdown = Button(self.allPrograms, text="Shutdown", command=sys.exit, width=100, bg=self.menuColour) + + self.musicPlayerButton.pack() + self.jpadButton.pack() + self.chkUpdates.pack() + self.CustomAppLauncherButton.pack() + self.fileExplorer.pack() + self.infoButton.pack() + self.hardwareMonitorButton.pack() + self.settingsButton.pack() + self.terminalButton.pack() + self.restartButton.pack() + self.shutdown.pack() + + self.allPrograms.pack() + + def createWindow(self): + self.window = Tk() + self.window.configure(bg=self.menuColour) + self.window.focus() + self.window.title("Start") + + self.createWidgets() + + def noFocus(event): + self.window.destroy() + + self.window.bind("", noFocus) + + self.window.mainloop() + + def __init__(self, colour=None, posX=0, posY=1000): + self.menuColour = colour + self.root_windowX = posX + self.root_windowY = posY + + self.createWindow() diff --git a/JDE/JDE.py b/JDE/JDE.py new file mode 100644 index 0000000..c9ad751 --- /dev/null +++ b/JDE/JDE.py @@ -0,0 +1,53 @@ +__author__ = "Jordonbc" +import logging +import time + +logging.basicConfig(filename='JDE/Logs/' + str(time.strftime('%d-%m-%Y-%H-%M%p') + ".log"), level=logging.DEBUG) +jdeLog = logging.getLogger("JDE.py") + +jdeLog.info("Importing tkinter") +try: + from tkinter import * + + jdeLog.info("Import Successful") +except Exception as e: + jdeLog.critical(str(e)) + +jdeLog.info("Importing os") +try: + import os + + jdeLog.info("Import Successful") +except Exception as e: + jdeLog.critical(str(e)) + +jdeLog.info("Importing JDE/Interfaces/login") +try: + from JDE.Interfaces import login + + jdeLog.info("Import Successful!") +except Exception as e: + jdeLog.critical(str(e)) + +jdeLog.info("Importing JDE/Interfaces/desktop") +try: + from JDE.Interfaces import desktop + + jdeLog.info("Import Successful!") +except Exception as e: + jdeLog.critical(str(e)) + +try: + loginApp = login.login + loginApp(windowTitle="JDE Login", widthHeight="1280x800", userDirs="Users/", bg="JDE/Images/background.png") + userFile = open("active", "r") + username = userFile.read() + userFile.close() + os.remove("active") + + print(username) + + desktopApp = desktop.desktop + desktopApp(username=username) +except Exception as e: + jdeLog.critical(str(e)) diff --git a/JDE/Recent b/JDE/Recent new file mode 100644 index 0000000..b22d141 --- /dev/null +++ b/JDE/Recent @@ -0,0 +1,27 @@ + +jpad +jpad +jpad +jpad +jpad +jpad +jpad +jpad +jpad +jpad +jpad +jpad +jpad +jpad +jpad +jpad +jpad +jpad +jpad +jpad +jpad +jpad +jpad +jpad +jpad +jpad \ No newline at end of file diff --git a/JDE/Settings/settings.conf b/JDE/Settings/settings.conf new file mode 100644 index 0000000..65e93a9 --- /dev/null +++ b/JDE/Settings/settings.conf @@ -0,0 +1,7 @@ +width = "1024" +height = "600" +userDirs = "Users/" +background = "JDE/Images/background.png" +colour = "#a0fd44" +startPic = "JDE/Images/start.png" +fullStart = "0" \ No newline at end of file diff --git a/Programs/jpad.py b/Programs/jpad.py new file mode 100644 index 0000000..4575373 --- /dev/null +++ b/Programs/jpad.py @@ -0,0 +1,213 @@ +import logging +from tkinter import * +from tkinter.filedialog import askopenfilename, asksaveasfilename + +jpadLog = logging.getLogger("jpad.py") + +jpadLog.debug("Atempting to read settings file") +try: + config = {} + exec(open("JDE/Settings/settings.conf").read(), config) + jpadLog.debug("System settings Detected!") +except Exception as e: + jpadLog.error(str(e)) + + +class jpadEditor: + def minimize(self): + jpadLog.debug("Running minimize") + try: + self.appFocus = 0 + except Exception as e: + jpadLog.error(str(e)) + + def closeApp(self): + jpadLog.debug("Running closeApp") + try: + # self.appIcon.destroy() + self.window.destroy() + except Exception as e: + jpadLog.error(str(e)) + + def focusApp(self): + jpadLog.debug("Running focusApp") + try: + if self.appFocus == 0: + self.window.focus_force() + self.appFocus = 1 + + else: + self.appFocus = 0 + self.window.focus_set() + except Exception as e: + jpadLog.error(str(e)) + + def createMenu(self): + jpadLog.debug("Running createMenu") + try: + self.menu = Menu(self.window) + self.window.config(menu=self.menu) + self.filemenu = Menu(self.menu) + self.menu.add_cascade(label="File", menu=self.filemenu) + self.filemenu.add_command(label="New", command=self.new) + self.filemenu.add_command(label="Open...", command=self.open_command) + self.filemenu.add_command(label="Save", command=self.save_command) + self.filemenu.add_command(label="Save As", command=self.saveAs_command) + self.filemenu.add_separator() + self.filemenu.add_command(label="Exit", command=self.exit_command) + + self.fontMenu = Menu(self.menu) + self.menu.add_cascade(label="Font", menu=self.fontMenu) + self.fontMenu.add_command(label="font", command=self.chfont) + except Exception as e: + jpadLog.error(str(e)) + + def new(self): + jpadLog.debug("Running new") + try: + self.window.title("Jpad Text Editor" + " File: New File") + self.textPad.delete(0.0, END) + except Exception as e: + jpadLog.error(str(e)) + + def exit_command(self): + jpadLog.debug("Running exit_command") + try: + self.closeApp() + except Exception as e: + jpadLog.error(str(e)) + + def saveAs_command(self): + jpadLog.debug("Running saveAs_command") + try: + self.jpadFile = asksaveasfilename(defaultextension=".txt", + filetypes=[("Text Files", ".txt"), ("Python .py", ".py"), + ("Python .pyw", ".pyw"), + ("All Files", ".*")]) + self.window.title("Jpad Text Editor" + " File: " + str(self.jpadFile)) + self.jpadFile = open(str(self.jpadFile), "w") + if self.jpadFile != None: + # slice off the last character from get, as an extra return is added + self.data = self.textPad.get(0.0, END) + self.jpadFile.write(self.data) + self.jpadFile.close() + except Exception as e: + jpadLog.error(str(e)) + + def save_command(self): + jpadLog.debug("Running save_command") + try: + self.jpadFile = open(str(self.jpadFile), "w") + if self.jpadFile != None: + # slice off the last character from get, as an extra return is added + self.data = self.textPad.get(0.0, END) + self.jpadFile.write(self.data) + self.jpadFile.close() + except Exception as e: + jpadLog.error(str(e)) + + def open_command(self): + jpadLog.debug("Running open_command") + try: + self.jpadFile = askopenfilename(defaultextension=".txt", + filetypes=[("Text Files", ".txt"), ("Python .py", ".py"), + ("Python .pyw", ".pyw"), + ("All Files", ".*")], ) + + self.window.title("Jpad Text Editor" + " File: " + str(self.jpadFile)) + self.jpadFile = open(str(self.jpadFile), "r") + if self.jpadFile != None: + self.contents = self.jpadFile.read() + self.textPad.delete(0.0, END) + self.textPad.insert(0.0, self.contents) + self.jpadFile.close() + except Exception as e: + jpadLog.error(str(e)) + + def chfont(self): + def apply(self): + try: + self.textPad.configure(font=(self.font1.get(), int(self.font2.get()), self.font3.get())) + self.font[0] = self.font1.get() + self.font[1] = self.font2.get() + self.font[2] = self.font3.get() + + self.rootFont.destroy() + except: + self.msg.configure(text="Whoops, something went wrong while applying your font!") + + self.rootFont = Tk() + self.rootFont.title("Font") + self.rootFont.geometry("320x110") + + self.font1 = Entry(self.rootFont) + self.font2 = Entry(self.rootFont) + self.font3 = Entry(self.rootFont) + + self.font1.insert(0, self.font[0]) + self.font2.insert(0, self.font[1]) + self.font3.insert(0, self.font[2]) + + self.applyButton = Button(self.rootFont, text="Apply Font", command=apply) + self.msg = Label(self.rootFont) + + self.font1.pack() + self.font2.pack() + self.font3.pack() + self.applyButton.pack() + self.msg.pack() + + self.rootFont.mainloop() + + def createWidgets(self): + self.textPad = Text(self.window) + self.textPad.configure(bg=self.menuColour) + self.textPad.configure(font=(self.font[0], int(self.font[1]), self.font[2])) + self.textPad.focus() + + if self.jpadFile != None: + self.window.title("Jpad Text Editor" + " File: " + str(self.jpadFile)) + self.jpadFile = open(str(self.jpadFile), "r") + self.contents = self.jpadFile.read() + self.textPad.delete(0.0, END) + self.textPad.insert(0.0, self.contents) + self.jpadFile.close() + + self.textPad.pack(expand=YES, fill=BOTH) + + def createWindow(self): + self.window = Tk() + self.sWidth = self.window.winfo_screenwidth() + self.sHeight = self.window.winfo_screenheight() + self.window.title("Jpad") + self.window.geometry(self.widthHeight) + self.window.maxsize(self.sWidth, self.sHeight) + self.window.minsize("200", "200") + self.createWidgets() + self.createMenu() + + self.window.bind("", self.minimize) + self.window.protocol("WM_DELETE_WINDOW", self.closeApp) + + self.window.mainloop() + + def __init__(self, file=None): + self.recentAdd = open("JDE/Recent", "a") + self.recentAdd.write("\n") + self.recentAdd.write("jpad") + self.recentAdd.close() + self.jpadFile = file + self.width = "500" + self.height = "400" + self.appFocus = 1 + self.widthHeight = self.width + "x" + self.height + self.menuColour = config["colour"].replace("\n", "") + self.font = ["Arial", "11", "normal"] + + try: + self.appIcon = Button(self.toolbar, text="Jpad", command=self.focusApp) + self.appIcon.pack(side=LEFT, fill=Y) + except: + pass + + self.createWindow() diff --git a/Programs/minesweeper.py b/Programs/minesweeper.py new file mode 100644 index 0000000..13bde8b --- /dev/null +++ b/Programs/minesweeper.py @@ -0,0 +1,270 @@ +import random +from tkinter import * +from tkinter import messagebox + + +def mine_sweeper(colour="#39d972"): + class MineSweeperCell(Label): + '''Creates a minesweeper square that is part of a grid''' + + def __init__(self, master): + '''Makes an unmarked minesweeper grid square; 0 represents blank and 9 represents bomb''' + # create cell label + Label.__init__(self, master, height=1, width=2, text='', bg=colour, bd=5, font=('Arial', 10), relief=RAISED) + self.value = '' # store cell value + self.clicked = False # store whether it is clicked + self.flagged = False # store whether it is flagged + self.checked = False # store whether it has been checked (for 0's) + # color dictionary + self.colorMap = ['', 'blue', 'darkgreen', 'red', 'purple', 'maroon', 'cyan', 'black', 'gray'] + # attaches mouse clicks to functions + self.bind('', self.reveal) + self.bind('', self.flag) + + def get_value(self): + '''Returns value of cell''' + return self.value + + def is_clicked(self): + '''Tells if cell has been clicked''' + return self.clicked + + def is_flagged(self): + '''Tells if cell is flagged''' + return self.flagged + + def flag(self, event): + '''Flags the square if player believes there is a bomb''' + if self.flagged == False and self.clicked == False and int( + self.master.flags) > 0 and self.master.winner == False: + # if no flag + self['text'] = '*' + self.master.subFlag() # subtract from remaining bombs + self.flagged = True # set self.flagged to true + elif self.flagged == True and self.clicked == False and int(self.master.flags) < int( + self.master.bombs) and self.master.winner == False: # if it is already flagged + self['text'] = '' # remove flag + self.master.addFlag() # add to remaining bombs + self.flagged = False # set self.flagged to False + + def set_value(self, value): + '''Sets the value of the cell''' + self.value = value + + def reveal(self, event): + '''Reveals the hidden cell value''' + if self.clicked == False: + if 0 < self.value < 9: + if self.flagged == False and self.master.loser == False: # checks if it is a valid click + self['relief'] = SUNKEN + # set text and color + self['text'] = str(self.value) + self['fg'] = self.colorMap[self.value] + self['bg'] = 'gray65' + self["bd"] = 5 + self.clicked = True + self.master.CheckWin() + elif self.value == 9: + if self.master.winner == False and self.flagged == False: # if it is a bomb + self['text'] = '*' # make text a bomb + self['bg'] = 'red' # make background red + self["bd"] = 5 + self['relief'] = SUNKEN + self.clicked = True + self.master.CheckLoss() + elif self.value == 0: + if self.flagged == False and self.master.loser == False: + self['text'] = '' + self.master.uncover_other_blank(self) + self['relief'] = SUNKEN + self['bg'] = 'gray65' + self["bd"] = 5 + self.clicked = True + self.master.CheckWin() + + def expose(self): + '''Exposes surrounding zeros''' + if self.clicked == False: + if 0 < self.value < 9: + if self.flagged == False and self.master.loser == False: + self['text'] = str(self.value) # set text and color + self['fg'] = self.colorMap[self.value] + self['relief'] = SUNKEN + self['bg'] = 'gray65' + self["bd"] = 5 + self.clicked = True + self.master.CheckWin() + elif self.value == 9: + if self.flagged == False: # if it is a bomb + self['text'] = '*' # make text a bomb + self['bg'] = 'red' # make background red + self["bd"] = 5 + self['relief'] = SUNKEN + self.clicked = True + elif self.value == 0: + if self.flagged == False and self.master.loser == False: + self['text'] = '' + self.master.uncover_other_blank(self) + self['relief'] = SUNKEN + self['bg'] = 'gray65' + self["bd"] = 5 + self.clicked = True + self.master.CheckWin() + + class MineSweeperGrid(Frame): + '''Creates a minesweeper grid to play the game on''' + + def __init__(self, master, width, height, numBombs): + '''Creates a grid with the given width, height, and number of bombs''' + Frame.__init__(self, master, bg=colour, bd=5) + self.grid() + # sets the number of bombs + self.bombs = numBombs + # sets the number of flags + self.flags = numBombs + # create something to set the bombs up around each square + self.count = 0 + self.winner = False + self.loser = False + # create the label that will keep track of flags + self.flagTrack = Label(self, text=self.flags, bg=colour, height=1, width=2, font=("Arial", 36)) + self.flagTrack.grid(row=height, columnspan=width) + # create the bombs + self.cells = {} + for i in range(int(numBombs)): + y = random.randint(0, int(width) - 1) + x = random.randint(0, int(height) - 1) + while (x, y) in self.cells.keys(): + y = random.randint(0, int(width) - 1) + x = random.randint(0, int(height) - 1) + self.cells[(x, y)] = MineSweeperCell(self) + self.cells[(x, y)].set_value(9) + self.cells[(x, y)].grid(row=x, column=y) + # create the other cells + for row in range(int(height)): + for column in range(int(width)): + if (row, column) not in self.cells.keys(): + self.count = 0 + if (row + 1, column) in self.cells.keys(): + if self.cells[(row + 1, column)].get_value() == 9: + self.count = self.count + 1 + if (row + 1, column + 1) in self.cells.keys(): + if self.cells[(row + 1, column + 1)].get_value() == 9: + self.count = self.count + 1 + if (row, column + 1) in self.cells.keys(): + if self.cells[(row, column + 1)].get_value() == 9: + self.count = self.count + 1 + if (row - 1, column + 1) in self.cells.keys(): + if self.cells[(row - 1, column + 1)].get_value() == 9: + self.count = self.count + 1 + if (row - 1, column) in self.cells.keys(): + if self.cells[(row - 1, column)].get_value() == 9: + self.count = self.count + 1 + if (row - 1, column - 1) in self.cells.keys(): + if self.cells[(row - 1, column - 1)].get_value() == 9: + self.count = self.count + 1 + if (row, column - 1) in self.cells.keys(): + if self.cells[(row, column - 1)].get_value() == 9: + self.count = self.count + 1 + if (row + 1, column - 1) in self.cells.keys(): + if self.cells[(row + 1, column - 1)].get_value() == 9: + self.count = self.count + 1 + self.cells[(row, column)] = MineSweeperCell(self) + self.cells[(row, column)].set_value(self.count) + self.cells[(row, column)].grid(row=row, column=column) + + def subFlag(self): + '''Subtracts one from the flagcount''' + self.flags = int(self.flags) - 1 + self.flagTrack['text'] = str(self.flags) + + def addFlag(self): + '''Adds one from the flagcount''' + self.flags = int(self.flags) + 1 + self.flagTrack['text'] = str(self.flags) + + def uncover_other_blank(self, cell): + '''Uncovers all blank squares adjacent to the marked square''' + for coords, mine in self.cells.items(): + if mine == cell: + c = coords + x = int(float(c[0])) + y = int(float(c[1])) + cell.checked = True + # checks all cells in radius + if (x + 1, y) in self.cells.keys(): + if self.cells[(x + 1, y)].checked == False: + self.cells[(x + 1, y)].expose() + if (x + 1, y + 1) in self.cells.keys(): + if self.cells[(x + 1, y + 1)].checked == False: + self.cells[(x + 1, y + 1)].expose() + if (x, y + 1) in self.cells.keys(): + if self.cells[(x, y + 1)].checked == False: + self.cells[(x, y + 1)].expose() + if (x - 1, y + 1) in self.cells.keys(): + if self.cells[(x - 1, y + 1)].checked == False: + self.cells[(x - 1, y + 1)].expose() + if (x - 1, y) in self.cells.keys(): + if self.cells[(x - 1, y)].checked == False: + self.cells[(x - 1, y)].expose() + if (x - 1, y - 1) in self.cells.keys(): + if self.cells[(x - 1, y - 1)].checked == False: + self.cells[(x - 1, y - 1)].expose() + if (x, y - 1) in self.cells.keys(): + if self.cells[(x, y - 1)].checked == False: + self.cells[(x, y - 1)].expose() + if (x + 1, y - 1) in self.cells.keys(): + if self.cells[(x + 1, y - 1)].checked == False: + self.cells[(x + 1, y - 1)].expose() + + def CheckWin(self): + '''Checks if player won''' + doneList = [] + for key in self.cells.keys(): + if self.cells[key].clicked == True and self.cells[key].value != 9: + doneList.append(self.cells[key]) + if len(doneList) == int(height) * int(width) - int(numBombs): + messagebox.showinfo('Minesweeper', 'Congratulations -- you won!', parent=self) + self.winner = True + playagain() + + def CheckLoss(self): + '''Checks if player lost''' + self.loser = True + self.flagTrack['text'] = '0' + messagebox._show('Minesweeper', 'You Lose!', parent=self) + for key in self.cells.keys(): + if self.cells[key].value == 9: + self.cells[key].flagged = False + self.cells[key].expose() + playagain() + + def playagain(): + again = messagebox.askyesno("Minesweeper", "Do you want to play again?") + if again == TRUE: + root.destroy() + __init__() + + else: + root.destroy() + + def __init__(): + global width + global height + global numBombs + width = 10 + height = 10 + numBombs = 30 + global root + root = Tk() + root.maxsize(270, 335) + root.minsize(270, 335) + root.title('Minesweeper') + global game + game = MineSweeperGrid(root, width, height, numBombs) + game.mainloop() + + __init__() + + +mine_sweeper() diff --git a/Users/test.profile b/Users/test.profile new file mode 100644 index 0000000..c78406c --- /dev/null +++ b/Users/test.profile @@ -0,0 +1,5 @@ +--==test==-- +test +test +1 +Users/test \ No newline at end of file diff --git a/Users/test/Desktop/test.txt b/Users/test/Desktop/test.txt new file mode 100644 index 0000000..9daeafb --- /dev/null +++ b/Users/test/Desktop/test.txt @@ -0,0 +1 @@ +test diff --git a/run.py b/run.py new file mode 100644 index 0000000..e69de29