{"id":6857,"date":"2020-08-06T21:19:11","date_gmt":"2020-08-06T19:19:11","guid":{"rendered":"https:\/\/pythonprogramming.altervista.org\/?p=6857"},"modified":"2020-08-07T10:55:26","modified_gmt":"2020-08-07T08:55:26","slug":"pygame-tutorial-1-3-3-animation-while-moving","status":"publish","type":"post","link":"https:\/\/pythonprogramming.altervista.org\/pygame-tutorial-1-3-3-animation-while-moving\/","title":{"rendered":"Pygame  tutorial 1 &#8211; 3.3 &#8211; Animation while moving"},"content":{"rendered":"<p>This is an interesting evolution of our little application to move around a sprite. Now we do not only:<\/p>\n<ul>\n<li>move the sprite<\/li>\n<li>but we animate it while it&#8217;s moving<\/li>\n<li>and we also flip it<\/li>\n<li>and&#8230; I was almost forgetting, we make the animation &#8216;indipendent&#8217; from the frame rate (almost)<\/li>\n<\/ul>\n<p>Nothing too complicated, thought, because we want to proceed with caution and trying some experiment.<\/p>\n<h2>The Cat class<\/h2>\n<p>Our sprite animation is managed by this class. Very simply.<\/p>\n<h3>The __init__ method<\/h3>\n<p>This method contains the stuff that are executed when we create an istance of the class:<\/p>\n<pre class=\"lang:default decode:true \">cat = Cat(100, 100)<\/pre>\n<p>So, we pass also the 100, 100 arguments that are used to set the initial position of the sprite, that is this, by the way,<\/p>\n<p><a href=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2020\/08\/Idle-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-6858\" src=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2020\/08\/Idle-1.png\" alt=\"\" width=\"67\" height=\"117\" \/><\/a><\/p>\n<p>This is in the cat folder. You find everything in this <a href=\"https:\/\/github.com\/formazione\/pygame_tutorial\">github repository<\/a>. Images are not mine and are free.<\/p>\n<p>We were talnking about the __init__ method (there are two _ before and after init):<\/p>\n<pre class=\"lang:default decode:true\">class Cat:\r\n    def __init__(self, x, y):\r\n        self.x = x\r\n        self.y = y\r\n        self.list = [\r\n            pygame.image.load(f).convert_alpha() for f in glob(\"cat\/Idle*.png\")[1:]\r\n        ]\r\n        self.counter = 0\r\n        self.image = self.list[0]\r\n        self.dir = \"right\"<\/pre>\n<p>Here we just take the x and y position of the cat, we create a list with all the surface images (read the previous posts to know what a surface is <a href=\"https:\/\/pythonprogramming.altervista.org\/pygame-tutorial-n-1\/\">post 1<\/a>, <a href=\"https:\/\/pythonprogramming.altervista.org\/pygame-tutorial-2-loading-images\/\">2<\/a>, <a href=\"https:\/\/pythonprogramming.altervista.org\/pygame-tutorial-1-part-3-1\/\">3.1<\/a>, <a href=\"https:\/\/pythonprogramming.altervista.org\/pygame-tutorial-1-part-3-2-move-sprite\/\">3.2<\/a>) and then we set the self.image = self.list[0] as the starting image and &#8220;right&#8221; as the starting direction (where the cat is watching).<\/p>\n<h3>The update method<\/h3>\n<p>This one is the most interesting part, where the images are cycled so that you see an animation&#8230; but it&#8217;s an illusion, there are simply different images of different poses&#8230; but well I think you get it yet.<\/p>\n<pre class=\"lang:default decode:true \">    def update(self):\r\n        self.counter += .4\r\n        if self.counter &gt;= len(self.list):\r\n            self.counter = 0\r\n        if self.dir == \"right\":\r\n            self.image = self.list[int(self.counter)]\r\n        if self.dir == \"left\":\r\n            self.image = pygame.transform.flip(self.list[int(self.counter)], True, False)        \r\n        screen.blit(self.image, (self.x, self.y))<\/pre>\n<p>This method will be called in the while loop that makes everything go on (again watch the past posts if you do not know what is the while loop that makes everything go on: <a href=\"https:\/\/pythonprogramming.altervista.org\/pygame-tutorial-n-1\/\">post 1<\/a>, <a href=\"https:\/\/pythonprogramming.altervista.org\/pygame-tutorial-2-loading-images\/\">2<\/a>, <a href=\"https:\/\/pythonprogramming.altervista.org\/pygame-tutorial-1-part-3-1\/\">3.1<\/a>, <a href=\"https:\/\/pythonprogramming.altervista.org\/pygame-tutorial-1-part-3-2-move-sprite\/\">3.2<\/a>).<\/p>\n<h2>The entire code for the animation<\/h2>\n<pre class=\"lang:default decode:true\">import sys\r\nimport pygame\r\nimport glob\r\n\r\n\r\n# Initialisation of Pygame\r\n\r\npygame.init()\r\n\r\n# The main Surface where everything's blitted\r\n\r\nscreen = pygame.display.set_mode((400, 600))\r\n\r\n# The container of all the Sprite\r\n# attributes (position...)\r\n# and methods (change position...)\r\n\r\n\r\nclass Cat:\r\n\r\n    def __init__(self, x, y):\r\n        self.x = x\r\n        self.y = y\r\n\r\n        self.imgslist = [\r\n        pygame.image.load(f) for f in\r\n            glob.glob(\"cat\/Idle*.png\")\r\n        ]\r\n        self.counter = 0\r\n        self.image = self.imgslist[0]\r\n        self.dir = \"right\"\r\n\r\n    def update(self):\r\n        self.counter += .4\r\n        if self.counter &gt;= len(self.imgslist):\r\n            self.counter = 0\r\n        if cat.dir == \"right\":\r\n            self.image = self.imgslist[int(self.counter)]\r\n        if cat.dir == \"left\":\r\n            self.image = pygame.transform.flip(self.imgslist[int(self.counter)], True, False)\r\n        self.pos = self.x, self.y\r\n        screen.blit(self.image, self.pos)\r\n\r\n# Let's create a sprite with Cat class\r\n\r\ncat = Cat(100, 100)\r\n\r\n# This is for the frame rate\r\n\r\nclock = pygame.time.Clock()\r\n\r\n\r\n# Everything goes on forever here\r\n\r\nloop = 1\r\nwhile loop:\r\n    screen.fill((128, 255, 128))\r\n\r\n    # Close with the window's x' button\r\n\r\n    for event in pygame.event.get():\r\n        if event.type == pygame.QUIT:\r\n            loop = 0\r\n        # Now we get the Key inputs\r\n        if event.type == pygame.KEYDOWN:\r\n\r\n            # Close if press Esc\r\n\r\n            if event.key == pygame.K_ESCAPE:\r\n                loop = 0\r\n\r\n            # Move with arrow Keys:\r\n\r\n            if event.key == pygame.K_RIGHT:\r\n                cat.dir = \"right\"\r\n                cat.x += 10\r\n            if event.key == pygame.K_LEFT:\r\n                cat.dir = \"left\"\r\n                cat.x -= 10\r\n            if event.key == pygame.K_UP:\r\n                cat.y -= 10\r\n            if event.key == pygame.K_DOWN:\r\n                cat.y += 10\r\n\r\n    # Call every frame method to move cat\r\n\r\n    cat.update()\r\n\r\n    # Update the screen to see something\r\n    pygame.display.update()\r\n\r\n    # at 60 frame rate\r\n\r\n    clock.tick(60)\r\n\r\n# Pressing Esc or 'x' button you exit here and..\r\n\r\npygame.quit()\r\nsys.exit()<\/pre>\n<p>Ok, now we&#8217;re done for the moment. Watch my video where I try to explain what I did in the code. See ya in the next post for more complicated and yet fun stuffs.<\/p>\n<h2>The video with the code explanation<\/h2>\n<p><iframe loading=\"lazy\" title=\"Pygame tutorial 3.3 - animation\" width=\"747\" height=\"560\" src=\"https:\/\/www.youtube.com\/embed\/_7h9ZtUqFUg?feature=oembed&amp;enablejsapi=1\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/p>\n<!-- se vuoi mettere un testo scorrevole\r\n[hoops name=\"typeWriterGen\"]\r\n\r\npoi metti un id diverso per ogni testo nella stessa pagina\r\n\r\n<div id=\"div01\">\r\n<script>\r\n\r\ntypeWriterGen(\"div01\",\"Esempio di testo scorrevole\");\r\n<\/script>\r\n\r\n-->\r\n<style>\r\n.avatar {\r\n  vertical-align: middle;\r\n  width: 100px;\r\n  height: 100px;\r\n  border-radius: 50%;\r\n}\r\n<\/style>\r\n\r\n<hr>\r\n\r\n<!-- NEWSLETTER LINK -->\r\n<a href=\"https:\/\/docs.google.com\/forms\/d\/e\/1FAIpQLSf7TniIPCWHDzCSGh2dYZaCwDvi9yLKS5ovFdKuK1sdfOvwEg\/viewform\">\r\n<img decoding=\"async\" src=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-13.png\" class=\"avatar\">\r\nSubscribe to the <b>newsletter<\/b> for updates<\/a><br>\r\n\r\n<!-- TKINTER TEMPLATE LINK -->\r\n<a href=\"https:\/\/pythonprogramming.altervista.org\/tkinter-templates\/\">\r\n<img decoding=\"async\" src=\"https:\/\/i0.wp.com\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/07\/image-26.png\" class=\"avatar\">\r\nTkinter templates<\/a><br>\r\n\r\n<!-- MY AVATAR PUT A LINK TO YOUTUBE CHANNEL-->\r\n<iframe loading=\"lazy\" frameborder=\"0\" src=\"https:\/\/itch.io\/embed\/711828\" width=\"552\" height=\"167\"><a href=\"https:\/\/pythonprogrammi.itch.io\/pysnake\">PySnake by PythonProgrammi<\/a><\/iframe>\r\n<br>\r\n<style>\r\n.avatar {\r\n  vertical-align: middle;\r\n  width: 100px;\r\n  height: 100px;\r\n  border-radius: 50%;\r\n}\r\n<\/style>\r\n\r\n\r\n<a href=\"https:\/\/www.youtube.com\/channel\/UCzbxq5e9gLiY-je2-br1rvg\">\r\n\t<img decoding=\"async\" src=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2020\/10\/avatar64x64.png\" alt=\"Avatar\" class=\"avatar\">\r\n\t My youtube channel<\/a><br>\r\n\r\n<br>\r\n\r\nTwitter: <a href=\"https:\/\/twitter.com\/pythonprogrammi\">@pythonprogrammi - python_pygame<\/a>\r\n<h3>Claude's Games<\/h3>\r\n<p><a href=\"https:\/\/pythonprogramming.altervista.org\/random-daily-game-1-arkanoid\/\">Arkanoid<\/a><br>\r\n<a href=\"https:\/\/pythonprogramming.altervista.org\/platform-2d-with-pygame-made-with-claude\/\">Platform 2d<\/a><\/p> <!-- videogames made with claude -->\r\n<a href=\"https:\/\/pythonprogramming.altervista.org\/artifacts-games-day-1-memory-game\/\">1. Memory game<\/a>\r\n<h4>Videos<\/h4>\r\n<a href=\"https:\/\/youtu.be\/ciLjWWw5pLY\">Speech recognition game<\/a>\r\n<h3>Pygame's Platform Game<\/h3>\r\n\r\n<a href=\"https:\/\/pythonprogramming.altervista.org\/pygame-platform-game-5-sounds-and-mixer\/\"><img decoding=\"async\" src=\"https:\/\/i1.wp.com\/pythonprogramming.altervista.org\/wp-content\/uploads\/2020\/01\/climbercover.png?w=557&ssl=1\"\/ width=\"50%\"><\/a>\r\n<script>\r\nvar title = \"Platform Pygame\";\r\n\t\tvar links = [\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-animation-of-a-sprite-v-1-3\/\",\"Animation 1.3\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-sprite-animation-v-2-better-coding-test-it-checking-fps-on-the-screen\/\",\"Animation 1.2\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-how-to-display-the-frame-rate-fps-on-the-screen\/\",\"Display Frame rate\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-sprite-animation-update\/\",\"Animation 1.1\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-platformer-1\/\",\"Pygame Platform Game 1\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/python-platform-game-2\/\",\"Pygame Platform 2\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-platform-game-3-recap-cheatsheet\/\",\"Pygame PLatform 3 - recap and some Cheat Sheet\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-platform-game-4-background-and-stuffs\/\",\"Pygame Platform 4 - Background & organizing code\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-platform-game-5-sounds-and-mixer\/\",\"Pygame Platform 5 - Sounds\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/platform-game-in-detail-part-1\/\",\"Game in detail part 1\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/map-maker-1-2\/\", \"Map maker 1.2\"]\r\n\t\t];\r\n\t\t<\/script>\r\n<script>\r\n\t\r\nif (typeof next2 != \"undefined\"){let next2 = 0;}\r\n\t\r\nnext2 = 0;\r\n\thtml = \"\";\/\/<b style='color:coral;font-size:1.2em'>Other posts about \" + title + \"<\/b><br>\";\r\nfor (address of links) \r\n{\r\n\r\n\tif (next2 == 1){\r\n\t\thtml += \"<div style='background:coral'>\";\r\n\t\thtml += \"Next link => <a href='\" + address[0] + \"'>\" + address[1] + \"<\/a>\";\r\n\t\thtml += \"<\/div><br>\";\r\n\t\tnext2 = 0;\r\n\t}\r\n\tif (address[0] == document.URL) {\r\n\t\tnext2 = 1;\r\n\t}\r\n}\r\n\r\nif (typeof next != \"undefined\") {let next = 0;}\r\nif (typeof addressStart != \"undefined\") {let addressStart = \"\";}\r\nnext = 0;\r\naddressStart = \"<a href='\";\r\nfor (address of links) {\r\n\tif (next == 1){\r\n\t\thtml += \">>>\" + addressStart + address[0] + \"'>\" + address[1] + \"<\/a><br>\";\r\n\t\tnext = 0;\r\n\t}\r\n\telse if (addressStart + address[0] != document.URL)\r\n\t{\r\n\t\thtml += addressStart + address[0] + \"'>\" + address[1] + \"<\/a><br>\";\r\n\t}\r\n\telse\r\n\t{\r\n\t\tnext = 1;\r\n\t\tnext_address = address[0]\r\n\t\tnext_title = address[1]\r\n\t\thtml += \"<span style='color:gray'>\" + address[1] + \"<\/span><br>\";\r\n\t}\r\n\r\n}\r\n\r\n\thtml += `<span style=\"font-size:8px\">Powered by <a href=\"https:\/\/pythonprogramming.altervista.org\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2673\" src=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2019\/06\/altervista2.png\" alt=\"\" width=\"70\" height=\"25\" srcset=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2019\/06\/altervista2.png 156w, https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2019\/06\/altervista2-150x56.png 150w\" sizes=\"auto, (max-width: 70px) 100vw, 70px\" \/>pythonprogramming.altervista.org<\/a><\/span>`\r\n\thtml = \"<div style='background:yellow'>\" + html + \"<\/div>\";\r\n\tdocument.write(html)\r\n<\/script>\r\n\r\n<h3>Other Pygame's posts<\/h3>\r\n\r\n<script>\r\nvar title = \"Pygame's Posts\"\r\nvar links = [\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-platformer-1\/\",\"Platform game 1\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/make-a-platform-game-with-pygame-dafluffypotato\/\",\"DaFluffyPotato Platform Tutorials\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/python-and-classic-arcade-games-pong\/\",\"Pong Game Full\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/python-draws-in-colors-app-to-draw-with-pygame\/\",\"PyGameGIF 2\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-draw-app-with-animation\/\",\"PyGameGIF 1\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pydraw-2-0-app-to-draw-gif\/\",\"PyDraw 2.0\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-drawing-2\/\",\"Draw with Pygame\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/animation-with-pygame\",\"Sprite animation 1\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/animation-on-pygame-2-free-characters-and-more-actions\/\",\"Sprite animation 2\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/starting-with-pygame\/\",\"Starting movements with Pygame\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-3-move-sprite\/\", \"Move a Sprite\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-4-fonts\/\",\"Text and Fonts\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-animate-a-sprite\/\", \"Animate a sprite\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-and-mouse-events\/\",\"Mouse events\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pgp-aka-pygamepresentation-project\/\",\"Pygame presentation\"],\r\n\t[\"https:\/\/pythonprogramming.altervista.org\/moving-the-player-in-pygame-with-key-get_pressed\/\",\"How to use key.get_pressed()\"]\r\n]\r\n<\/script>\r\n\r\n\r\n<script>\r\n\t\r\nif (typeof next2 != \"undefined\"){let next2 = 0;}\r\n\t\r\nnext2 = 0;\r\n\thtml = \"\";\/\/<b style='color:coral;font-size:1.2em'>Other posts about \" + title + \"<\/b><br>\";\r\nfor (address of links) \r\n{\r\n\r\n\tif (next2 == 1){\r\n\t\thtml += \"<div style='background:coral'>\";\r\n\t\thtml += \"Next link => <a href='\" + address[0] + \"'>\" + address[1] + \"<\/a>\";\r\n\t\thtml += \"<\/div><br>\";\r\n\t\tnext2 = 0;\r\n\t}\r\n\tif (address[0] == document.URL) {\r\n\t\tnext2 = 1;\r\n\t}\r\n}\r\n\r\nif (typeof next != \"undefined\") {let next = 0;}\r\nif (typeof addressStart != \"undefined\") {let addressStart = \"\";}\r\nnext = 0;\r\naddressStart = \"<a href='\";\r\nfor (address of links) {\r\n\tif (next == 1){\r\n\t\thtml += \">>>\" + addressStart + address[0] + \"'>\" + address[1] + \"<\/a><br>\";\r\n\t\tnext = 0;\r\n\t}\r\n\telse if (addressStart + address[0] != document.URL)\r\n\t{\r\n\t\thtml += addressStart + address[0] + \"'>\" + address[1] + \"<\/a><br>\";\r\n\t}\r\n\telse\r\n\t{\r\n\t\tnext = 1;\r\n\t\tnext_address = address[0]\r\n\t\tnext_title = address[1]\r\n\t\thtml += \"<span style='color:gray'>\" + address[1] + \"<\/span><br>\";\r\n\t}\r\n\r\n}\r\n\r\n\thtml += `<span style=\"font-size:8px\">Powered by <a href=\"https:\/\/pythonprogramming.altervista.org\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2673\" src=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2019\/06\/altervista2.png\" alt=\"\" width=\"70\" height=\"25\" srcset=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2019\/06\/altervista2.png 156w, https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2019\/06\/altervista2-150x56.png 150w\" sizes=\"auto, (max-width: 70px) 100vw, 70px\" \/>pythonprogramming.altervista.org<\/a><\/span>`\r\n\thtml = \"<div style='background:yellow'>\" + html + \"<\/div>\";\r\n\tdocument.write(html)\r\n<\/script>\n","protected":false},"excerpt":{"rendered":"New tutorial n.3.3. about pygame and animation. No secret for this tecnique to make you think that thing are moving.\n<a class=\"moretag\" href=\"https:\/\/pythonprogramming.altervista.org\/pygame-tutorial-1-3-3-animation-while-moving\/\"> [...]<\/a>","protected":false},"author":1,"featured_media":6860,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_crdt_document":"","footnotes":""},"categories":[191],"tags":[219,194,376],"class_list":["post-6857","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-pygame","tag-animation","tag-pygame","tag-tutorial"],"avopt_banners_inside_post":true,"avopt_banners_on_page":true,"av_copy_from":"","av_sharing_message":"","av_sharing_allowed":true,"av_sharing_on":{"fb":[],"tw":[]},"av_allow_affiliate_banner":false,"av_allow_affiliate_multi_banner":false,"av_show_affiliation_buy_button":false,"av_post_rating":true,"av_have_post_rating_value":false,"av_is_artificial_intelligence_content":false,"_links":{"self":[{"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/posts\/6857","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/comments?post=6857"}],"version-history":[{"count":5,"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/posts\/6857\/revisions"}],"predecessor-version":[{"id":6864,"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/posts\/6857\/revisions\/6864"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/media\/6860"}],"wp:attachment":[{"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/media?parent=6857"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/categories?post=6857"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/tags?post=6857"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}