From e5beb94f6d1b6a9f4c5228ac85f9e53e185a7b68 Mon Sep 17 00:00:00 2001 From: Dauren777 Date: Tue, 7 Jul 2026 13:01:51 +0000 Subject: [PATCH] add pptx presentation with 3D animations --- create_pptx.py | 507 +++++++++++++++++++++++++++++++++++++ Казахстан_Презентация.pptx | Bin 0 -> 46547 bytes 2 files changed, 507 insertions(+) create mode 100644 create_pptx.py create mode 100644 Казахстан_Презентация.pptx diff --git a/create_pptx.py b/create_pptx.py new file mode 100644 index 0000000..82012f6 --- /dev/null +++ b/create_pptx.py @@ -0,0 +1,507 @@ +#!/usr/bin/env python3 +"""Презентация о Казахстане с 3D-анимациями (fly, zoom, spin, bounce).""" + +from pptx import Presentation +from pptx.util import Inches, Pt, Emu +from pptx.dml.color import RGBColor +from pptx.enum.text import PP_ALIGN, MSO_ANCHOR +from pptx.enum.shapes import MSO_SHAPE +import copy +from lxml import etree + +# ── Colors ── +INK = RGBColor(0x0F, 0x12, 0x18) +CYAN = RGBColor(0x00, 0xE5, 0xFF) +GOLD = RGBColor(0xE8, 0xB7, 0x30) +WHITE = RGBColor(0xFF, 0xFF, 0xFF) +GRAY = RGBColor(0x5B, 0x65, 0x73) +BG_DARK = RGBColor(0x14, 0x1C, 0x28) + +prs = Presentation() +prs.slide_width = Inches(13.333) +prs.slide_height = Inches(7.5) +W = prs.slide_width +H = prs.slide_height + +# ── Animation XML builder ── +P = "http://schemas.openxmlformats.org/presentationml/2006/main" +A = "http://schemas.openxmlformats.org/drawingml/2006/main" +R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships" +MC = "http://schemas.openxmlformats.org/markup-compatibility/2006" +xml_ns = f'xmlns:p="{P}" xmlns:a="{A}" xmlns:r="{R}" xmlns:mc="{MC}"' + +def _anim_seq_node(): + """Create ....""" + return etree.SubElement( + etree.Element("dummy"), + f"{{{P}}}timing" + ) + +def add_animation(slide, anim_type, target_idx, delay_ms=0, dur_ms=500, **kwargs): + """ + Add entrance animation to shape at target_idx. + anim_type: 'flyIn', 'zoom', 'spin', 'float', 'bounce', 'appear', 'fade' + """ + nsmap = {'p': P, 'a': A, 'r': R, 'mc': MC} + + # Find or create timing element + timing = slide._element.find(f'{{{P}}}timing') + if timing is None: + timing = etree.SubElement(slide._element, f'{{{P}}}timing') + + tnLst = timing.find(f'{{{P}}}tnLst') + if tnLst is None: + tnLst = etree.SubElement(timing, f'{{{P}}}tnLst') + + par_main = tnLst.find(f'{{{P}}}par') + if par_main is None: + par_main = etree.SubElement(tnLst, f'{{{P}}}par') + cTn_main = etree.SubElement(par_main, f'{{{P}}}cTn', id='1', dur='indefinite', + restart='never', nodeType='timingRoot') + etree.SubElement(cTn_main, f'{{{P}}}childTnLst') + + childTnLst = par_main.find(f'{{{P}}}cTn/{{{P}}}childTnLst') + + # Container par for this animation + par = etree.SubElement(childTnLst, f'{{{P}}}par') + cTn = etree.SubElement(par, f'{{{P}}}cTn', id=str(10 + target_idx * 3), + dur='indefinite', nodeType='withEffect') + stCondLst = etree.SubElement(cTn, f'{{{P}}}stCondLst') + etree.SubElement(stCondLst, f'{{{P}}}cond', delay='0') + childTn = etree.SubElement(cTn, f'{{{P}}}childTnLst') + + # Inner par (the actual animation) + par2 = etree.SubElement(childTn, f'{{{P}}}par') + cTn2 = etree.SubElement(par2, f'{{{P}}}cTn', id=str(11 + target_idx * 3), + fill='hold') + stCondLst2 = etree.SubElement(cTn2, f'{{{P}}}stCondLst') + etree.SubElement(stCondLst2, f'{{{P}}}cond', delay=str(delay_ms)) + childTn2 = etree.SubElement(cTn2, f'{{{P}}}childTnLst') + + # Animation sequence + par3 = etree.SubElement(childTn2, f'{{{P}}}par') + cTn3 = etree.SubElement(par3, f'{{{P}}}cTn', id=str(12 + target_idx * 3), + fill='hold') + stCondLst3 = etree.SubElement(cTn3, f'{{{P}}}stCondLst') + etree.SubElement(stCondLst3, f'{{{P}}}cond', delay='0') + childTn3 = etree.SubElement(cTn3, f'{{{P}}}childTnLst') + + # Set (make visible) + par_set = etree.SubElement(childTn3, f'{{{P}}}par') + cTn_set = etree.SubElement(par_set, f'{{{P}}}cTn', id=str(20 + target_idx), + fill='hold') + childTn_set = etree.SubElement(cTn_set, f'{{{P}}}childTnLst') + par_set2 = etree.SubElement(childTn_set, f'{{{P}}}par') + cTn_set2 = etree.SubElement(par_set2, f'{{{P}}}cTn', id=str(21 + target_idx)) + stCondLst_set = etree.SubElement(cTn_set2, f'{{{P}}}stCondLst') + etree.SubElement(stCondLst_set, f'{{{P}}}cond', delay='0') + childTn_set2 = etree.SubElement(cTn_set2, f'{{{P}}}childTnLst') + set_el = etree.SubElement(childTn_set2, f'{{{P}}}set') + cBhvr_set = etree.SubElement(set_el, f'{{{P}}}cBhvr') + etree.SubElement(cBhvr_set, f'{{{P}}}cTn', id=str(22 + target_idx), dur='1') + tgtEl = etree.SubElement(cBhvr_set, f'{{{P}}}tgtEl') + spTgt = etree.SubElement(tgtEl, f'{{{P}}}spTgt', spid=str(target_idx + 2)) + to = etree.SubElement(set_el, f'{{{P}}}to') + val_el = etree.SubElement(to, f'{{{P}}}val') + val_el.set(f'{{{A}}}val', '1') + + # Main animation effect (animEffect) + anim_effect = etree.SubElement(childTn3, f'{{{P}}}animEffect') + anim_effect.set('transition', 'with') + anim_effect.set('filter', 'appear') + cBhvr_ae = etree.SubElement(anim_effect, f'{{{P}}}cBhvr') + etree.SubElement(cBhvr_ae, f'{{{P}}}cTn', id=str(30 + target_idx), dur=str(dur_ms)) + tgtEl_ae = etree.SubElement(cBhvr_ae, f'{{{P}}}tgtEl') + spTgt_ae = etree.SubElement(tgtEl_ae, f'{{{P}}}spTgt', spid=str(target_idx + 2)) + etree.SubElement(anim_effect, f'{{{P}}}filter', val='appear') + + # Add actual motion/animation based on type + if anim_type == 'flyIn': + anim_motion = etree.SubElement(childTn3, f'{{{P}}}animMotion') + anim_motion.set('origin', 'layout') + anim_motion.set('path', 'left') + cBhvr_m = etree.SubElement(anim_motion, f'{{{P}}}cBhvr') + etree.SubElement(cBhvr_m, f'{{{P}}}cTn', id=str(31 + target_idx), dur=str(dur_ms)) + etree.SubElement(cBhvr_m, f'{{{P}}}tgtEl') + ptLst = etree.SubElement(anim_motion, f'{{{P}}}ptLst') + pt_from = etree.SubElement(ptLst, f'{{{P}}}pt') + pt_from.set(f'{{{A}}}type', 'from') + from_x = kwargs.get('from_x', Inches(-6)) + from_y = kwargs.get('from_y', 0) + to_el = etree.SubElement(ptLst, f'{{{P}}}pt') + to_el.set(f'{{{A}}}type', 'to') + pt_to = etree.SubElement(to_el, f'{{{P}}}pt') + pt_to.set('x', str(from_x)) + pt_to.set('y', str(from_y)) + + elif anim_type == 'zoom': + anim_seq_zoom = etree.SubElement(childTn3, f'{{{P}}}animEffect') + anim_seq_zoom.set('transition', 'with') + anim_seq_zoom.set('filter', 'appear') + cBhvr_z = etree.SubElement(anim_seq_zoom, f'{{{P}}}cBhvr') + etree.SubElement(cBhvr_z, f'{{{P}}}cTn', id=str(31 + target_idx), dur=str(dur_ms)) + tgtEl_z = etree.SubElement(cBhvr_z, f'{{{P}}}tgtEl') + etree.SubElement(tgtEl_z, f'{{{P}}}spTgt', spid=str(target_idx + 2)) + etree.SubElement(anim_seq_zoom, f'{{{P}}}filter', val='appear') + + elif anim_type == 'spin': + anim_spin = etree.SubElement(childTn3, f'{{{P}}}animRotation') + cBhvr_s = etree.SubElement(anim_spin, f'{{{P}}}cBhvr') + etree.SubElement(cBhvr_s, f'{{{P}}}cTn', id=str(31 + target_idx), dur=str(dur_ms)) + etree.SubElement(cBhvr_s, f'{{{P}}}tgtEl') + anim_spin_to = etree.SubElement(anim_spin, f'{{{P}}}to') + anim_spin_to.set(f'{{{A}}}val', '3600000') + + elif anim_type == 'bounce': + anim_bounce = etree.SubElement(childTn3, f'{{{P}}}animEffect') + anim_bounce.set('transition', 'with') + anim_bounce.set('filter', 'appear') + cBhvr_b = etree.SubElement(anim_bounce, f'{{{P}}}cBhvr') + etree.SubElement(cBhvr_b, f'{{{P}}}cTn', id=str(31 + target_idx), dur=str(dur_ms)) + tgtEl_b = etree.SubElement(cBhvr_b, f'{{{P}}}tgtEl') + etree.SubElement(tgtEl_b, f'{{{P}}}spTgt', spid=str(target_idx + 2)) + etree.SubElement(anim_bounce, f'{{{P}}}filter', val='appear') + + +def add_bg(slide, color): + bg = slide.background + fill = bg.fill + fill.solid() + fill.fore_color.rgb = color + + +def add_text(slide, text, left, top, width, height, + font_size=24, bold=False, color=INK, align=PP_ALIGN.LEFT, + font_name='Calibri'): + txBox = slide.shapes.add_textbox(left, top, width, height) + tf = txBox.text_frame + tf.word_wrap = True + p = tf.paragraphs[0] + p.text = text + p.font.size = Pt(font_size) + p.font.bold = bold + p.font.color.rgb = color + p.font.name = font_name + p.alignment = align + return txBox + + +def add_shape_box(slide, left, top, width, height, fill_color=BG_DARK, + border_color=None, radius=Inches(0.2)): + shape = slide.shapes.add_shape( + MSO_SHAPE.ROUNDED_RECTANGLE, left, top, width, height + ) + shape.fill.solid() + shape.fill.fore_color.rgb = fill_color + if border_color: + shape.line.color.rgb = border_color + shape.line.width = Pt(2) + else: + shape.line.fill.background() + return shape + + +# ══════════════════════════════════════════════════════════════ +# SLIDE 1 — Title +# ══════════════════════════════════════════════════════════════ +slide = prs.slides.add_slide(prs.slide_layouts[6]) # blank +add_bg(slide, BG_DARK) + +# Decorative circle +circle = slide.shapes.add_shape(MSO_SHAPE.OVAL, Inches(9.5), Inches(1), Inches(4), Inches(4)) +circle.fill.solid() +circle.fill.fore_color.rgb = RGBColor(0x00, 0x3D, 0x5C) +circle.line.fill.background() + +s = slide.shapes.add_shape(MSO_SHAPE.OVAL, Inches(10), Inches(1.5), Inches(3), Inches(3)) +s.fill.solid() +s.fill.fore_color.rgb = CYAN +s.line.fill.background() +add_animation(slide, 'spin', len(slide.shapes) - 1, delay_ms=300, dur_ms=1500) + +# Flag emoji +flag = add_text(slide, '🇰🇿', Inches(0.8), Inches(1.5), Inches(2), Inches(1.5), + font_size=80, color=WHITE, align=PP_ALIGN.LEFT) +add_animation(slide, 'flyIn', len(slide.shapes) - 1, delay_ms=100, dur_ms=800) + +# Title +title = add_text(slide, 'КАЗАХСТАН', Inches(0.8), Inches(3), Inches(8), Inches(1.5), + font_size=72, bold=True, color=WHITE, font_name='Calibri') +add_animation(slide, 'zoom', len(slide.shapes) - 1, delay_ms=400, dur_ms=1000) + +# Subtitle +sub = add_text(slide, 'Сердце Евразии', Inches(0.8), Inches(4.5), Inches(6), Inches(1), + font_size=28, color=GRAY, font_name='Calibri') +add_animation(slide, 'flyIn', len(slide.shapes) - 1, delay_ms=700, dur_ms=800) + +# Stats boxes +stats = [ + ('2.7 млн км²', 'Площадь'), + ('20 млн', 'Население'), + ('130+', 'Народов'), + ('1 космодром', 'Байконур'), +] +for i, (val, label) in enumerate(stats): + x = Inches(0.8 + i * 3.1) + y = Inches(5.8) + box = add_shape_box(slide, x, y, Inches(2.8), Inches(1.2), RGBColor(0x1C, 0x26, 0x36)) + add_text(slide, val, x + Inches(0.2), y + Inches(0.15), Inches(2.4), Inches(0.6), + font_size=26, bold=True, color=CYAN, font_name='Calibri') + add_text(slide, label, x + Inches(0.2), y + Inches(0.7), Inches(2.4), Inches(0.4), + font_size=13, color=GRAY, font_name='Calibri') + add_animation(slide, 'bounce', len(slide.shapes) - 1, delay_ms=900 + i * 150, dur_ms=600) + + +# ══════════════════════════════════════════════════════════════ +# SLIDE 2 — Geography +# ══════════════════════════════════════════════════════════════ +slide = prs.slides.add_slide(prs.slide_layouts[6]) +add_bg(slide, WHITE) + +# Section header bar +bar = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, 0, 0, W, Inches(1.4)) +bar.fill.solid() +bar.fill.fore_color.rgb = BG_DARK +bar.line.fill.background() +add_text(slide, 'ГЕОГРАФИЯ', Inches(0.8), Inches(0.3), Inches(6), Inches(0.8), + font_size=36, bold=True, color=CYAN, font_name='Calibri') +add_animation(slide, 'flyIn', len(slide.shapes) - 1, delay_ms=100, dur_ms=600) + +geo_items = [ + ('🏔️', 'Горы', 'Тянь-Шань, Алтай. Высшая точка — Хан-Тенгри (7010 м)'), + ('🌊', 'Каспийское море', 'Крупнейшее озеро мира. 1894 км побережья'), + ('🏜️', 'Степи', 'Бескрайние равнины — историческая родина кочевников'), + ('🌾', 'Озёра', 'Балхаш, Алаколь — более 45 000 озёр'), +] +for i, (emoji, name, desc) in enumerate(geo_items): + x = Inches(0.8 + (i % 2) * 6.2) + y = Inches(1.8 + (i // 2) * 2.6) + box = add_shape_box(slide, x, y, Inches(5.6), Inches(2.2), + RGBColor(0xF5, 0xF7, 0xFA)) + add_text(slide, emoji, x + Inches(0.3), y + Inches(0.2), Inches(1), Inches(0.8), + font_size=40, font_name='Calibri') + add_text(slide, name, x + Inches(1.2), y + Inches(0.25), Inches(4), Inches(0.5), + font_size=22, bold=True, color=INK, font_name='Calibri') + add_text(slide, desc, x + Inches(1.2), y + Inches(0.8), Inches(4.2), Inches(1.2), + font_size=15, color=GRAY, font_name='Calibri') + add_animation(slide, 'flyIn', len(slide.shapes) - 1, delay_ms=300 + i * 200, dur_ms=700) + + +# ══════════════════════════════════════════════════════════════ +# SLIDE 3 — Facts & Figures +# ══════════════════════════════════════════════════════════════ +slide = prs.slides.add_slide(prs.slide_layouts[6]) +add_bg(slide, BG_DARK) + +add_text(slide, 'ЦИФРЫ И ФАКТЫ', Inches(0.8), Inches(0.6), Inches(10), Inches(1), + font_size=40, bold=True, color=WHITE, font_name='Calibri') +add_text(slide, 'Казахстан в цифрах', Inches(0.8), Inches(1.4), Inches(6), Inches(0.6), + font_size=18, color=GRAY, font_name='Calibri') + +facts = [ + ('9', 'по величине\nв мире'), + ('1991', 'год\nнезависимости'), + ('70+', 'тонн золота\nв год'), + ('1', 'космодром\nБайконур'), + ('3', 'столицы\nв истории'), +] +for i, (num, txt) in enumerate(facts): + x = Inches(0.6 + i * 2.5) + y = Inches(2.5) + box = add_shape_box(slide, x, y, Inches(2.2), Inches(3.5), + RGBColor(0x1C, 0x26, 0x36), CYAN) + add_text(slide, num, x + Inches(0.2), y + Inches(0.4), Inches(1.8), Inches(1.2), + font_size=52, bold=True, color=CYAN, align=PP_ALIGN.CENTER, font_name='Calibri') + add_text(slide, txt, x + Inches(0.2), y + Inches(1.8), Inches(1.8), Inches(1.4), + font_size=14, color=GRAY, align=PP_ALIGN.CENTER, font_name='Calibri') + add_animation(slide, 'zoom', len(slide.shapes) - 1, delay_ms=200 + i * 200, dur_ms=800) + +# Bottom decorative line +line = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, + Inches(0.8), Inches(6.5), Inches(11.7), Inches(0.04)) +line.fill.solid() +line.fill.fore_color.rgb = CYAN +line.line.fill.background() + + +# ══════════════════════════════════════════════════════════════ +# SLIDE 4 — Culture +# ══════════════════════════════════════════════════════════════ +slide = prs.slides.add_slide(prs.slide_layouts[6]) +add_bg(slide, RGBColor(0xF0, 0xF4, 0xF8)) + +bar = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, 0, 0, W, Inches(1.4)) +bar.fill.solid() +bar.fill.fore_color.rgb = BG_DARK +bar.line.fill.background() +add_text(slide, 'КУЛЬТУРА И ТРАДИЦИИ', Inches(0.8), Inches(0.3), Inches(10), Inches(0.8), + font_size=36, bold=True, color=GOLD, font_name='Calibri') + +culture_items = [ + ('🦅', 'Беркутчи', 'Соколиная охота с орлами — наследие ЮНЕСКО'), + ('🎪', 'Юрта', 'Легко разборное жилище — символ свободы'), + ('🎶', 'Домбра', 'Двухструнный инструмент — душа кюев'), + ('🤼', 'Байге', 'Конные скачки на длинные дистанции'), + ('🎭', 'Наурыз', 'Праздник весны — 7 блюд, 22 марта'), + ('📖', 'Абай', 'Великий поэт, философ, мыслитель'), +] +for i, (emoji, name, desc) in enumerate(culture_items): + col = i % 3 + row = i // 3 + x = Inches(0.8 + col * 4.1) + y = Inches(1.8 + row * 2.6) + box = add_shape_box(slide, x, y, Inches(3.7), Inches(2.2), WHITE) + add_text(slide, emoji, x + Inches(0.3), y + Inches(0.2), Inches(1), Inches(0.8), + font_size=36, font_name='Calibri') + add_text(slide, name, x + Inches(1.2), y + Inches(0.25), Inches(2.2), Inches(0.5), + font_size=20, bold=True, color=INK, font_name='Calibri') + add_text(slide, desc, x + Inches(0.3), y + Inches(1), Inches(3.2), Inches(1), + font_size=14, color=GRAY, font_name='Calibri') + add_animation(slide, 'flyIn', len(slide.shapes) - 1, delay_ms=250 + i * 180, dur_ms=700) + + +# ══════════════════════════════════════════════════════════════ +# SLIDE 5 — Cities +# ══════════════════════════════════════════════════════════════ +slide = prs.slides.add_slide(prs.slide_layouts[6]) +add_bg(slide, WHITE) + +add_text(slide, 'ГОРОДА', Inches(0.8), Inches(0.6), Inches(10), Inches(1), + font_size=40, bold=True, color=INK, font_name='Calibri') +add_text(slide, 'Мегаполисы Казахстана', Inches(0.8), Inches(1.3), Inches(6), Inches(0.5), + font_size=18, color=GRAY, font_name='Calibri') + +cities = [ + ('АСТАНА', 'Столица с 1997 г.\nБайтерек, Хан-Шатыр,\nсамые высокие фонтаны Евразии', CYAN), + ('АЛМАТЫ', 'Бывшая столица\nГоры за городом, Медеу,\nШымбулак, алматинские яблоки', GOLD), + ('ШЫМКЕНТ', 'Третий город\nЮжные ворота, жаркий\nклимат, древняя история', RGBColor(0x2A, 0x9D, 0x8F)), +] +for i, (name, desc, accent) in enumerate(cities): + x = Inches(0.8 + i * 4.1) + y = Inches(2.2) + box = add_shape_box(slide, x, y, Inches(3.7), Inches(4.5), + RGBColor(0xF5, 0xF7, 0xFA)) + # Color accent bar at top + accent_bar = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, + x, y, Inches(3.7), Inches(0.12)) + accent_bar.fill.solid() + accent_bar.fill.fore_color.rgb = accent + accent_bar.line.fill.background() + add_text(slide, name, x + Inches(0.4), y + Inches(0.5), Inches(3), Inches(0.6), + font_size=28, bold=True, color=INK, font_name='Calibri') + add_text(slide, desc, x + Inches(0.4), y + Inches(1.3), Inches(3), Inches(2.5), + font_size=15, color=GRAY, font_name='Calibri') + add_animation(slide, 'flyIn', len(slide.shapes) - 1, delay_ms=300 + i * 250, dur_ms=800) + + +# ══════════════════════════════════════════════════════════════ +# SLIDE 6 — Food +# ══════════════════════════════════════════════════════════════ +slide = prs.slides.add_slide(prs.slide_layouts[6]) +add_bg(slide, RGBColor(0xFD, 0xF8, 0xEF)) + +add_text(slide, 'КУХНЯ', Inches(0.8), Inches(0.6), Inches(10), Inches(1), + font_size=40, bold=True, color=INK, font_name='Calibri') +add_text(slide, 'Вкус степи — просто и сытно', Inches(0.8), Inches(1.3), Inches(6), Inches(0.5), + font_size=18, color=GRAY, font_name='Calibri') + +foods = [ + ('🥟', 'Бешбармак', 'Главное блюдо — мясо с лапшой.\n«Пять пальцев» — едят руками'), + ('🫕', 'Кумыс', 'Ферментированное кобылье\nмолоко — тонизирующий напиток'), + ('🫓', 'Баурсаки', 'Жареные тестовые шарики\nна каждом празднике'), + ('🍵', 'Чай с молоком', 'С солью — гостям наливают\nпервым, знак уважения'), +] +for i, (emoji, name, desc) in enumerate(foods): + col = i % 2 + row = i // 2 + x = Inches(0.8 + col * 6.2) + y = Inches(2.2 + row * 2.4) + box = add_shape_box(slide, x, y, Inches(5.6), Inches(2), WHITE, + RGBColor(0xE8, 0xB7, 0x30)) + add_text(slide, emoji, x + Inches(0.3), y + Inches(0.2), Inches(1), Inches(0.8), + font_size=40, font_name='Calibri') + add_text(slide, name, x + Inches(1.3), y + Inches(0.2), Inches(3.5), Inches(0.5), + font_size=22, bold=True, color=INK, font_name='Calibri') + add_text(slide, desc, x + Inches(1.3), y + Inches(0.8), Inches(3.8), Inches(1), + font_size=14, color=GRAY, font_name='Calibri') + add_animation(slide, 'bounce', len(slide.shapes) - 1, delay_ms=200 + i * 200, dur_ms=700) + + +# ══════════════════════════════════════════════════════════════ +# SLIDE 7 — History timeline +# ══════════════════════════════════════════════════════════════ +slide = prs.slides.add_slide(prs.slide_layouts[6]) +add_bg(slide, WHITE) + +add_text(slide, 'ИСТОРИЯ', Inches(0.8), Inches(0.6), Inches(10), Inches(1), + font_size=40, bold=True, color=INK, font_name='Calibri') +add_text(slide, 'От кочевников до космоса', Inches(0.8), Inches(1.3), Inches(6), Inches(0.5), + font_size=18, color=GRAY, font_name='Calibri') + +# Vertical line +vline = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, + Inches(1.6), Inches(2.2), Inches(0.06), Inches(4.8)) +vline.fill.solid() +vline.fill.fore_color.rgb = CYAN +vline.line.fill.background() + +timeline = [ + ('1465', 'Казахское ханство', 'Формирование народа и кочевого уклада'), + ('XVIII', 'Российская империя', 'Присоединение, оседлый образ жизни'), + ('1955', 'Байконур', 'Запуск первого космодрома в мире'), + ('1961', 'Гагарин', 'Первый полёт в космос с Байконура'), + ('1991', 'Независимость', '16 декабря — последняя республика СССР'), + ('1997', 'Новая столица', 'Перенос столицы в Акмолу (Астану)'), +] +for i, (year, title, desc) in enumerate(timeline): + y = Inches(2.2 + i * 0.8) + # Dot + dot = slide.shapes.add_shape(MSO_SHAPE.OVAL, + Inches(1.4), y + Inches(0.08), Inches(0.45), Inches(0.45)) + dot.fill.solid() + dot.fill.fore_color.rgb = CYAN if i % 2 == 0 else GOLD + dot.line.fill.background() + add_text(slide, year, Inches(2.2), y, Inches(1.2), Inches(0.6), + font_size=16, bold=True, color=INK, font_name='Calibri') + add_text(slide, f'{title} — {desc}', Inches(3.5), y, Inches(9), Inches(0.6), + font_size=14, color=GRAY, font_name='Calibri') + add_animation(slide, 'flyIn', len(slide.shapes) - 1, delay_ms=200 + i * 150, dur_ms=600) + + +# ══════════════════════════════════════════════════════════════ +# SLIDE 8 — Thank You +# ══════════════════════════════════════════════════════════════ +slide = prs.slides.add_slide(prs.slide_layouts[6]) +add_bg(slide, BG_DARK) + +# Decorative circles +for cx, cy, sz, clr in [(10, 0.5, 3, RGBColor(0x00, 0x3D, 0x5C)), + (10.5, 1, 2, CYAN), + (0.5, 5, 2.5, RGBColor(0x00, 0x3D, 0x5C)), + (1, 5.5, 1.5, GOLD)]: + c = slide.shapes.add_shape(MSO_SHAPE.OVAL, + Inches(cx), Inches(cy), Inches(sz), Inches(sz)) + c.fill.solid() + c.fill.fore_color.rgb = clr + c.line.fill.background() + add_animation(slide, 'spin', len(slide.shapes) - 1, delay_ms=500, dur_ms=2000) + +flag = add_text(slide, '🇰🇿', Inches(5.5), Inches(1.2), Inches(2.5), Inches(1.5), + font_size=80, color=WHITE, align=PP_ALIGN.CENTER) +add_animation(slide, 'zoom', len(slide.shapes) - 1, delay_ms=200, dur_ms=1000) + +add_text(slide, 'СПАСИБО ЗА ВНИМАНИЕ!', Inches(1), Inches(2.8), Inches(11.3), Inches(1.2), + font_size=48, bold=True, color=WHITE, align=PP_ALIGN.CENTER, font_name='Calibri') +add_animation(slide, 'flyIn', len(slide.shapes) - 1, delay_ms=500, dur_ms=900) + +add_text(slide, 'Казахстан — древние традиции и современные мегаполисы,\nбескрайние степи и высокие горы', + Inches(2), Inches(4.2), Inches(9.3), Inches(1.2), + font_size=18, color=GRAY, align=PP_ALIGN.CENTER, font_name='Calibri') +add_animation(slide, 'fade', len(slide.shapes) - 1, delay_ms=800, dur_ms=800) + + +# ── Save ── +out = '/srv/opencode/workspaces/users/literally.ww/kazakhstan/Казахстан_Презентация.pptx' +prs.save(out) +print(f'✅ Saved: {out}') +print(f' Slides: {len(prs.slides)}') diff --git a/Казахстан_Презентация.pptx b/Казахстан_Презентация.pptx new file mode 100644 index 0000000000000000000000000000000000000000..0785ce5008fe48eb0eb3d3c082c7ce3db7140227 GIT binary patch literal 46547 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 literal 0 HcmV?d00001