{"id":5805,"date":"2024-08-29T06:31:57","date_gmt":"2024-08-29T06:31:57","guid":{"rendered":"https:\/\/wikiform.fr\/codespace\/boite-de-message-modale-en-tkinter-guide\/"},"modified":"2024-08-29T06:32:00","modified_gmt":"2024-08-29T06:32:00","slug":"boite-de-message-modale-en-tkinter-guide","status":"publish","type":"post","link":"https:\/\/wikiform.fr\/codespace\/boite-de-message-modale-en-tkinter-guide\/","title":{"rendered":"6.7 Bo\u00eete de Message Modale en Tkinter : Guide"},"content":{"rendered":"\n<p><strong>Les bo\u00eetes de message modales en Tkinter<\/strong> sont des outils essentiels pour am\u00e9liorer l&rsquo;interaction utilisateur dans les applications GUI en Python. En comprenant comment impl\u00e9menter et utiliser les <strong>bo\u00eetes de message modales en Tkinter<\/strong>, vous pouvez significativement am\u00e9liorer l&rsquo;exp\u00e9rience utilisateur de vos applications. Dans ce tutoriel, nous allons explorer leur fonctionnement et leur mise en \u0153uvre \u00e0 travers des exemples de code concrets.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Introduction aux <strong>Bo\u00eetes de Messages Modales en Tkinter<\/strong><\/h2>\n\n\n\n<div id=\"videoContainer\" style=\"position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; background: #000;\">\n  <iframe src=\"https:\/\/player.vimeo.com\/video\/583378159?dnt=1&#038;fullscreen=0&#038;pip=0\" loading=\"lazy\" loading=\"lazy\" style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\" frameborder=\"0\" allow=\"autoplay\" allowfullscreen id=\"vimeoPlayer\"><\/iframe>\n  \n  <!-- Popup Desktop -->\n  <div id=\"popupContainer\" class=\"desktop-popup\" style=\"display: none; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 90%; max-width: 400px; padding: 20px; border-radius: 10px; text-align: center; box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.1); background-color: rgba(255, 255, 255, 0.95); box-sizing: border-box;\">\n    <h2 style=\"color: #333; font-size: 1.5em; margin: 10px 0;\" id=\"profitez-de-loffre-spciale-\">Profitez de l\u2019offre sp\u00e9ciale !<\/h2>\n    <p style=\"color: #e74c3c; font-size: 1.2em; margin: 10px 0;\">Obtenez notre cours pour seulement <strong id=\"price\">29.5\u20ac<\/strong> au lieu de <del>59\u20ac<\/del> !<\/p>\n    <a href=\"https:\/\/wikiform.fr\/application\/learnify\/home\/course\/devenir-un-d%C3%A9veloppeur-python\/144\" target=\"_blank\" style=\"display: block; padding: 10px 20px; background-color: #701CF5; color: #fff; text-decoration: none; border-radius: 5px; font-weight: bold; font-size: 1em; margin: 20px auto;\" rel=\"noopener\">Commencer maintenant<\/a>\n    <button onclick=\"closePopup()\" style=\"padding: 10px 20px; font-size: 1em;\">Fermer<\/button>\n  <\/div>\n\n  <!-- Popup Mobile -->\n  <div id=\"popupContainerMobile\" class=\"mobile-popup\" style=\"display: none; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 80%; max-width: 300px; padding: 15px; border-radius: 10px; text-align: center; box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.1); background-color: rgba(255, 255, 255, 0.95); box-sizing: border-box;\">\n    <p style=\"color: #e74c3c; font-size: 1em; margin: 5px 0;\">Cours sp\u00e9cial \u00e0 <strong id=\"priceMobile\">29.5\u20ac<\/strong> au lieu de <del>59\u20ac<\/del> !<\/p>\n    <a href=\"https:\/\/wikiform.fr\/application\/learnify\/home\/course\/devenir-un-d%C3%A9veloppeur-python\/144\" target=\"_blank\" style=\"display: inline-block; padding: 8px 15px; background-color: #701CF5; color: #fff; text-decoration: none; border-radius: 5px; font-weight: bold; font-size: 0.9em;\" rel=\"noopener\">Commencer maintenant<\/a>\n    <button onclick=\"closePopup()\" style=\"padding: 5px 10px; font-size: 0.9em;\">Fermer<\/button>\n  <\/div>\n<\/div>\n\n<script src=\"https:\/\/player.vimeo.com\/api\/player.js\"><\/script>\n<script>\ndocument.addEventListener('DOMContentLoaded', function() {\n    var iframe = document.getElementById('vimeoPlayer');\n    var player = new Vimeo.Player(iframe);\n    var isPopupDisplayed = false;\n\n    player.on('play', function() {\n        if (!isPopupDisplayed) {\n            player.on('timeupdate', function(data) {\n                if (data.seconds >= 120 && !isPopupDisplayed) { \/\/ 120 seconds = 2 minutes\n                    \/\/ Pause the video and display the popup\n                    player.pause().then(function() {\n                        if (window.innerWidth > 768) {\n                            document.querySelector('.desktop-popup').style.display = 'block';\n                        } else {\n                            document.querySelector('.mobile-popup').style.display = 'block';\n                        }\n                        fetchPriceAndUpdatePopup();\n                        isPopupDisplayed = true;\n                    });\n                }\n            });\n        }\n    });\n\n    function fetchPriceAndUpdatePopup() {\n        fetch('https:\/\/wikiform.fr\/application\/learnify\/home\/course\/devenir-un-d%C3%A9veloppeur-python\/144')\n            .then(response => response.text())\n            .then(html => {\n                var parser = new DOMParser();\n                var fetchedDoc = parser.parseFromString(html, 'text\/html');\n                var priceElement = fetchedDoc.querySelector('.ammount .fw-500');\n                var originalPriceElement = fetchedDoc.querySelector('.ammount del');\n                var price = priceElement ? priceElement.textContent.trim() : '29.5\u20ac';\n                var originalPrice = originalPriceElement ? originalPriceElement.textContent.trim() : '59\u20ac';\n\n                document.getElementById('price').textContent = price;\n                document.getElementById('priceMobile').textContent = price;\n                document.querySelector('.desktop-popup del').textContent = originalPrice;\n                document.querySelector('.mobile-popup del').textContent = originalPrice;\n            })\n            .catch(error => console.error('Error fetching the price:', error));\n    }\n\n    function closePopup() {\n        document.querySelector('.desktop-popup').style.display = 'none';\n        document.querySelector('.mobile-popup').style.display = 'none';\n        player.play(); \/\/ Allows resuming the video only after closing the popup\n    }\n});\n<\/script>\n\n\n\n<p>Les bo\u00eetes de messages modales en Tkinter permettent de pr\u00e9senter des informations ou de demander des confirmations \u00e0 l&rsquo;utilisateur de fa\u00e7on non-intrusive. Elles sont cruciales pour les notifications, les alertes, et la validation de certaines actions. Nous allons voir comment les utiliser efficacement.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Utiliser les Bo\u00eetes de Message Modales de Base en Tkinter<\/h3>\n\n\n\n<p>Pour commencer avec les bo\u00eetes de message modales en Tkinter, nous pouvons utiliser le module <code>tkinter.messagebox<\/code>. Voici les diff\u00e9rentes fonctions disponibles :<\/p>\n<ul>\n  <li><code>showinfo<\/code> : Affiche un message d&rsquo;information.<\/li>\n  <li><code>showwarning<\/code> : Affiche un avertissement.<\/li>\n  <li><code>showerror<\/code> : Affiche une erreur.<\/li>\n  <li><code>askquestion<\/code> : Pose une question (r\u00e9ponse &lsquo;yes&rsquo; ou &lsquo;no&rsquo;).<\/li>\n  <li><code>askokcancel<\/code> : Pose une question (r\u00e9ponse &lsquo;ok&rsquo; ou &lsquo;cancel&rsquo;).<\/li>\n  <li><code>askyesno<\/code> : Pose une question (r\u00e9ponse &lsquo;yes&rsquo; ou &lsquo;no&rsquo;).<\/li>\n  <li><code>askretrycancel<\/code> : Pose une question (r\u00e9ponse &lsquo;retry&rsquo; ou &lsquo;cancel&rsquo;).<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code lang-python\"><code>import tkinter as tk\nfrom tkinter import messagebox\n\ndef show_info():\n    messagebox.showinfo(\"Information\", \"Ceci est une bo\u00eete de message informatif.\")\n\ndef show_warning():\n    messagebox.showwarning(\"Avertissement\", \"Attention, ceci est un avertissement.\")\n\ndef show_error():\n    messagebox.showerror(\"Erreur\", \"Une erreur s'est produite.\")\n\ndef ask_question():\n    response = messagebox.askquestion(\"Question\", \"Voulez-vous continuer ?\")\n    print(f\"R\u00e9ponse : {response}\")\n\ndef ask_ok_cancel():\n    response = messagebox.askokcancel(\"Ok ou Annuler\", \"Voulez-vous annuler ?\")\n    print(f\"R\u00e9ponse : {response}\")\n\ndef ask_yes_no():\n    response = messagebox.askyesno(\"Oui ou Non\", \"Approuvez-vous cette action ?\")\n    print(f\"R\u00e9ponse : {response}\")\n\ndef ask_retry_cancel():\n    response = messagebox.askretrycancel(\"R\u00e9essayer ou Annuler\", \"Voulez-vous r\u00e9essayer l'action ?\")\n    print(f\"R\u00e9ponse : {response}\")\n\n# Interface Graphique\nroot = tk.Tk()\n\ntk.Button(root, text=\"Info\", command=show_info).pack()\ntk.Button(root, text=\"Warning\", command=show_warning).pack()\ntk.Button(root, text=\"Error\", command=show_error).pack()\ntk.Button(root, text=\"Question\", command=ask_question).pack()\ntk.Button(root, text=\"Ok\/Cancel\", command=ask_ok_cancel).pack()\ntk.Button(root, text=\"Yes\/No\", command=ask_yes_no).pack()\ntk.Button(root, text=\"Retry\/Cancel\", command=ask_retry_cancel).pack()\n\nroot.mainloop()\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Personnaliser les Bo\u00eetes de Message Modales<\/h3>\n\n\n\n<p>Bien que Tkinter ne permette pas une personnalisation excessive des bo\u00eetes de message modales via <code>tkinter.messagebox<\/code>, vous pouvez personnaliser leur contenu et leur style en cr\u00e9ant des fen\u00eatres toplevel personnalis\u00e9es pour une exp\u00e9rience utilisateur plus riche.<\/p>\n\n\n\n<pre class=\"wp-block-code lang-python\"><code>import tkinter as tk\n\ndef custom_message_box(title, message):\n    top = tk.Toplevel(root)\n    top.title(title)\n    top.geometry(\"300x150\")\n    \n    msg = tk.Message(top, text=message)\n    msg.pack(pady=10)\n    \n    btn_ok = tk.Button(top, text=\"OK\", command=top.destroy)\n    btn_ok.pack(pady=10)\n\n# Interface Graphique\nroot = tk.Tk()\n\ntk.Button(root, text=\"Afficher Message\", command=lambda: custom_message_box(\"Custom Message\", \"Voici une bo\u00eete de message personnalis\u00e9e.\")).pack()\n\nroot.mainloop()\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Utilisation Avanc\u00e9e des Bo\u00eetes de Messages Modales<\/h3>\n\n\n\n<p>Pour des applications complexes, les bo\u00eetes de messages modales peuvent \u00eatre int\u00e9gr\u00e9es \u00e0 des processus de validation et d&rsquo;autres interactions utilisateur. Voici un exemple d&rsquo;utilisation avanc\u00e9e o\u00f9 nous demandons la confirmation avant de fermer une fen\u00eatre :<\/p>\n\n\n\n<pre class=\"wp-block-code lang-python\"><code>import tkinter as tk\nfrom tkinter import messagebox\n\ndef on_closing():\n    if messagebox.askokcancel(\"Quitter\", \"Voulez-vous vraiment quitter ?\"):\n        root.destroy()\n\nroot = tk.Tk()\nroot.protocol(\"WM_DELETE_WINDOW\", on_closing) # Redirige l'\u00e9v\u00e9nement de fermeture vers on_closing\n\ntk.Label(root, text=\"Essayez de fermer cette fen\u00eatre.\").pack(pady=20)\n\nroot.mainloop()\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>Les <strong>bo\u00eetes de message modales en Tkinter<\/strong> sont des composants essentiels pour interagir efficacement avec les utilisateurs de vos applications GUI. En combinant les bo\u00eetes de messages de base et les fen\u00eatres personnalis\u00e9es, vous pouvez am\u00e9liorer la communication et la validation dans vos applications. Continuez \u00e0 explorer Tkinter pour d\u00e9couvrir d&rsquo;autres outils qui enrichiront vos interfaces utilisateurs. Pour plus de tutoriels, consultez notre article sur <a href=\"https:\/\/wikiform.fr\/application\/learnify\/home\/course\/tkinter-interm\u00e9diaire-avanc\u00e9\/150\">les fonctionnalit\u00e9s interm\u00e9diaires et avanc\u00e9es de Tkinter<\/a>. Pour apprendre \u00e0 cr\u00e9er une bo\u00eete de message avanc\u00e9e, consultez notre <a href=\"https:\/\/wikiform.fr\/codespace\/bo\u00eete-de-message-avanc\u00e9e-avec-tkinter-tutoriel\">tutoriel d\u00e9taill\u00e9<\/a>. Vous pouvez \u00e9galement explorer notre guide sur la <a href=\"https:\/\/wikiform.fr\/codespace\/installer-python-sur-mac-2024-guide-complet\">configuration de Python sur macOS<\/a> ou <a href=\"https:\/\/wikiform.fr\/codespace\/installer-python-sur-windows-facilement\">installer Python sous Windows<\/a>. Si vous \u00eates d\u00e9butant, commencez par \u00e9crire votre <a href=\"https:\/\/wikiform.fr\/codespace\/premier-programme-python-hello-world\">premier programme Python<\/a>.<\/p>\n\n\n\n<a href=\"https:\/\/wikiform.fr\/application\/learnify\/home\/course\/devenir-un-d%C3%A9veloppeur-python\/144\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" src=\"https:\/\/wikiform.fr\/codespace\/wp-content\/uploads\/2024\/07\/learnify-formation-PYTHON-offre-50.gif\" loading=\"lazy\" alt=\"Learnify Formation Python Offre 50%\" title=\"\"><\/a>\n","protected":false},"excerpt":{"rendered":"<p>Les bo\u00eetes de message modales en Tkinter sont des outils essentiels pour am\u00e9liorer l&rsquo;interaction utilisateur dans les applications GUI en Python. En comprenant comment impl\u00e9menter&#8230;<\/p>\n","protected":false},"author":4,"featured_media":2980,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[24],"tags":[18],"class_list":["post-5805","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-python","tag-tutoriels"],"acf":[],"_titre_de_la_formation":null,"_description_":null,"_objectifs_pedagogiques":null,"_programme_":null,"_url_de_limage":null,"_materiel_necessaire":null,"_modalites_devaluation_des_acquis":null,"_moyens_pedagogiques_et_techniques":null,"_accessibilite_":null,"_formateur_":null,"menu_order":0,"_links":{"self":[{"href":"https:\/\/wikiform.fr\/codespace\/wp-json\/wp\/v2\/posts\/5805","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wikiform.fr\/codespace\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wikiform.fr\/codespace\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wikiform.fr\/codespace\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/wikiform.fr\/codespace\/wp-json\/wp\/v2\/comments?post=5805"}],"version-history":[{"count":1,"href":"https:\/\/wikiform.fr\/codespace\/wp-json\/wp\/v2\/posts\/5805\/revisions"}],"predecessor-version":[{"id":5806,"href":"https:\/\/wikiform.fr\/codespace\/wp-json\/wp\/v2\/posts\/5805\/revisions\/5806"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wikiform.fr\/codespace\/wp-json\/wp\/v2\/media\/2980"}],"wp:attachment":[{"href":"https:\/\/wikiform.fr\/codespace\/wp-json\/wp\/v2\/media?parent=5805"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wikiform.fr\/codespace\/wp-json\/wp\/v2\/categories?post=5805"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wikiform.fr\/codespace\/wp-json\/wp\/v2\/tags?post=5805"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}