Amazing-Python-Scripts

Форк
0
278 строк · 7.6 Кб
1
import turtle
2
import tkinter as tk
3
from tkinter import colorchooser, simpledialog, messagebox
4

5
turtle.setup(width=800, height=600)
6
turtle.speed(0)
7
turtle.title("Pixel Art Generator")
8

9

10
def draw_pixel(x, y, color, size):
11
    turtle.penup()
12
    turtle.goto(x - size // 2, y - size // 2)
13
    turtle.pendown()
14
    turtle.dot(size, color)
15

16

17
def draw_square(x, y, color, size, fill=False):
18
    turtle.penup()
19
    turtle.goto(x - size // 2, y - size // 2)
20
    turtle.pendown()
21
    if fill:
22
        turtle.fillcolor(color)
23
        turtle.begin_fill()
24
    for _ in range(4):
25
        turtle.forward(size)
26
        turtle.left(90)
27
    if fill:
28
        turtle.end_fill()
29

30

31
def draw_circle(x, y, color, size, fill=False):
32
    turtle.penup()
33
    turtle.goto(x, y - size // 2)
34
    turtle.pendown()
35
    if fill:
36
        turtle.fillcolor(color)
37
        turtle.begin_fill()
38
    turtle.circle(size // 2)
39
    if fill:
40
        turtle.end_fill()
41

42

43
def draw_triangle(x, y, color, size, fill=False):
44
    turtle.penup()
45
    turtle.goto(x, y - size // 2)
46
    turtle.pendown()
47
    if fill:
48
        turtle.fillcolor(color)
49
        turtle.begin_fill()
50
    for _ in range(3):
51
        turtle.forward(size)
52
        turtle.left(120)
53
    if fill:
54
        turtle.end_fill()
55

56

57
def draw_diamond(x, y, color, size, fill=False):
58
    turtle.penup()
59
    turtle.goto(x, y - size // 2)
60
    turtle.pendown()
61
    if fill:
62
        turtle.fillcolor(color)
63
        turtle.begin_fill()
64
    for _ in range(2):
65
        turtle.forward(size)
66
        turtle.left(45)
67
        turtle.forward(size)
68
        turtle.left(135)
69
    if fill:
70
        turtle.end_fill()
71

72

73
def draw_heart(x, y, color, size, fill=False):
74
    turtle.penup()
75
    turtle.goto(x, y - size // 2)
76
    turtle.pendown()
77
    if fill:
78
        turtle.fillcolor(color)
79
        turtle.begin_fill()
80
    turtle.left(50)
81
    turtle.forward(size)
82
    turtle.circle(size // 2, 180)
83
    turtle.right(140)
84
    turtle.circle(size // 2, 180)
85
    turtle.forward(size)
86
    if fill:
87
        turtle.end_fill()
88

89

90
def draw_polygon(x, y, color, size, sides, fill=False):
91
    turtle.penup()
92
    turtle.goto(x, y - size // 2)
93
    turtle.pendown()
94
    if fill:
95
        turtle.fillcolor(color)
96
        turtle.begin_fill()
97
    angle = 360 / sides
98
    for _ in range(sides):
99
        turtle.forward(size)
100
        turtle.left(angle)
101
    if fill:
102
        turtle.end_fill()
103

104

105
def draw_line(x, y, color, size, thickness):
106
    turtle.penup()
107
    turtle.goto(x - size // 2, y)
108
    turtle.pendown()
109
    turtle.pensize(thickness)
110
    turtle.pencolor(color)
111
    turtle.forward(size)
112

113

114
def draw_star(x, y, color, size, points, fill=False):
115
    turtle.penup()
116
    turtle.goto(x, y - size // 2)
117
    turtle.pendown()
118
    if fill:
119
        turtle.fillcolor(color)
120
        turtle.begin_fill()
121
    for _ in range(points):
122
        turtle.forward(size)
123
        turtle.right(144)
124
    if fill:
125
        turtle.end_fill()
126

127

128
def draw_spiral(x, y, color, size, loops):
129
    turtle.penup()
130
    turtle.goto(x, y - size // 2)
131
    turtle.pendown()
132
    turtle.pencolor(color)
133
    for _ in range(loops * 36):
134
        turtle.forward(size / 20)
135
        turtle.right(10)
136

137

138
def set_background_color():
139
    color = colorchooser.askcolor(title="Choose a background color")
140
    if color[1] is not None:
141
        turtle.bgcolor(color[1])
142

143

144
def set_pen_style():
145
    pen_style = simpledialog.askstring(
146
        "Pen Style", "Enter the pen style (solid/dashed/dotted):")
147
    if pen_style in ['solid', 'dashed', 'dotted']:
148
        turtle.pensize(1)
149
        if pen_style == 'dashed':
150
            turtle.pendown()
151
            turtle.pendown(1, 3)
152
        elif pen_style == 'dotted':
153
            turtle.pendown()
154
            turtle.pendown(1, 1)
155

156

157
def get_color():
158
    color = colorchooser.askcolor(title="Choose a color")
159
    if color[1] is not None:
160
        return color[1]
161
    else:
162
        return None
163

164

165
def get_size():
166
    size = simpledialog.askinteger(
167
        "Size", "Enter the size (5-50):", minvalue=5, maxvalue=50)
168
    return size
169

170

171
def get_thickness():
172
    thickness = simpledialog.askinteger(
173
        "Thickness", "Enter the thickness (1-10):", minvalue=1, maxvalue=10)
174
    return thickness
175

176

177
def get_sides():
178
    sides = simpledialog.askinteger(
179
        "Sides", "Enter the number of sides (3-10):", minvalue=3, maxvalue=10)
180
    return sides
181

182

183
def main():
184
    turtle.speed(0)
185
    turtle.title("Pixel Art Generator")
186
    turtle.setup(800, 600)
187

188
    canvas = turtle.Screen()
189
    canvas.bgcolor("white")
190

191
    while True:
192
        pattern = tk.simpledialog.askstring(
193
            "Pattern", "Choose a pattern (square/circle/triangle/diamond/heart/polygon/line/star/spiral/clear/save/background/pen_style/exit):")
194
        if pattern == 'exit':
195
            break
196

197
        if pattern == 'clear':
198
            turtle.clear()
199
            canvas.update()
200
            continue
201
        elif pattern == 'save':
202
            file_path = tk.filedialog.asksaveasfilename(
203
                defaultextension=".png", filetypes=[("PNG files", "*.png")])
204
            if file_path:
205
                canvas.getcanvas().postscript(file=file_path + ".eps")
206
                canvas.update()
207
                messagebox.showinfo(
208
                    "Saved", f"Pixel art saved as {file_path}.png")
209
            continue
210
        elif pattern == 'background':
211
            set_background_color()
212
            continue
213
        elif pattern == 'pen_style':
214
            set_pen_style()
215
            continue
216

217
        color = get_color()
218
        if color is None:
219
            break
220

221
        size = get_size()
222
        if not size:
223
            break
224

225
        if pattern == 'square':
226
            fill = messagebox.askyesno("Fill", "Fill the square with color?")
227
            draw_func = draw_square
228
        elif pattern == 'circle':
229
            fill = messagebox.askyesno("Fill", "Fill the circle with color?")
230
            draw_func = draw_circle
231
        elif pattern == 'triangle':
232
            fill = messagebox.askyesno("Fill", "Fill the triangle with color?")
233
            draw_func = draw_triangle
234
        elif pattern == 'diamond':
235
            fill = messagebox.askyesno("Fill", "Fill the diamond with color?")
236
            draw_func = draw_diamond
237
        elif pattern == 'heart':
238
            fill = messagebox.askyesno("Fill", "Fill the heart with color?")
239
            draw_func = draw_heart
240
        elif pattern == 'polygon':
241
            sides = get_sides()
242
            if not sides:
243
                break
244
            fill = messagebox.askyesno("Fill", "Fill the polygon with color?")
245
            draw_func = draw_polygon
246
        elif pattern == 'line':
247
            thickness = get_thickness()
248
            if not thickness:
249
                break
250
            draw_func = draw_line
251
            canvas.onclick(lambda x, y: draw_func(
252
                x, y, color, size, thickness))
253
            continue
254
        elif pattern == 'star':
255
            points = simpledialog.askinteger(
256
                "Points", "Enter the number of points (5-20):", minvalue=5, maxvalue=20)
257
            if not points:
258
                break
259
            fill = messagebox.askyesno("Fill", "Fill the star with color?")
260
            draw_func = draw_star
261
        elif pattern == 'spiral':
262
            loops = simpledialog.askinteger(
263
                "Loops", "Enter the number of loops (1-20):", minvalue=1, maxvalue=20)
264
            if not loops:
265
                break
266
            draw_func = draw_spiral
267

268
        if pattern != 'line' and pattern != 'star' and pattern != 'spiral':
269
            canvas.onclick(lambda x, y: draw_func(x, y, color, size, fill))
270
        else:
271
            canvas.onclick(lambda x, y: draw_func(
272
                x, y, color, size, points if pattern == 'star' else loops))
273

274
    turtle.done()
275

276

277
if __name__ == "__main__":
278
    main()
279

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.