Amazing-Python-Scripts
278 строк · 7.6 Кб
1import turtle
2import tkinter as tk
3from tkinter import colorchooser, simpledialog, messagebox
4
5turtle.setup(width=800, height=600)
6turtle.speed(0)
7turtle.title("Pixel Art Generator")
8
9
10def draw_pixel(x, y, color, size):
11turtle.penup()
12turtle.goto(x - size // 2, y - size // 2)
13turtle.pendown()
14turtle.dot(size, color)
15
16
17def draw_square(x, y, color, size, fill=False):
18turtle.penup()
19turtle.goto(x - size // 2, y - size // 2)
20turtle.pendown()
21if fill:
22turtle.fillcolor(color)
23turtle.begin_fill()
24for _ in range(4):
25turtle.forward(size)
26turtle.left(90)
27if fill:
28turtle.end_fill()
29
30
31def draw_circle(x, y, color, size, fill=False):
32turtle.penup()
33turtle.goto(x, y - size // 2)
34turtle.pendown()
35if fill:
36turtle.fillcolor(color)
37turtle.begin_fill()
38turtle.circle(size // 2)
39if fill:
40turtle.end_fill()
41
42
43def draw_triangle(x, y, color, size, fill=False):
44turtle.penup()
45turtle.goto(x, y - size // 2)
46turtle.pendown()
47if fill:
48turtle.fillcolor(color)
49turtle.begin_fill()
50for _ in range(3):
51turtle.forward(size)
52turtle.left(120)
53if fill:
54turtle.end_fill()
55
56
57def draw_diamond(x, y, color, size, fill=False):
58turtle.penup()
59turtle.goto(x, y - size // 2)
60turtle.pendown()
61if fill:
62turtle.fillcolor(color)
63turtle.begin_fill()
64for _ in range(2):
65turtle.forward(size)
66turtle.left(45)
67turtle.forward(size)
68turtle.left(135)
69if fill:
70turtle.end_fill()
71
72
73def draw_heart(x, y, color, size, fill=False):
74turtle.penup()
75turtle.goto(x, y - size // 2)
76turtle.pendown()
77if fill:
78turtle.fillcolor(color)
79turtle.begin_fill()
80turtle.left(50)
81turtle.forward(size)
82turtle.circle(size // 2, 180)
83turtle.right(140)
84turtle.circle(size // 2, 180)
85turtle.forward(size)
86if fill:
87turtle.end_fill()
88
89
90def draw_polygon(x, y, color, size, sides, fill=False):
91turtle.penup()
92turtle.goto(x, y - size // 2)
93turtle.pendown()
94if fill:
95turtle.fillcolor(color)
96turtle.begin_fill()
97angle = 360 / sides
98for _ in range(sides):
99turtle.forward(size)
100turtle.left(angle)
101if fill:
102turtle.end_fill()
103
104
105def draw_line(x, y, color, size, thickness):
106turtle.penup()
107turtle.goto(x - size // 2, y)
108turtle.pendown()
109turtle.pensize(thickness)
110turtle.pencolor(color)
111turtle.forward(size)
112
113
114def draw_star(x, y, color, size, points, fill=False):
115turtle.penup()
116turtle.goto(x, y - size // 2)
117turtle.pendown()
118if fill:
119turtle.fillcolor(color)
120turtle.begin_fill()
121for _ in range(points):
122turtle.forward(size)
123turtle.right(144)
124if fill:
125turtle.end_fill()
126
127
128def draw_spiral(x, y, color, size, loops):
129turtle.penup()
130turtle.goto(x, y - size // 2)
131turtle.pendown()
132turtle.pencolor(color)
133for _ in range(loops * 36):
134turtle.forward(size / 20)
135turtle.right(10)
136
137
138def set_background_color():
139color = colorchooser.askcolor(title="Choose a background color")
140if color[1] is not None:
141turtle.bgcolor(color[1])
142
143
144def set_pen_style():
145pen_style = simpledialog.askstring(
146"Pen Style", "Enter the pen style (solid/dashed/dotted):")
147if pen_style in ['solid', 'dashed', 'dotted']:
148turtle.pensize(1)
149if pen_style == 'dashed':
150turtle.pendown()
151turtle.pendown(1, 3)
152elif pen_style == 'dotted':
153turtle.pendown()
154turtle.pendown(1, 1)
155
156
157def get_color():
158color = colorchooser.askcolor(title="Choose a color")
159if color[1] is not None:
160return color[1]
161else:
162return None
163
164
165def get_size():
166size = simpledialog.askinteger(
167"Size", "Enter the size (5-50):", minvalue=5, maxvalue=50)
168return size
169
170
171def get_thickness():
172thickness = simpledialog.askinteger(
173"Thickness", "Enter the thickness (1-10):", minvalue=1, maxvalue=10)
174return thickness
175
176
177def get_sides():
178sides = simpledialog.askinteger(
179"Sides", "Enter the number of sides (3-10):", minvalue=3, maxvalue=10)
180return sides
181
182
183def main():
184turtle.speed(0)
185turtle.title("Pixel Art Generator")
186turtle.setup(800, 600)
187
188canvas = turtle.Screen()
189canvas.bgcolor("white")
190
191while True:
192pattern = tk.simpledialog.askstring(
193"Pattern", "Choose a pattern (square/circle/triangle/diamond/heart/polygon/line/star/spiral/clear/save/background/pen_style/exit):")
194if pattern == 'exit':
195break
196
197if pattern == 'clear':
198turtle.clear()
199canvas.update()
200continue
201elif pattern == 'save':
202file_path = tk.filedialog.asksaveasfilename(
203defaultextension=".png", filetypes=[("PNG files", "*.png")])
204if file_path:
205canvas.getcanvas().postscript(file=file_path + ".eps")
206canvas.update()
207messagebox.showinfo(
208"Saved", f"Pixel art saved as {file_path}.png")
209continue
210elif pattern == 'background':
211set_background_color()
212continue
213elif pattern == 'pen_style':
214set_pen_style()
215continue
216
217color = get_color()
218if color is None:
219break
220
221size = get_size()
222if not size:
223break
224
225if pattern == 'square':
226fill = messagebox.askyesno("Fill", "Fill the square with color?")
227draw_func = draw_square
228elif pattern == 'circle':
229fill = messagebox.askyesno("Fill", "Fill the circle with color?")
230draw_func = draw_circle
231elif pattern == 'triangle':
232fill = messagebox.askyesno("Fill", "Fill the triangle with color?")
233draw_func = draw_triangle
234elif pattern == 'diamond':
235fill = messagebox.askyesno("Fill", "Fill the diamond with color?")
236draw_func = draw_diamond
237elif pattern == 'heart':
238fill = messagebox.askyesno("Fill", "Fill the heart with color?")
239draw_func = draw_heart
240elif pattern == 'polygon':
241sides = get_sides()
242if not sides:
243break
244fill = messagebox.askyesno("Fill", "Fill the polygon with color?")
245draw_func = draw_polygon
246elif pattern == 'line':
247thickness = get_thickness()
248if not thickness:
249break
250draw_func = draw_line
251canvas.onclick(lambda x, y: draw_func(
252x, y, color, size, thickness))
253continue
254elif pattern == 'star':
255points = simpledialog.askinteger(
256"Points", "Enter the number of points (5-20):", minvalue=5, maxvalue=20)
257if not points:
258break
259fill = messagebox.askyesno("Fill", "Fill the star with color?")
260draw_func = draw_star
261elif pattern == 'spiral':
262loops = simpledialog.askinteger(
263"Loops", "Enter the number of loops (1-20):", minvalue=1, maxvalue=20)
264if not loops:
265break
266draw_func = draw_spiral
267
268if pattern != 'line' and pattern != 'star' and pattern != 'spiral':
269canvas.onclick(lambda x, y: draw_func(x, y, color, size, fill))
270else:
271canvas.onclick(lambda x, y: draw_func(
272x, y, color, size, points if pattern == 'star' else loops))
273
274turtle.done()
275
276
277if __name__ == "__main__":
278main()
279