├── Beginner Level ├── Calculator.py ├── Digital Clock.py └── Rectangle Area.py ├── Intermediate Level ├── Fractal Tree Pattern.py ├── Heart.py └── Tic-Tac-Toe XO GUI.py ├── Pro Level ├── Calculator GUI.py └── Snake Game GUI.py └── README.md /Beginner Level/Calculator.py: -------------------------------------------------------------------------------- 1 | num1 = float(input("Enter The Frist Number :")) 2 | operator = input("Enter The Operator :") 3 | num2 = float(input("Enter The Second Number :")) 4 | 5 | if operator == "+": 6 | print(num1 + num2) 7 | elif operator == "-": 8 | print(num1 - num2) 9 | elif operator == "/": 10 | print(num1 / num2) 11 | elif operator == "*": 12 | print(num1 * num2) 13 | else: 14 | print("Wrong Operactor Please Try Again") -------------------------------------------------------------------------------- /Beginner Level/Digital Clock.py: -------------------------------------------------------------------------------- 1 | from tkinter import * 2 | from tkinter.ttk import * 3 | from time import strftime 4 | 5 | wn = Tk() 6 | wn.title("Digital Clock") 7 | 8 | def time(): 9 | string = strftime("%H:%M:%S %p") 10 | label.config(text=string) 11 | label.after(1000, time) 12 | 13 | label = Label(wn, font=("Ds-Digital", 80), background="black", foreground="blue") 14 | label.pack(anchor="center") 15 | time() 16 | 17 | mainloop() -------------------------------------------------------------------------------- /Beginner Level/Rectangle Area.py: -------------------------------------------------------------------------------- 1 | length = int(input("Enter The Length : ")) 2 | width = int(input("Enter The Width : ")) 3 | area = length * width 4 | print("The Area OF The Rectangle is :", area) -------------------------------------------------------------------------------- /Intermediate Level/Fractal Tree Pattern.py: -------------------------------------------------------------------------------- 1 | import turtle as tu 2 | 3 | tree = tu.Turtle() 4 | wn = tu.Screen() 5 | wn.bgcolor("#000000") 6 | wn.title("Fractal Tree Pattern") 7 | tree.left(90) 8 | tree.speed(2000) 9 | 10 | def draw(x): 11 | if(x < 10): 12 | return 13 | else: 14 | tree.pensize(2) 15 | tree.pencolor("#DB80BD") 16 | tree.forward(x) 17 | tree.left(30) 18 | draw(3 * x / 4) 19 | tree.right(60) 20 | draw(3 * x / 4) 21 | tree.left(30) 22 | tree.backward(x) 23 | draw(20) 24 | tree.right(90) 25 | tree.speed(2000) 26 | 27 | def draw(x): 28 | if(x < 10): 29 | return 30 | else: 31 | tree.pensize(2) 32 | tree.pencolor("#66CDAF") 33 | tree.forward(x) 34 | tree.left(30) 35 | draw(3 * x / 4) 36 | tree.right(60) 37 | draw(3 * x / 4) 38 | tree.left(30) 39 | tree.backward(x) 40 | draw(20) 41 | tree.left(270) 42 | tree.speed(2000) 43 | 44 | def draw(x): 45 | if(x < 10): 46 | return 47 | else: 48 | tree.pensize(2) 49 | tree.pencolor("#FFBB94") 50 | tree.forward(x) 51 | tree.left(30) 52 | draw(3 * x / 4) 53 | tree.right(60) 54 | draw(3 * x / 4) 55 | tree.left(30) 56 | tree.backward(x) 57 | draw(20) 58 | tree.right(90) 59 | tree.speed(2000) 60 | 61 | def draw(x): 62 | if(x < 10): 63 | return 64 | else: 65 | tree.pensize(2) 66 | tree.pencolor("#7C80AD") 67 | tree.forward(x) 68 | tree.left(30) 69 | draw(3 * x / 4) 70 | tree.right(60) 71 | draw(3 * x / 4) 72 | tree.left(30) 73 | tree.backward(x) 74 | draw(20) 75 | 76 | def draw(x): 77 | if(x <10): 78 | return 79 | else: 80 | tree.pensize(4) 81 | tree.pencolor("#7C80AD") 82 | tree.forward(x) 83 | tree.left(30) 84 | draw(4 * x / 5) 85 | tree.right(60) 86 | draw(4 * x / 5) 87 | tree.left(30) 88 | tree.backward(x) 89 | draw(40) 90 | tree.right(90) 91 | tree.speed(2000) 92 | 93 | def draw(x): 94 | if(x <10): 95 | return 96 | else: 97 | tree.pensize(4) 98 | tree.pencolor("#DB80BD") 99 | tree.forward(x) 100 | tree.left(30) 101 | draw(4 * x / 5) 102 | tree.right(60) 103 | draw(4 * x / 5) 104 | tree.left(30) 105 | tree.backward(x) 106 | draw(40) 107 | tree.left(270) 108 | tree.speed(2000) 109 | 110 | def draw(x): 111 | if(x <10): 112 | return 113 | else: 114 | tree.pensize(4) 115 | tree.pencolor("#66CDAF") 116 | tree.forward(x) 117 | tree.left(30) 118 | draw(4 * x / 5) 119 | tree.right(60) 120 | draw(4 * x / 5) 121 | tree.left(30) 122 | tree.backward(x) 123 | draw(40) 124 | tree.right(90) 125 | tree.speed(2000) 126 | 127 | def draw(x): 128 | if(x <10): 129 | return 130 | else: 131 | tree.pensize(4) 132 | tree.pencolor("#FFBB94") 133 | tree.forward(x) 134 | tree.left(30) 135 | draw(4 * x / 5) 136 | tree.right(60) 137 | draw(4 * x / 5) 138 | tree.left(30) 139 | tree.backward(x) 140 | draw(40) 141 | 142 | def draw(x): 143 | if(x < 10): 144 | return 145 | else: 146 | tree.pensize(2) 147 | tree.pencolor("#FFBB94") 148 | tree.forward(x) 149 | tree.left(30) 150 | draw(4 * x / 5) 151 | tree.right(60) 152 | draw(4 * x / 5) 153 | tree.left(30) 154 | tree.backward(x) 155 | draw(60) 156 | tree.right(90) 157 | tree.speed(2000) 158 | 159 | def draw(x): 160 | if(x < 10): 161 | return 162 | else: 163 | tree.pensize(2) 164 | tree.pencolor("#7C80AD") 165 | tree.forward(x) 166 | tree.left(30) 167 | draw(4 * x / 5) 168 | tree.right(60) 169 | draw(4 * x / 5) 170 | tree.left(30) 171 | tree.backward(x) 172 | draw(60) 173 | tree.left(270) 174 | tree.speed(2000) 175 | 176 | def draw(x): 177 | if(x < 10): 178 | return 179 | else: 180 | tree.pensize(2) 181 | tree.pencolor("#DB80BD") 182 | tree.forward(x) 183 | tree.left(30) 184 | draw(4 * x / 5) 185 | tree.right(60) 186 | draw(4 * x / 5) 187 | tree.left(30) 188 | tree.backward(x) 189 | draw(60) 190 | tree.right(90) 191 | tree.speed(2000) 192 | 193 | def draw(x): 194 | if(x < 10): 195 | return 196 | else: 197 | tree.pensize(2) 198 | tree.pencolor("#66CDAF") 199 | tree.forward(x) 200 | tree.left(30) 201 | draw(4 * x / 5) 202 | tree.right(60) 203 | draw(4 * x / 5) 204 | tree.left(30) 205 | tree.backward(x) 206 | draw(60) 207 | wn.exitonclick() -------------------------------------------------------------------------------- /Intermediate Level/Heart.py: -------------------------------------------------------------------------------- 1 | import turtle 2 | 3 | t = turtle.Turtle() 4 | s = turtle.Screen() 5 | 6 | s.bgcolor("black") 7 | t.hideturtle() 8 | t.goto(0,-10) 9 | 10 | turtle.pensize(3) 11 | t.color("blue") 12 | t.begin_fill() 13 | t.left(140) 14 | t.forward(180) 15 | t.circle(-90,200) 16 | t.setheading(60) 17 | t.circle(-90,200) 18 | t.forward(178) 19 | t.end_fill() 20 | 21 | t.penup() 22 | t.goto(-110, 125) 23 | t.pendown() 24 | t.color("white") 25 | t.write("I Love You",font=("consolas",30,"bold")) 26 | 27 | turtle.done() -------------------------------------------------------------------------------- /Intermediate Level/Tic-Tac-Toe XO GUI.py: -------------------------------------------------------------------------------- 1 | from tkinter import * 2 | import random 3 | 4 | wn = Tk() 5 | wn.title("Tic Tac Toe - XO GUI") 6 | 7 | def next_turn(row, column): 8 | global player 9 | if buttons[row][column]['text'] == "" and check_winner() is False: 10 | if player == players[0]: 11 | buttons[row][column]['text'] = player 12 | if check_winner() is False: 13 | player = players[1] 14 | label.config(text=(players[1]+" Turn")) 15 | elif check_winner() is True: 16 | label.config(text=(players[0]+" Wins")) 17 | elif check_winner() == "Tie": 18 | label.config(text="Tie!") 19 | 20 | else: 21 | buttons[row][column]['text'] = player 22 | if check_winner() is False: 23 | player = players[0] 24 | label.config(text=(players[0]+" Turn")) 25 | elif check_winner() is True: 26 | label.config(text=(players[1]+" Wins")) 27 | elif check_winner() == "Tie": 28 | label.config(text="Tie!") 29 | 30 | def check_winner(): 31 | for row in range(3): 32 | if buttons[row][0]['text'] == buttons[row][1]['text'] == buttons[row][2]['text'] != "": 33 | buttons[row][0].config(bg="#1577c9") 34 | buttons[row][1].config(bg="#1577c9") 35 | buttons[row][2].config(bg="#1577c9") 36 | return True 37 | for column in range(3): 38 | if buttons[0][column]['text'] == buttons[1][column]['text'] == buttons[2][column]['text'] != "": 39 | buttons[0][column].config(bg="#1577c9") 40 | buttons[1][column].config(bg="#1577c9") 41 | buttons[2][column].config(bg="#1577c9") 42 | return True 43 | if buttons[0][0]['text'] == buttons[1][1]['text'] == buttons[2][2]['text'] != "": 44 | buttons[0][0].config(bg="#1577c9") 45 | buttons[1][1].config(bg="#1577c9") 46 | buttons[2][2].config(bg="#1577c9") 47 | return True 48 | elif buttons[0][2]['text'] == buttons[1][1]['text'] == buttons[2][0]['text'] != "": 49 | buttons[0][2].config(bg="#1577c9") 50 | buttons[1][1].config(bg="#1577c9") 51 | buttons[2][0].config(bg="#1577c9") 52 | return True 53 | elif empty_spaces() is False: 54 | for row in range(3): 55 | for column in range(3): 56 | buttons[row][column].config(bg="#EB4D3D") 57 | return "Tie" 58 | else: 59 | return False 60 | 61 | def empty_spaces(): 62 | spaces = 9 63 | for row in range(3): 64 | for column in range(3): 65 | if buttons[row][column]['text'] != "": 66 | spaces -= 1 67 | if spaces == 0: 68 | return False 69 | else: 70 | return True 71 | 72 | def new_game(): 73 | global player 74 | player = random.choice(players) 75 | label.config(text=player+" Turn") 76 | for row in range(3): 77 | for column in range(3): 78 | buttons[row][column].config(text="",bg="#F0F0F0") 79 | 80 | players = ["x","o"] 81 | player = random.choice(players) 82 | buttons = [[0,0,0], 83 | [0,0,0], 84 | [0,0,0]] 85 | 86 | label = Label(text=player + " Turn", font=('consolas', 40)) 87 | label.pack(side="top") 88 | 89 | reset_button = Button(text="Restart", font=('consolas', 20), command=new_game) 90 | reset_button.pack(side="top") 91 | 92 | frame = Frame(wn) 93 | frame.pack() 94 | 95 | for row in range(3): 96 | for column in range(3): 97 | buttons[row][column] = Button(frame, text="",font=('consolas', 40), width=5, height=2, 98 | command= lambda row=row, column=column: next_turn(row,column)) 99 | buttons[row][column].grid(row=row,column=column) 100 | 101 | wn.mainloop() -------------------------------------------------------------------------------- /Pro Level/Calculator GUI.py: -------------------------------------------------------------------------------- 1 | import tkinter as tk 2 | 3 | LARGE_FONT_STYLE = ("Arial", 40, "bold") 4 | SMALL_FONT_STYLE = ("Arial", 16) 5 | DIGITS_FONT_STYLE = ("Arial", 24, "bold") 6 | DEFAULT_FONT_STYLE = ("Arial", 20) 7 | 8 | OFF_WHITE = "#F8FAFF" 9 | WHITE = "#FFFFFF" 10 | LIGHT_BLUE = "#1569c7" 11 | LIGHT_GRAY = "#F5F5F5" 12 | LABEL_COLOR = "#000000" 13 | 14 | class Calculator: 15 | 16 | def __init__(self): 17 | self.wn = tk.Tk() 18 | self.wn.geometry("375x667") 19 | self.wn.resizable(0, 0) 20 | self.wn.title("Calculator GUI") 21 | self.total_expression = "" 22 | self.current_expression = "" 23 | self.display_frame = self.create_display_frame() 24 | self.total_label, self.label = self.create_display_labels() 25 | self.digits = { 26 | 7: (1, 1), 8: (1, 2), 9: (1, 3), 27 | 4: (2, 1), 5: (2, 2), 6: (2, 3), 28 | 1: (3, 1), 2: (3, 2), 3: (3, 3), 29 | 0: (4, 2), '.': (4, 1) 30 | } 31 | self.operations = {"/": "\u00F7", "*": "\u00D7", "-": "-", "+": "+"} 32 | self.buttons_frame = self.create_buttons_frame() 33 | self.buttons_frame.rowconfigure(0, weight=1) 34 | for x in range(1, 5): 35 | self.buttons_frame.rowconfigure(x, weight=1) 36 | self.buttons_frame.columnconfigure(x, weight=1) 37 | self.create_digit_buttons() 38 | self.create_operator_buttons() 39 | self.create_special_buttons() 40 | self.bind_keys() 41 | 42 | def bind_keys(self): 43 | self.wn.bind("", lambda event: self.evaluate()) 44 | for key in self.digits: 45 | self.wn.bind(str(key), lambda event, digit=key: self.add_to_expression(digit)) 46 | for key in self.operations: 47 | self.wn.bind(key, lambda event, operator=key: self.append_operator(operator)) 48 | 49 | def create_special_buttons(self): 50 | self.create_clear_button() 51 | self.create_equals_button() 52 | self.create_square_button() 53 | self.create_sqrt_button() 54 | 55 | def create_display_labels(self): 56 | total_label = tk.Label(self.display_frame, text=self.total_expression, anchor=tk.E, bg=LIGHT_GRAY, 57 | fg=LABEL_COLOR, padx=24, font=SMALL_FONT_STYLE) 58 | total_label.pack(expand=True, fill='both') 59 | label = tk.Label(self.display_frame, text=self.current_expression, anchor=tk.E, bg=LIGHT_GRAY, 60 | fg=LABEL_COLOR, padx=24, font=LARGE_FONT_STYLE) 61 | label.pack(expand=True, fill='both') 62 | return total_label, label 63 | 64 | def create_display_frame(self): 65 | frame = tk.Frame(self.wn, height=221, bg=LIGHT_GRAY) 66 | frame.pack(expand=True, fill="both") 67 | return frame 68 | 69 | def add_to_expression(self, value): 70 | self.current_expression += str(value) 71 | self.update_label() 72 | 73 | def create_digit_buttons(self): 74 | for digit, grid_value in self.digits.items(): 75 | button = tk.Button(self.buttons_frame, text=str(digit), bg=WHITE, fg=LABEL_COLOR, font=DIGITS_FONT_STYLE, 76 | borderwidth=0, command=lambda x=digit: self.add_to_expression(x)) 77 | button.grid(row=grid_value[0], column=grid_value[1], sticky=tk.NSEW) 78 | 79 | def append_operator(self, operator): 80 | self.current_expression += operator 81 | self.total_expression += self.current_expression 82 | self.current_expression = "" 83 | self.update_total_label() 84 | self.update_label() 85 | 86 | def create_operator_buttons(self): 87 | i = 0 88 | for operator, symbol in self.operations.items(): 89 | button = tk.Button(self.buttons_frame, text=symbol, bg=OFF_WHITE, fg=LABEL_COLOR, font=DEFAULT_FONT_STYLE, 90 | borderwidth=0, command=lambda x=operator: self.append_operator(x)) 91 | button.grid(row=i, column=4, sticky=tk.NSEW) 92 | i += 1 93 | 94 | def clear(self): 95 | self.current_expression = "" 96 | self.total_expression = "" 97 | self.update_label() 98 | self.update_total_label() 99 | 100 | def create_clear_button(self): 101 | button = tk.Button(self.buttons_frame, text="C", bg=OFF_WHITE, fg=LABEL_COLOR, font=DEFAULT_FONT_STYLE, 102 | borderwidth=0, command=self.clear) 103 | button.grid(row=0, column=1, sticky=tk.NSEW) 104 | 105 | def square(self): 106 | self.current_expression = str(eval(f"{self.current_expression}**2")) 107 | self.update_label() 108 | 109 | def create_square_button(self): 110 | button = tk.Button(self.buttons_frame, text="x\u00b2", bg=OFF_WHITE, fg=LABEL_COLOR, font=DEFAULT_FONT_STYLE, 111 | borderwidth=0, command=self.square) 112 | button.grid(row=0, column=2, sticky=tk.NSEW) 113 | 114 | def sqrt(self): 115 | self.current_expression = str(eval(f"{self.current_expression}**0.5")) 116 | self.update_label() 117 | 118 | def create_sqrt_button(self): 119 | button = tk.Button(self.buttons_frame, text="\u221ax", bg=OFF_WHITE, fg=LABEL_COLOR, font=DEFAULT_FONT_STYLE, 120 | borderwidth=0, command=self.sqrt) 121 | button.grid(row=0, column=3, sticky=tk.NSEW) 122 | 123 | def evaluate(self): 124 | self.total_expression += self.current_expression 125 | self.update_total_label() 126 | try: 127 | self.current_expression = str(eval(self.total_expression)) 128 | self.total_expression = "" 129 | except Exception as e: 130 | self.current_expression = "Error" 131 | finally: 132 | self.update_label() 133 | 134 | def create_equals_button(self): 135 | button = tk.Button(self.buttons_frame, text="=", bg=LIGHT_BLUE, fg=LABEL_COLOR, font=DEFAULT_FONT_STYLE, 136 | borderwidth=0, command=self.evaluate) 137 | button.grid(row=4, column=3, columnspan=2, sticky=tk.NSEW) 138 | 139 | def create_buttons_frame(self): 140 | frame = tk.Frame(self.wn) 141 | frame.pack(expand=True, fill="both") 142 | return frame 143 | 144 | def update_total_label(self): 145 | expression = self.total_expression 146 | for operator, symbol in self.operations.items(): 147 | expression = expression.replace(operator, f' {symbol} ') 148 | self.total_label.config(text=expression) 149 | 150 | def update_label(self): 151 | self.label.config(text=self.current_expression[:11]) 152 | 153 | def run(self): 154 | self.wn.mainloop() 155 | 156 | if __name__ == "__main__": 157 | calc = Calculator() 158 | calc.run() -------------------------------------------------------------------------------- /Pro Level/Snake Game GUI.py: -------------------------------------------------------------------------------- 1 | from tkinter import * 2 | import random 3 | 4 | wn = Tk() 5 | wn.title("Snake Game GUI") 6 | 7 | GAME_WIDTH = 700 8 | GAME_HEIGHT = 700 9 | SPEED = 150 10 | SPACE_SIZE = 50 11 | BODY_PARTS = 3 12 | SNAKE_COLOR = "#00FF00" 13 | FOOD_COLOR = "#FF0000" 14 | BACKGROUND_COLOR = "#000000" 15 | 16 | class Snake: 17 | 18 | def __init__(self): 19 | self.body_size = BODY_PARTS 20 | self.coordinates = [] 21 | self.squares = [] 22 | 23 | for i in range(0, BODY_PARTS): 24 | self.coordinates.append([0, 0]) 25 | 26 | for x, y in self.coordinates: 27 | square = canvas.create_rectangle(x, y, x + SPACE_SIZE, y + SPACE_SIZE, fill=SNAKE_COLOR, tag="snake") 28 | self.squares.append(square) 29 | 30 | class Food: 31 | 32 | def __init__(self): 33 | x = random.randint(0, (GAME_WIDTH / SPACE_SIZE)-1) * SPACE_SIZE 34 | y = random.randint(0, (GAME_HEIGHT / SPACE_SIZE) - 1) * SPACE_SIZE 35 | self.coordinates = [x, y] 36 | canvas.create_oval(x, y, x + SPACE_SIZE, y + SPACE_SIZE, fill=FOOD_COLOR, tag="food") 37 | 38 | def next_turn(snake, food): 39 | x, y = snake.coordinates[0] 40 | 41 | if direction == "up": 42 | y -= SPACE_SIZE 43 | elif direction == "down": 44 | y += SPACE_SIZE 45 | elif direction == "left": 46 | x -= SPACE_SIZE 47 | elif direction == "right": 48 | x += SPACE_SIZE 49 | 50 | snake.coordinates.insert(0, (x, y)) 51 | square = canvas.create_rectangle(x, y, x + SPACE_SIZE, y + SPACE_SIZE, fill=SNAKE_COLOR) 52 | snake.squares.insert(0, square) 53 | 54 | if x == food.coordinates[0] and y == food.coordinates[1]: 55 | global score 56 | score += 1 57 | label.config(text="Score:{}".format(score)) 58 | canvas.delete("food") 59 | food = Food() 60 | else: 61 | del snake.coordinates[-1] 62 | canvas.delete(snake.squares[-1]) 63 | del snake.squares[-1] 64 | if check_collisions(snake): 65 | game_over() 66 | else: 67 | wn.after(SPEED, next_turn, snake, food) 68 | 69 | def change_direction(new_direction): 70 | global direction 71 | if new_direction == "left": 72 | if direction != "right": 73 | direction = new_direction 74 | elif new_direction == "right": 75 | if direction != "left": 76 | direction = new_direction 77 | elif new_direction == "up": 78 | if direction != "down": 79 | direction = new_direction 80 | elif new_direction == "down": 81 | if direction != "up": 82 | direction = new_direction 83 | 84 | def check_collisions(snake): 85 | x, y = snake.coordinates[0] 86 | if x < 0 or x >= GAME_WIDTH: 87 | return True 88 | elif y < 0 or y >= GAME_HEIGHT: 89 | return True 90 | for body_part in snake.coordinates[1:]: 91 | if x == body_part[0] and y == body_part[1]: 92 | return True 93 | return False 94 | 95 | def game_over(): 96 | canvas.delete(ALL) 97 | canvas.create_text(canvas.winfo_width()/2, canvas.winfo_height()/2, 98 | font=("consolas",70), text="GAME OVER !", fill="red", tag="gameover") 99 | 100 | wn.resizable(False, False) 101 | score = 0 102 | direction = "down" 103 | 104 | label = Label(wn, text="Score : {}".format(score), font=("consolas", 40)) 105 | label.pack() 106 | canvas = Canvas(wn, bg=BACKGROUND_COLOR, height=GAME_HEIGHT, width=GAME_WIDTH) 107 | canvas.pack() 108 | 109 | wn.update() 110 | 111 | wn_width = wn.winfo_width() 112 | wn_height = wn.winfo_height() 113 | screen_width = wn.winfo_screenwidth() 114 | screen_height = wn.winfo_screenheight() 115 | 116 | x = int((screen_width/2) - (wn_width/2)) 117 | y = int((screen_height/2) - (wn_height/2)) 118 | wn.geometry(f"{wn_width}x{wn_height}+{x}+{y}") 119 | 120 | wn.bind("", lambda event: change_direction("left")) 121 | wn.bind("", lambda event: change_direction("right")) 122 | wn.bind("", lambda event: change_direction("up")) 123 | wn.bind("", lambda event: change_direction("down")) 124 | 125 | snake = Snake() 126 | food = Food() 127 | next_turn(snake, food) 128 | 129 | wn.mainloop() 130 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PythonProjects 2 | مستودع يحتوي على مشاريع مفتوحة المصدر بلغة بايثون، مستوى مبتدئ ومتوسط وإحترافي. 3 | --------------------------------------------------------------------------------