Widget Notebook dans Tkinter
Question
Après avoir un peu joué avec Tkinter et wxPython, j'aime beaucoup mieux Tkinter pour ce qui est de la pureté de mon code source. Cependant, il ne semble pas avoir autant de fonctionnalités; en particulier, il n'a pas d'onglets (comme dans les onglets situés en haut d'une fenêtre de Firefox).
Un petit google sur le sujet offre quelques suggestions. Il existe une entrée de livre de recettes avec une classe vous permettant d'utiliser des onglets, mais c'est très primitif. Il existe également des mégawidgets Python sur SourceForge, même si cela semble très ancien et m'a causé des erreurs lors de l'installation.
Quelqu'un at-il de l'expérience dans la création d'interfaces graphiques à onglets dans Tkinter? Qu'as-tu utilisé? Ou est-ce simplement le cas que quiconque a besoin de composants de fenêtrage plus puissants doit utiliser wxPython?
La solution
Sur les versions récentes de Python (> 2.7), vous pouvez utiliser le ttk
, qui donne accès au jeu de widgets sur le thème Tk , introduit dans Tk 8.5
.
Voici comment importer ttk
en Python 2:
import ttk
help(ttk.Notebook)
En Python 3, le < Le module code> ttk est fourni avec les distributions standard en tant que sous-module de tkinter
.
Voici un exemple de travail simple basé sur un exemple tiré du TkDocs
site web:
from tkinter import ttk
import tkinter as tk
from tkinter.scrolledtext import ScrolledText
def demo():
root = tk.Tk()
root.title("ttk.Notebook")
nb = ttk.Notebook(root)
# adding Frames as pages for the ttk.Notebook
# first page, which would get widgets gridded into it
page1 = ttk.Frame(nb)
# second page
page2 = ttk.Frame(nb)
text = ScrolledText(page2)
text.pack(expand=1, fill="both")
nb.add(page1, text='One')
nb.add(page2, text='Two')
nb.pack(expand=1, fill="both")
root.mainloop()
if __name__ == "__main__":
demo()
Une autre alternative consiste à utiliser le widget NoteBook
de tkinter.tix
. Pour utiliser tkinter.tix
, vous devez avoir installé les widgets Tix
, généralement en même temps que votre installation des widgets Tk
. Pour tester votre installation, procédez comme suit:
from tkinter import tix
root = tix.Tk()
root.tk.eval('package require Tix')
Pour plus d'informations, consultez cette page Web sur le site Web PSF. .
Notez que tix
est assez ancien et n'est pas bien pris en charge. Votre meilleur choix serait donc de choisir ttk.Notebook
.
Autres conseils
Si quelqu'un cherche encore, cela fonctionne comme onglet dans tkinter. Jouez avec le code pour le faire fonctionner comme vous le souhaitez (par exemple, vous pouvez ajouter un bouton pour ajouter un nouvel onglet):
from tkinter import *
class Tabs(Frame):
"""Tabs for testgen output"""
def __init__(self, parent):
super(Tabs, self).__init__()
self.parent = parent
self.columnconfigure(10, weight=1)
self.rowconfigure(3, weight=1)
self.curtab = None
self.tabs = {}
self.addTab()
self.pack(fill=BOTH, expand=1, padx=5, pady=5)
def addTab(self):
tabslen = len(self.tabs)
if tabslen < 10:
tab = {}
btn = Button(self, text="Tab "+str(tabslen), command=lambda: self.raiseTab(tabslen))
btn.grid(row=0, column=tabslen, sticky=W+E)
textbox = Text(self.parent)
textbox.grid(row=1, column=0, columnspan=10, rowspan=2, sticky=W+E+N+S, in_=self)
# Y axis scroll bar
scrollby = Scrollbar(self, command=textbox.yview)
scrollby.grid(row=7, column=5, rowspan=2, columnspan=1, sticky=N+S+E)
textbox['yscrollcommand'] = scrollby.set
tab['id']=tabslen
tab['btn']=btn
tab['txtbx']=textbox
self.tabs[tabslen] = tab
self.raiseTab(tabslen)
def raiseTab(self, tabid):
print(tabid)
print("curtab"+str(self.curtab))
if self.curtab!= None and self.curtab != tabid and len(self.tabs)>1:
self.tabs[tabid]['txtbx'].lift(self)
self.tabs[self.curtab]['txtbx'].lower(self)
self.curtab = tabid
def main():
root = Tk()
root.geometry("600x450+300+300")
t = Tabs(root)
t.addTab()
root.mainloop()
if __name__ == '__main__':
main()
Bien que cela ne vous aide pas pour le moment, tk 8.5 est livré avec un ensemble étendu de widgets. Cet ensemble étendu est disponible avec tk 8.4 au moyen d'une extension appelée "tuile". Un ensemble de widgets est inclus dans l'ensemble étendu de widgets. Malheureusement, Tkinter utilise actuellement par défaut une version assez ancienne de Tk qui ne vient pas avec ces widgets.
Des efforts ont été déployés pour mettre Tile à la disposition de Tkinter. Consultez http://tkinter.unpythonic.net/wiki/TileWrapper . Pour un autre effort similaire, voir http://pypi.python.org/pypi/pyttk . De même, pour un aperçu de l'apparence de ces widgets (en Ruby, Perl et Tcl), voir http: //www.tkdocs. com / .
Tk 8.5 est une énorme amélioration par rapport au stock Tk. Il introduit plusieurs nouveaux widgets, des widgets natifs et un moteur de thématisation. Espérons qu'il sera disponible par défaut dans Tkinter un jour prochain. Dommage que le monde Python soit à la traîne par rapport aux autres langues.
mise à jour: les dernières versions de Python incluent désormais une prise en charge immédiate des widgets à thème. _
"Ou est-ce simplement le cas que quiconque a besoin de composants de fenêtrage plus puissants doit utiliser wxPython?".
Réponse courte: oui.
Réponse longue: Il faudra peut-être un peu de pratique pour que votre code wxPython se sente "propre", mais il est plus beau et beaucoup plus puissant que Tkinter. Vous obtiendrez également un meilleur soutien, car de plus en plus de gens l’utilisent de nos jours.
Quels problèmes aviez-vous avec pmw? C'est vieux, oui, mais c'est du pur python, donc ça devrait marcher.
Notez que Tix ne fonctionne pas avec py2exe, si cela vous pose problème.