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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top