Skip to content

Commit 0676f6a

Browse files
committed
Minor Fixes. v1.1.0
1 parent bc680b1 commit 0676f6a

File tree

6 files changed

+521
-29
lines changed

6 files changed

+521
-29
lines changed

README.md

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,16 @@
1-
# Python-Compiler
2-
A simple Python compiler written in Python 🐍.
1+
<h1 align="center"></h1>
2+
<p align="center">
3+
<a href="">
4+
<img src="https://socialify.git.ci/MrHydroCoder/Python-Compiler/image?description=1&forks=1&issues=1&language=1&logo=https%3A%2F%2Fcdn.mrayush.me%2Fimg%2FMrHydroCoder%2FPython-Compiler%2Flogo.png&name=1&owner=1&pattern=Circuit%20Board&pulls=1&stargazers=1&theme=Dark" alt="Python-Compiler" width="650" />
5+
</a>
6+
</br></br>
7+
<strong>
8+
A simple Python compiler written in Python 🐍.
9+
</strong>
10+
<br />
11+
<a href="https://github.com/MrHydroCoder/Python-Compiler/issues">Report a Bug</a> | <a href="https://github.com/MrHydroCoder/Python-Compiler/issues">Request Feature</a>
12+
</p>
13+
14+
<hr>
15+
16+
<a href="https://github.com/MrHydroCoder/Python-Compiler/releases/latest">Download Now</a>

main.py

Lines changed: 171 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
1-
import json
21
import os
32
import sys
43
import time
4+
import json
55
import shutil
66
import ctypes
77
import pygments
88
import subprocess
9+
import webbrowser
910
from tkinter import *
11+
from tkinter.font import Font
12+
from tklinenums import TkLineNumbers
1013
from pygments.lexers import PythonLexer
1114
from tkinter.scrolledtext import ScrolledText
15+
from tkinter.filedialog import askopenfile, asksaveasfile
1216

1317
if getattr(sys, 'frozen', False):
1418
application_path = sys._MEIPASS
@@ -26,12 +30,39 @@
2630
except:
2731
pass
2832

33+
VERSION = "1.1.0"
34+
VERSION_TEXT = "v1.1.0"
2935
TEMP_FOLDER_PATH = os.path.join(application_path, ".codedumps")
3036

3137
def br(master=root):
3238
Label(master, text="").pack()
3339

40+
def openFile(*_):
41+
filetypes = [
42+
('Python Files', '*.py'),
43+
('Text Files', '*.txt')
44+
]
45+
file = askopenfile("r", filetypes=filetypes)
46+
if file:
47+
CODE.delete(1.0, END)
48+
CODE.insert(INSERT, file.read())
49+
highlightCode()
50+
update_highlighter()
51+
52+
def saveFile(*_):
53+
filetypes = [
54+
('Python Files', '.py')
55+
]
56+
file = asksaveasfile("w", filetypes=filetypes, defaultextension=".py")
57+
if file:
58+
file.write(CODE.get(1.0, END))
59+
file.close()
60+
61+
def newFile(*_):
62+
subprocess.Popen([sys.executable, f"{application_path}/main.py"], shell=True, stdin=None, stdout=None, stderr=None, close_fds=True)
63+
3464
def highlightCode(*_):
65+
linenums.redraw()
3566
for tag in CODE.tag_names(index=None):
3667
if tag != "sel":
3768
CODE.tag_remove(tag, "1.0", "end")
@@ -51,28 +82,29 @@ def highlightCode(*_):
5182
CODE.tag_add(str(token), start, end)
5283
start = end
5384

54-
def generate_font_list(self, input_dict: dict) -> list:
55-
font_dict = {"-family": self.font_family, "-size": self.font_size}
56-
57-
for style_key, style_value in input_dict.items():
58-
if style_key == "family":
59-
font_dict["-family"] = style_value
60-
elif style_key == "size":
61-
font_dict["-size"] = style_value
62-
elif style_key == "bold":
63-
font_dict["-weight"] = "bold" if style_value else "normal"
64-
elif style_key == "italic":
65-
font_dict["-slant"] = "italic" if style_value else "roman"
66-
elif style_key == "underline":
67-
font_dict["-underline"] = style_value
68-
elif style_key == "strikethrough":
69-
font_dict["-overstrike"] = style_value
70-
71-
font_list = []
72-
for x, y in zip(font_dict.keys(), font_dict.values()):
73-
font_list.extend([x, y])
74-
75-
return font_list
85+
def generate_font_list(input_dict: dict) -> list:
86+
_font = Font(font=("Cooper", 18))
87+
font_dict = {"-family": _font.actual("family"), "-size": _font.actual("size")}
88+
89+
for style_key, style_value in input_dict.items():
90+
if style_key == "family":
91+
font_dict["-family"] = style_value
92+
elif style_key == "size":
93+
font_dict["-size"] = style_value
94+
elif style_key == "bold":
95+
font_dict["-weight"] = "bold" if style_value else "normal"
96+
elif style_key == "italic":
97+
font_dict["-slant"] = "italic" if style_value else "roman"
98+
elif style_key == "underline":
99+
font_dict["-underline"] = style_value
100+
elif style_key == "strikethrough":
101+
font_dict["-overstrike"] = style_value
102+
103+
font_list = []
104+
for x, y in zip(font_dict.keys(), font_dict.values()):
105+
font_list.extend([x, y])
106+
107+
return font_list
76108

77109
def update_highlighter(highlighter: str="mariana") -> None:
78110
highlight_file = highlighter
@@ -117,7 +149,62 @@ def paste(*_):
117149
except:
118150
pass
119151

120-
CODE.event_generate("<<TextPasted>>")
152+
return "break"
153+
154+
def copy(*_):
155+
if CODE.tag_ranges("sel"):
156+
code = CODE.get(CODE.index("sel.first"), CODE.index("sel.last"))
157+
else:
158+
code = CODE.get(1.0, END)
159+
root.clipboard_clear()
160+
root.clipboard_append(code)
161+
root.update()
162+
return "break"
163+
164+
def cut(*_):
165+
if CODE.tag_ranges("sel"):
166+
sel_start = CODE.index("sel.first")
167+
sel_end = CODE.index("sel.last")
168+
code = CODE.get(sel_start, sel_end)
169+
del_start, del_end = sel_start, sel_end
170+
else:
171+
code = CODE.get(1.0, END)
172+
del_start, del_end = 1.0, END
173+
root.clipboard_clear()
174+
root.clipboard_append(code)
175+
root.update()
176+
CODE.delete(del_start, del_end)
177+
178+
highlightCode()
179+
update_highlighter()
180+
181+
return "break"
182+
183+
def selectAll(*_):
184+
CODE.tag_add(SEL, "1.0", END)
185+
CODE.mark_set(INSERT, "1.0")
186+
CODE.see(INSERT)
187+
188+
return "break"
189+
190+
def undo(*_):
191+
try:
192+
CODE.edit_undo()
193+
highlightCode()
194+
update_highlighter()
195+
except:
196+
pass
197+
198+
return "break"
199+
200+
def redo(*_):
201+
try:
202+
CODE.edit_redo()
203+
highlightCode()
204+
update_highlighter()
205+
except:
206+
pass
207+
121208
return "break"
122209

123210
def compile_nd_run():
@@ -161,13 +248,39 @@ def compile_nd_run():
161248

162249
CODE_FRAME = Frame(APP_FRAME)
163250
Label(CODE_FRAME, text="Enter your python code below.", fg="Black", font=("Cooper Black", 20), justify=CENTER).pack()
164-
CODE = ScrolledText(CODE_FRAME, height=9, width=45, font=("Cooper", 18))
251+
252+
CODE_BLOCK_FRAME = Frame(CODE_FRAME)
253+
CODE = ScrolledText(CODE_BLOCK_FRAME, undo=True, height=9, width=45, font=("Cooper", 18))
254+
255+
linenums = TkLineNumbers(CODE_BLOCK_FRAME, CODE, height=9, width=2, justify=CENTER)
256+
linenums.pack(side=LEFT, fill=Y, expand=True)
257+
165258
CODE.pack()
166259
CODE.bind("<KeyRelease>", highlightCode, add=True)
260+
CODE.bind("<<Cut>>", cut, add=True)
261+
CODE.bind("<<Copy>>", copy, add=True)
167262
CODE.bind("<<Paste>>", paste, add=True)
263+
CODE.bind("<Control-Key-a>", selectAll, add=True)
264+
CODE.bind("<Control-Key-A>", selectAll, add=True)
265+
CODE.bind("<Control-Key-s>", saveFile, add=True)
266+
CODE.bind("<Control-Key-S>", saveFile, add=True)
267+
CODE.bind("<Control-Key-n>", newFile, add=True)
268+
CODE.bind("<Control-Key-N>", newFile, add=True)
269+
CODE.bind("<Control-Key-o>", openFile, add=True)
270+
CODE.bind("<Control-Key-O>", openFile, add=True)
271+
CODE.bind("<Control-Key-z>", undo, add=True)
272+
CODE.bind("<Control-Key-Z>", undo, add=True)
273+
CODE.bind("<Control-Shift-Key-z>", redo, add=True)
274+
CODE.bind("<Control-Shift-Key-Z>", redo, add=True)
275+
root.bind("<Alt-Key-F4>", lambda *_: root.destroy())
276+
root.bind("<Control-Key-w>", lambda *_: root.destroy())
277+
root.bind("<Control-Key-W>", lambda *_: root.destroy())
278+
168279
highlightCode()
169280
update_highlighter()
281+
170282
CODE.focus_set()
283+
CODE_BLOCK_FRAME.pack()
171284
CODE_FRAME.pack()
172285

173286
br(APP_FRAME)
@@ -176,7 +289,7 @@ def compile_nd_run():
176289

177290
INPUT_FRAME = Frame(INPUT_ND_OUTPUT_FRAME)
178291
Label(INPUT_FRAME, text="Input", font=("Cooper Black", 20)).pack()
179-
INPUT = ScrolledText(INPUT_FRAME, height=9, width=40, font=("Cooper", 18))
292+
INPUT = ScrolledText(INPUT_FRAME, undo=True, height=9, width=40, font=("Cooper", 18))
180293
INPUT.pack()
181294
INPUT_FRAME.pack(side=LEFT, padx=10)
182295

@@ -201,5 +314,37 @@ def compile_nd_run():
201314

202315
APP_FRAME.pack()
203316

317+
menubar = Menu(root)
318+
319+
file = Menu(menubar, tearoff = 0, font=("Cooper", 11))
320+
menubar.add_cascade(label="File", menu=file)
321+
file.add_command(label=f"New File{' '*4}(Ctrl+N)", command=newFile)
322+
file.add_command(label=f"Open...{' '*6}(Ctrl+O)", command=openFile)
323+
file.add_command(label=f"Save{' '*10}(Ctrl+S)", command=saveFile)
324+
file.add_separator()
325+
file.add_command(label=f"Exit{' '*12}(Ctrl+W)", command=root.destroy)
326+
327+
edit = Menu(menubar, tearoff = 0, font=("Cooper", 11))
328+
menubar.add_cascade(label="Edit", menu=edit)
329+
edit.add_command(label=f"Undo{' '*11}(Ctrl+Z)", command=undo)
330+
edit.add_command(label=f"Redo{' '*11}(Ctrl+Shift+Z)", command=redo)
331+
edit.add_separator()
332+
edit.add_command(label=f"Cut{' '*14}(Ctrl+X)", command=cut)
333+
edit.add_command(label=f"Copy{' '*11}(Ctrl+C)", command=copy)
334+
edit.add_command(label=f"Paste{' '*10}(Ctrl+V)", command=paste)
335+
edit.add_command(label=f"Select All{' '*5}(Ctrl+A)", command=selectAll)
336+
337+
window_ = Menu(menubar, tearoff = 0, font=("Cooper", 11))
338+
menubar.add_cascade(label="Window", menu=window_)
339+
window_.add_command(label=f"*Compiler {VERSION_TEXT}*", command=None)
340+
341+
help_ = Menu(menubar, tearoff = 0, font=("Cooper", 11))
342+
menubar.add_cascade(label='Help', menu=help_)
343+
help_.add_command(label='Source Code', command=lambda *_: webbrowser.open("https://github.com/MrHydroCoder/Python-Compiler", new=1))
344+
help_.add_separator()
345+
help_.add_command(label='Developer', command=lambda *_: webbrowser.open("https://github.com/MrHydroCoder", new=1))
346+
347+
root.config(menu=menubar)
348+
204349
Label(root, text="Made with 💝 by @MrHydroCoder", font=("Cooper Black", 25)).pack(side=BOTTOM)
205350
root.mainloop()

requirements.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
Pygments==2.14.0
1+
Pygments==2.14.0
2+
tklinenums==1.7.0

schemes/ayu-dark.json

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
{
2+
"general": {
3+
"background": "#0a0e14",
4+
"foreground": "#b3b1ad",
5+
"selectbackground": "#1b2733",
6+
"inactiveselectbackground": "#1b2733",
7+
"insertbackground": "#b3b1ad",
8+
"insertwidth": 1,
9+
"borderwidth": 0,
10+
"highlightthickness": 0
11+
},
12+
"selection": {
13+
"background": "#1b2733",
14+
"foreground": "#b3b1ad"
15+
},
16+
"syntax": {
17+
"Token.Error": "#ff3333",
18+
"Token.Escape": "#b3b1ad",
19+
"Token.Punctuation": "#b3b1ad",
20+
"Token.Comment": "#626a73",
21+
"Token.Keyword": "#ff7700",
22+
"Token.Keyword.Other": "#ff7700",
23+
"Token.Literal.String": "#95e6cb",
24+
"Token.Literal.String.Other": "#95e6cb",
25+
"Token.Name.Other": "#ff8f40",
26+
"Token.Keyword.Constant": "#ff7700",
27+
"Token.Keyword.Declaration": "#ff7700",
28+
"Token.Keyword.Namespace": "#ff7700",
29+
"Token.Keyword.Pseudo": "#ff7700",
30+
"Token.Keyword.Reserved": "#ff7700",
31+
"Token.Keyword.Type": "#ff7700",
32+
"Token.Name.Attribute": "#ff8f40",
33+
"Token.Name.Builtin": "#e6b450",
34+
"Token.Name.Builtin.Pseudo": "#e6b450",
35+
"Token.Name.Class": "#ff8f40",
36+
"Token.Name.Constant": "#ffee99",
37+
"Token.Name.Decorator": "#e6b673",
38+
"Token.Name.Entity": "#ff8f40",
39+
"Token.Name.Exception": "#ff8f40",
40+
"Token.Name.Function": "#ffb454",
41+
"Token.Name.Function.Magic": "#ff8f40",
42+
"Token.Name.Label": "#ff8f40",
43+
"Token.Name.Namespace": "#b3b1ad",
44+
"Token.Name.Tag": "#ff8f40",
45+
"Token.Name.Variable": "#ff8f40",
46+
"Token.Name.Variable.Class": "#ff8f40",
47+
"Token.Name.Variable.Global": "#ff8f40",
48+
"Token.Name.Variable.Instance": "#ff8f40",
49+
"Token.Name.Variable.Magic": "#ff8f40",
50+
"Token.Operator": "#f29668",
51+
"Token.Operator.Word": "#f29668",
52+
"Token.Literal.String.Affix": "#c2d94c",
53+
"Token.Literal.String.Backtick": "#95e6cb",
54+
"Token.Literal.String.Char": "#95e6cb",
55+
"Token.Literal.String.Delimeter": "#c2d94c",
56+
"Token.Literal.String.Doc": "#c2d94c",
57+
"Token.Literal.String.Double": "#c2d94c",
58+
"Token.Literal.String.Escape": "#c2d94c",
59+
"Token.Literal.String.Heredoc": "#c2d94c",
60+
"Token.Literal.String.Interpol": "#c2d94c",
61+
"Token.Literal.String.Regex": "#95e6cb",
62+
"Token.Literal.String.Single": "#c2d94c",
63+
"Token.Literal.String.Symbol": "#c2d94c",
64+
"Token.Literal.Number.Bin": "#e6b450",
65+
"Token.Literal.Number.Float": "#e6b450",
66+
"Token.Literal.Number.Hex": "#e6b450",
67+
"Token.Literal.Number.Integer": "#e6b450",
68+
"Token.Literal.Number.Integer.Long": "#e6b450",
69+
"Token.Literal.Number.Oct": "#e6b450",
70+
"Token.Comment.Hashbang": "#626a73",
71+
"Token.Comment.Multiline": "#626a73",
72+
"Token.Comment.Preproc": "#ff7700",
73+
"Token.Comment.PreprocFile": "#c2d94c",
74+
"Token.Comment.Single": "#626a73",
75+
"Token.Comment.Special": "#626a73"
76+
}
77+
}

0 commit comments

Comments
 (0)