This site is developed to XHTML and CSS2 W3C standards.
If you see this paragraph, your browser does not support those standards and you
need to upgrade. Visit WaSP
for a variety of options.
Paste #676
Posted by: BitByByte
Posted on: 2026-04-16 18:40:44
Age: 8 hrs ago
Views: 5
import tkinter as tk
from tkinter import messagebox, filedialog
class CrosswordApp:
def __init__(self):
self.root = tk.Tk()
self.root.title("Кроссворд")
self.root.geometry("700x620")
self.root.resizable(False, False)
top_frame = tk.Frame(self.root, padx=10, pady=10)
top_frame.pack(fill="x")
tk.Label(top_frame, text="Генератор кроссворда",
font=("Arial", 12, "bold")).pack()
tk.Label(top_frame, text="Центральное слово:").pack(anchor="w")
self.central_entry = tk.Entry(top_frame, width=40)
self.central_entry.pack()
tk.Button(top_frame, text="OK",
command=self.set_central_word).pack(pady=3)
middle = tk.Frame(self.root)
middle.pack()
self.words_text = tk.Text(middle, width=30, height=8)
self.words_text.grid(row=0, column=0, padx=5)
self.clues_text = tk.Text(middle, width=30, height=8)
self.clues_text.grid(row=0, column=1, padx=5)
tk.Button(self.root, text="СГЕНЕРИРОВАТЬ",
command=self.generate_crossword).pack(pady=5)
tk.Button(self.root, text="СОХРАНИТЬ SVG",
command=self.export_svg).pack(pady=5)
self.canvas = tk.Canvas(self.root, width=650, height=300, bg="white")
self.canvas.pack()
self.central_word = None
self.grid = {}
self.root.mainloop()
def set_central_word(self):
word = self.central_entry.get().strip().upper()
if not word.isalpha():
messagebox.showerror("Ошибка", "Только буквы!")
return
self.central_word = word
def generate_crossword(self):
if not self.central_word:
messagebox.showerror("Ошибка", "Нет центрального слова")
return
words = []
for w in self.words_text.get("1.0", tk.END).splitlines():
w = w.strip().upper()
if w.isalpha():
words.append(w)
grid = {}
mid_col = 10
start_row = 2
for i, ch in enumerate(self.central_word):
grid[(start_row + i, mid_col)] = ch
for i, word in enumerate(words):
if i >= len(self.central_word):
break
letter = self.central_word[i]
if letter in word:
idx = word.index(letter)
row = start_row + i
for j, ch in enumerate(word):
grid[(row, mid_col - idx + j)] = ch
self.grid = grid
# рисуем
self.canvas.delete("all")
size = 25
for (r, c), ch in grid.items():
x = c * size
y = r * size
self.canvas.create_rectangle(x, y, x+size, y+size)
self.canvas.create_text(x+12, y+12, text=ch)
def export_svg(self):
if not self.grid:
messagebox.showerror("Ошибка", "Сначала сгенерируй")
return
filename = filedialog.asksaveasfilename(defaultextension=".svg")
if not filename:
return
rows = [r for r, c in self.grid.keys()]
cols = [c for r, c in self.grid.keys()]
min_r = min(rows)
min_c = min(cols)
max_r = max(rows)
max_c = max(cols)
size = 40
padding = 20
width = (max_c - min_c + 1) * size + padding * 2
height = (max_r - min_r + 1) * size + padding * 2
svg = '<?xml version="1.0" encoding="UTF-8" standalone="no"?>\n'
svg += '<svg xmlns="http://www.w3.org/2000/svg" '
svg += 'width="{0}" height="{1}" viewBox="0 0 {0} {1}">\n'.format(width, height)
# сетка
for (r, c), ch in self.grid.items():
x = (c - min_c) * size + padding
y = (r - min_r) * size + padding
svg += '<rect x="{0}" y="{1}" width="{2}" height="{2}" fill="white" stroke="black" stroke-width="2"/>\n'.format(x, y, size)
svg += '<text x="{0}" y="{1}" font-size="18" text-anchor="middle" fill="black">{2}</text>\n'.format(
x + size/2,
y + size/2 + 6,
ch
)
svg += '</svg>'
try:
f = open(filename, "w", encoding="utf-8")
f.write(svg)
f.close()
messagebox.showinfo("OK", "SVG сохранён")
except Exception as e:
messagebox.showerror("Ошибка", str(e))
if __name__ == "__main__":
CrosswordApp()
Download raw |
Create new paste