{"id":13079,"date":"2023-08-07T13:36:18","date_gmt":"2023-08-07T11:36:18","guid":{"rendered":"https:\/\/pythonprogramming.altervista.org\/?p=13079"},"modified":"2023-08-08T21:16:23","modified_gmt":"2023-08-08T19:16:23","slug":"create-a-pdf-with-html-and-python","status":"publish","type":"post","link":"https:\/\/pythonprogramming.altervista.org\/create-a-pdf-with-html-and-python\/","title":{"rendered":"Create a PDF with HTML and Python"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Let&#8217;s use tkinter to make an app to create pdf files just with Python. Let&#8217;s see what we need to do it.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Installation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">First install pdfkt in the cmd or terminal<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>pip install pdfkit<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-20.png\"><img loading=\"lazy\" decoding=\"async\" width=\"611\" height=\"200\" src=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-20.png\" alt=\"\" class=\"wp-image-13086\" srcset=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-20.png 611w, https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-20-320x105.png 320w\" sizes=\"auto, (max-width: 611px) 100vw, 611px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">The path to wkhtmltopdf.exe<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You need to tell where is the path to <strong>wkhtmltopdf.exe<\/strong> that is installed with pdfkit, as you see in the first lines of code of the script below. In your pc the folder can be different.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can find the path in the environmental variables of the system<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-40.png\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"798\" src=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-40.png\" alt=\"\" class=\"wp-image-13144\" srcset=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-40.png 800w, https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-40-320x319.png 320w, https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-40-150x150.png 150w, https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-40-768x766.png 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-41.png\"><img loading=\"lazy\" decoding=\"async\" width=\"412\" height=\"486\" src=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-41.png\" alt=\"\" class=\"wp-image-13145\" srcset=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-41.png 412w, https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-41-320x377.png 320w\" sizes=\"auto, (max-width: 412px) 100vw, 412px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-42.png\"><img loading=\"lazy\" decoding=\"async\" width=\"644\" height=\"585\" src=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-42.png\" alt=\"\" class=\"wp-image-13146\" srcset=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-42.png 644w, https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-42-320x291.png 320w\" sizes=\"auto, (max-width: 644px) 100vw, 644px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-39.png\"><img loading=\"lazy\" decoding=\"async\" width=\"527\" height=\"501\" src=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-39.png\" alt=\"\" class=\"wp-image-13143\" srcset=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-39.png 527w, https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-39-320x304.png 320w\" sizes=\"auto, (max-width: 527px) 100vw, 527px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">This are the lines in which you tell where wkhtmltopdf.exe is. Remember that you do not have to install it, it is installed when you do <strong>pip install pdfkit<\/strong>.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">path_wkhtmltopdf = 'C:\\\\Program Files\\\\wkhtmltopdf\\\\bin\\\\wkhtmltopdf.exe'\nconfig = pdfkit.configuration(wkhtmltopdf=path_wkhtmltopdf)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This config object will be needed at this line:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">pdfkit.from_string(content, &#8220;pdf2.pdf&#8221;, configuration=config)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">when you create the pdf from a string, or a file, or a url, otherwise you will get an error.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here is an example of the GUI.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-37.png\"><img loading=\"lazy\" decoding=\"async\" width=\"429\" height=\"250\" src=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-37.png\" alt=\"\" class=\"wp-image-13136\" srcset=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-37.png 429w, https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-37-320x186.png 320w\" sizes=\"auto, (max-width: 429px) 100vw, 429px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">And this is the output \ud83d\udcc2 <\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-38.png\"><img loading=\"lazy\" decoding=\"async\" width=\"502\" height=\"501\" src=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-38.png\" alt=\"\" class=\"wp-image-13138\" srcset=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-38.png 502w, https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-38-320x319.png 320w, https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-38-150x150.png 150w\" sizes=\"auto, (max-width: 502px) 100vw, 502px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">The entire code of html_to_pdf.py<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import tkinter as tk\nfrom tkinter import messagebox\nimport pdfkit\nimport os\nimport codecs\n\n# pip install pdfkit\n# this will install wkhtmltopdf\npath_wkhtmltopdf = 'C:\\\\Program Files\\\\wkhtmltopdf\\\\bin\\\\wkhtmltopdf.exe'\nconfig = pdfkit.configuration(wkhtmltopdf=path_wkhtmltopdf)\n# pdfkit.from_url(\"http:\/\/google.com\", \"out.pdf\", configuration=config)\n\nclass Window():\n    def __init__(self):\n        self.root = tk.Tk()\n        self.widgets()\n        self.root.mainloop()\n\n    def widgets(self):\n        self.menubar = tk.Menu(self.root)\n        self.menubar.add_command(label=\"Save pdf\", command=self.from_string)\n        self.menubar.add_command(label=\"Open pdf\", command=self.open)\n        self.menubar.add_command(label=\"Help\", command=self.help)\n        self.root.config(menu=self.menubar)\n        self.label = tk.Label(self.root, text=\"SCRIPT GENTLY OFFERED BY @PYTHONPROGRAMMI AKA GIOVANNIPYTHON\")\n        self.label.pack()\n        self.txbx = tk.Text(self.root, height=20, insertbackground=\"white\")\n        self.txbx['font'] = \"Arial 14\"\n        self.txbx['bg'] = \"black\"\n        self.txbx['fg'] = \"white\"\n        self.txbx['borderwidth'] = 2\n        self.txbx.pack(fill=tk.BOTH, expand=1)\n        self.txbx.focus()\n        self.txbx.bind(\"&lt;Control-s>\", self.from_string)\n        self.txbx.bind(\"&lt;Control-o>\", self.open)\n\n    def open(self, event=\"\"):\n        os.startfile(\"pdf2.pdf\")\n\n    def help(self, event=\"\"):\n        messagebox.showinfo(\"HELP\", \"Scrivi qualcosa usando anche l'HTML\\nCTRL + s per salvare il file\\CTRL + o per aprirlo nel beowser\")\n\n    def from_file(self):\n        with open(\"pdf.html\", \"w\") as file:\n            file.write(content)\n        pdfkit.from_file(\"pdf.html\", \"pdf2.pdf\", configuration=config)\n\n\n    def from_string(self, event=\"\"):\n        content = self.txbx.get(\"0.0\", tk.END)\n        content = content.replace(\"\\n\", \"&lt;br>\")\n        pdfkit.from_string(content, \"pdf2.pdf\", configuration=config)\n        print(\"Salvato file pdf (ctrl+o per vederlo)\")\n        messagebox.showinfo(\"File creato\",\"CTRL + o per aprire il file\")\n\n\n\nwin = Window()<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">In the class Window we got the GUI, with menu, text area etc. With CTRL+s you will create the file, with CTRL+o you will open it into the browser. You can use, of course html to create titles, paragraphs, change colors and load images too to include into the pdf, so you can make everything you want. You can also make a great thing: put an address of a web page and get the pdf of it. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Let&#8217;s see how bard described my code<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The code you provided is a Python script that uses the pdfkit library to create a PDF file from either a string or a URL. The script first imports the necessary libraries, including tkinter, messagebox, pdfkit, os, and codecs. It then defines a class called Window, which contains the main functionality of the script. The Window class has a number of methods, including widgets(), from_string(), from_url(), open(), help(), and get_content().<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The widgets() method creates the user interface for the script. It creates a menu bar with three menu items: PDF from String, PDF from URL, and Open pdf. The menu items call the from_string(), from_url(), and open() methods, respectively.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The from_string() method takes a string as input and creates a PDF file from it. The string can contain any HTML content. The from_url() method takes a URL as input and creates a PDF file from the content of the URL. The open() method opens the PDF file in the default PDF viewer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The help() method displays a help message that explains how to use the script. The get_content() method gets the content of the text box in the user interface.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The main() method creates an instance of the Window class and starts the mainloop.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To run the script, you can save it as a Python file and then run it from the command line. For example, if you save the script as <code>pdfkit.py<\/code>, you can run it by typing the following command into the command line:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">python pdfkit.py<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This will create a PDF file called <code>pdf2.pdf<\/code> in the current directory. You can then open the PDF file in your default PDF viewer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Goog job bard. BTW chatGPT wasn&#8217;t working for the same duty, some issues today. Boh?!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">An example of an output<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Let me show how you can use this tool that I also put in this github repository at the voice html_to_pdf.py<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/formazione\/tkinter_tutorial\">https:\/\/github.com\/formazione\/tkinter_tutorial<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/formazione\/tkinter_tutorial\/blob\/master\/html_a_pdf2.py\">https:\/\/github.com\/formazione\/tkinter_tutorial\/blob\/master\/html_a_pdf2.py<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The code has been updated with from_url, but it does not work properly.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you write this into the app:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-22.png\"><img loading=\"lazy\" decoding=\"async\" width=\"888\" height=\"519\" src=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-22.png\" alt=\"\" class=\"wp-image-13089\" srcset=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-22.png 888w, https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-22-320x187.png 320w, https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-22-768x449.png 768w\" sizes=\"auto, (max-width: 888px) 100vw, 888px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">You will get this pdf<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-21.png\"><img loading=\"lazy\" decoding=\"async\" width=\"960\" height=\"585\" src=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-21-960x585.png\" alt=\"\" class=\"wp-image-13088\" srcset=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-21-960x585.png 960w, https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-21-320x195.png 320w, https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-21-768x468.png 768w, https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-21.png 977w\" sizes=\"auto, (max-width: 960px) 100vw, 960px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><!-- 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><\/p>\n","protected":false},"excerpt":{"rendered":"tkinter app to write in html or simple text and get a pdf with just this app, installing the module pdfkit\n<a class=\"moretag\" href=\"https:\/\/pythonprogramming.altervista.org\/create-a-pdf-with-html-and-python\/\"> [...]<\/a>","protected":false},"author":1,"featured_media":13088,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_crdt_document":"","footnotes":""},"categories":[1,49],"tags":[52,4,51],"class_list":["post-13079","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-examples","category-tkinter","tag-gui","tag-python","tag-tkinter"],"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\/13079","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=13079"}],"version-history":[{"count":6,"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/posts\/13079\/revisions"}],"predecessor-version":[{"id":13147,"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/posts\/13079\/revisions\/13147"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/media\/13088"}],"wp:attachment":[{"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/media?parent=13079"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/categories?post=13079"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/tags?post=13079"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}