{"id":5817,"date":"2024-08-29T06:56:31","date_gmt":"2024-08-29T06:56:31","guid":{"rendered":"https:\/\/wikiform.fr\/codespace\/utiliser-le-menu-widget-en-tkinter\/"},"modified":"2024-08-29T06:56:34","modified_gmt":"2024-08-29T06:56:34","slug":"utiliser-le-menu-widget-en-tkinter","status":"publish","type":"post","link":"https:\/\/wikiform.fr\/codespace\/utiliser-le-menu-widget-en-tkinter\/","title":{"rendered":"6.13 Utiliser le Menu Widget en Tkinter"},"content":{"rendered":"\u00ab\u00a0`html\n\n<p><strong>Les menus des widgets en Tkinter<\/strong> sont des composants essentiels pour cr\u00e9er des interfaces utilisateur interactives en Python. Comprendre comment utiliser les <strong>menus des widgets en Tkinter<\/strong> peut grandement am\u00e9liorer l&rsquo;ergonomie et la navigation de vos applications GUI. Explorons les menus en profondeur et voyons comment les int\u00e9grer dans vos projets gr\u00e2ce \u00e0 des exemples pratiques de code.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Introduction aux <strong>Menus Widgets 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\/583386262?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 <strong>menus en Tkinter<\/strong> permettent de cr\u00e9er des barres de menus, des menus contextuels (click droit), et plusieurs options pour guider l&rsquo;utilisateur \u00e0 travers les diff\u00e9rentes fonctionnalit\u00e9s de votre application. Ces menus peuvent am\u00e9liorer l&rsquo;exp\u00e9rience utilisateur en offrant une navigation intuitive et rapide.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Cr\u00e9er un Menu de Base avec Tkinter<\/h3>\n\n\n\n<p>Pour commencer, nous allons cr\u00e9er un menu de base qui appara\u00eetra en haut de notre fen\u00eatre Tkinter. Voici un exemple simple :<\/p>\n\n\n\n<pre class=\"wp-block-code lang-python\"><code>import tkinter as tk\n\nroot = tk.Tk()\n\n# Cr\u00e9er une barre de menus\nmenu_bar = tk.Menu(root)\n\n# Ajouter un menu d\u00e9roulant\nfile_menu = tk.Menu(menu_bar, tearoff=0)\nfile_menu.add_command(label=\"Ouvrir\")\nfile_menu.add_command(label=\"Enregistrer\")\n\n# Ajouter un sous-menu\nfile_menu.add_separator()\nfile_menu.add_command(label=\"Quitter\", command=root.quit)\n\nmenu_bar.add_cascade(label=\"Fichier\", menu=file_menu)\n\n# Attacher la barre de menus \u00e0 la fen\u00eatre root\nroot.config(menu=menu_bar)\n\nroot.mainloop()\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Ajouter des Menus Contextuels avec Tkinter<\/h3>\n\n\n\n<p>Les menus contextuels sont des menus qui s&rsquo;affichent g\u00e9n\u00e9ralement lorsque l&rsquo;utilisateur fait un clic droit sur un widget. Ils permettent d&rsquo;offrir des options sp\u00e9cifiques en fonction du contexte de l&rsquo;utilisateur :<\/p>\n\n\n\n<pre class=\"wp-block-code lang-python\"><code>import tkinter as tk\n\ndef do_something():\n    print(\"Action d\u00e9clench\u00e9e\")\n\nroot = tk.Tk()\n\n# Cr\u00e9er un menu contextuel\ncontext_menu = tk.Menu(root, tearoff=0)\ncontext_menu.add_command(label=\"Option 1\", command=do_something)\ncontext_menu.add_command(label=\"Option 2\", command=do_something)\n\n# Fonction pour afficher le menu contextuel\ndef show_context_menu(event):\n    context_menu.tk_popup(event.x_root, event.y_root)\n\n# Attacher le menu contextuel \u00e0 un widget\nentry = tk.Entry(root)\nentry.pack()\nentry.bind(\"<Button-3>\", show_context_menu)\n\nroot.mainloop()\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Cr\u00e9er des Menus Dynamiques ou D\u00e9pendants d&rsquo;\u00c9tat<\/h3>\n\n\n\n<p>Souvent, le contenu des menus doit changer en fonction de l&rsquo;\u00e9tat de l&rsquo;application. Par exemple, certaines options peuvent \u00eatre d\u00e9sactiv\u00e9es ou modifi\u00e9es en fonction de l&rsquo;\u00e9tat actuel de l&rsquo;application :<\/p>\n\n\n\n<pre class=\"wp-block-code lang-python\"><code>import tkinter as tk\n\ndef toggle_option_state():\n    if state_var.get():\n        option_menu.entryconfig(\"Option 1\", state=\"disabled\")\n    else:\n        option_menu.entryconfig(\"Option 1\", state=\"normal\")\n\nroot = tk.Tk()\n\n# Variable d'\u00e9tat\nstate_var = tk.BooleanVar(value=False)\n\n# Cr\u00e9er une barre de menus et un menu d\u00e9roulant\nmenu_bar = tk.Menu(root)\noption_menu = tk.Menu(menu_bar, tearoff=0)\noption_menu.add_command(label=\"Option 1\", command=lambda: print(\"Option 1\"))\noption_menu.add_command(label=\"Option 2\", command=lambda: print(\"Option 2\"))\nmenu_bar.add_cascade(label=\"Options\", menu=option_menu)\n\nroot.config(menu=menu_bar)\n\n# Checkbox pour changer l'\u00e9tat des options\ncheck = tk.Checkbutton(root, text=\"Toggle Option 1 state\", variable=state_var, command=toggle_option_state)\ncheck.pack()\n\nroot.mainloop()\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Int\u00e9gration des Menus dans une Application Compl\u00e8te<\/h3>\n\n\n\n<p>Pour int\u00e9grer des menus plus complexes dans une application compl\u00e8te, voyons un exemple d&rsquo;\u00e9diteur de texte simple avec des options pour ouvrir, enregistrer et quitter :<\/p>\n\n\n\n<pre class=\"wp-block-code lang-python\"><code>import tkinter as tk\nfrom tkinter import filedialog\n\ndef open_file():\n    file_path = filedialog.askopenfilename()\n    if file_path:\n        with open(file_path, \"r\") as file:\n            text_editor.insert(tk.END, file.read())\n\ndef save_file():\n    file_path = filedialog.asksaveasfilename()\n    if file_path:\n        with open(file_path, \"w\") as file:\n            file.write(text_editor.get(1.0, tk.END))\n\nroot = tk.Tk()\n\n# Configuration du menu\nmenu_bar = tk.Menu(root)\nfile_menu = tk.Menu(menu_bar, tearoff=0)\nfile_menu.add_command(label=\"Ouvrir\", command=open_file)\nfile_menu.add_command(label=\"Enregistrer\", command=save_file)\nfile_menu.add_separator()\nfile_menu.add_command(label=\"Quitter\", command=root.quit)\nmenu_bar.add_cascade(label=\"Fichier\", menu=file_menu)\n\nroot.config(menu=menu_bar)\n\n# \u00c9diteur de texte\ntext_editor = tk.Text(root)\ntext_editor.pack(expand=True, fill=\"both\")\n\nroot.mainloop()\n<\/code><\/pre>\n\n\n\n<p>Ce tutoriel sur l&rsquo;utilisation des <strong>menus widgets en Tkinter<\/strong> fournit une base solide pour incorporer des menus dans vos applications Python. Ces menus enrichissent l&rsquo;interaction avec l&rsquo;utilisateur et facilitent la navigation. Pour poursuivre votre apprentissage, vous pouvez explorer des tutoriels avanc\u00e9s 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> ou rejoindre des cours en ligne pour une formation plus structur\u00e9e.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>Les <strong>menus widgets en Tkinter<\/strong> sont essentiels pour cr\u00e9er des interfaces utilisateur fluides et r\u00e9actives. En ma\u00eetrisant les bases de leur cr\u00e9ation et en explorant les fonctionnalit\u00e9s avanc\u00e9es, vous pouvez renforcer l&rsquo;interactivit\u00e9 et la convivialit\u00e9 de vos applications. Pour aller plus loin, ne manquez pas nos autres <a href=\"https:\/\/wikiform.fr\/codespace\/tutoriaux-tkinter\">tutoriels Tkinter<\/a> et d\u00e9couvrez des astuces pratiques pour une conception d&rsquo;interface de qualit\u00e9 sup\u00e9rieure.<\/p>\n\n\n<!-- Internal Links -->\n<p>Pour ceux qui d\u00e9butent avec Python, vous pouvez \u00e9galement consulter notre <a href=\"https:\/\/wikiform.fr\/codespace\/installer-python-sur-mac-2024-guide-complet\">guide sur l&rsquo;installation de Python sur Mac<\/a>, ou comment <a href=\"https:\/\/wikiform.fr\/codespace\/installer-python-sur-windows-facilement\">installer Python sur Windows facilement<\/a>. Nous recommandons \u00e9galement de lire notre tutoriel \u00e9tape par \u00e9tape sur <a href=\"https:\/\/wikiform.fr\/codespace\/installer-python-sur-linux-ubuntu-etape-par-etape\">l&rsquo;installation de Python sur Linux<\/a>. Pour un d\u00e9marrage rapide, d\u00e9couvrez notre article sur <a href=\"https:\/\/wikiform.fr\/codespace\/premier-programme-python-hello-world\">votre premier programme Python<\/a>.<\/p>\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\n\u00ab\u00a0`","protected":false},"excerpt":{"rendered":"<p>\u00ab\u00a0`html Les menus des widgets en Tkinter sont des composants essentiels pour cr\u00e9er des interfaces utilisateur interactives en Python. Comprendre comment utiliser les menus des&#8230;<\/p>\n","protected":false},"author":4,"featured_media":2968,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[24],"tags":[18],"class_list":["post-5817","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\/5817","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=5817"}],"version-history":[{"count":1,"href":"https:\/\/wikiform.fr\/codespace\/wp-json\/wp\/v2\/posts\/5817\/revisions"}],"predecessor-version":[{"id":5818,"href":"https:\/\/wikiform.fr\/codespace\/wp-json\/wp\/v2\/posts\/5817\/revisions\/5818"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wikiform.fr\/codespace\/wp-json\/wp\/v2\/media\/2968"}],"wp:attachment":[{"href":"https:\/\/wikiform.fr\/codespace\/wp-json\/wp\/v2\/media?parent=5817"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wikiform.fr\/codespace\/wp-json\/wp\/v2\/categories?post=5817"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wikiform.fr\/codespace\/wp-json\/wp\/v2\/tags?post=5817"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}