Domanda

Avendo giocato un po 'con Tkinter e wxPython, mi piace molto Tkinter in termini di pulizia del mio codice sorgente. Tuttavia, non sembra avere tante funzionalità; in particolare non ha schede (come in, le schede nella parte superiore di una finestra di Firefox).

Un po 'di ricerche su Google sull'argomento offrono alcuni suggerimenti. C'è una voce del libro di cucina con una classe che ti consente di usare le schede, ma è molto primitivo. Ci sono anche megawidit Python su SourceForge, anche se questo sembra molto vecchio e mi ha dato errori durante l'installazione.

Qualcuno ha esperienza nella creazione di GUI a schede in Tkinter? Che cosa hai usato? O è semplicemente il caso che chiunque abbia bisogno di componenti per finestre più potenti debba usare wxPython?

È stato utile?

Soluzione

Nelle recenti versioni di Python (> 2.7), puoi utilizzare ttk , che fornisce l'accesso al set Widget tematico Tk , che è stato introdotto in Tk 8.5 .

Ecco come importare ttk in Python 2:

import ttk

help(ttk.Notebook)

In Python 3, il < Il modulo code> ttk include le distribuzioni standard come sottomodulo di tkinter .

Ecco un semplice esempio funzionante basato su un esempio del TkDocs sito 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()

Un'altra alternativa è utilizzare il widget NoteBook dal libreria tkinter.tix . Per usare tkinter.tix , devi avere i widget Tix installati, di solito insieme alla tua installazione dei widget Tk . Per testare la tua installazione, prova quanto segue:

from tkinter import tix
root = tix.Tk()
root.tk.eval('package require Tix')

Per ulteriori informazioni, consulta questa pagina web sul sito Web di PSF .

Nota che tix è piuttosto vecchio e non ben supportato, quindi la tua scelta migliore potrebbe essere quella di scegliere ttk.Notebook .

Altri suggerimenti

Se qualcuno è ancora alla ricerca, ho funzionato come Tab in tkinter. Gioca con il codice per farlo funzionare come desideri (ad esempio, puoi aggiungere un pulsante per aggiungere una nuova scheda):

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()

Anche se al momento potrebbe non esserti d'aiuto, tk 8.5 viene fornito con un set esteso di widget. Questo set esteso è disponibile con tk 8.4 tramite un'estensione nota come "tile". Nel set esteso di widget è incluso un widget per notebook. Sfortunatamente, al momento Tkinter usa una versione abbastanza vecchia di Tk che non viene fornita con questi widget.

Ci sono stati sforzi per rendere disponibili le tessere a Tkinter. Dai un'occhiata a http://tkinter.unpythonic.net/wiki/TileWrapper . Per un altro sforzo simile vedi http://pypi.python.org/pypi/pyttk . Inoltre, per un assaggio di come appaiono questi widget (in Ruby, Perl e Tcl) vedi http: //www.tkdocs. com / .

Tk 8.5 è un enorme miglioramento rispetto allo stock Tk. Presenta diversi nuovi widget, widget nativi e un motore di temi. Spero che presto sarà disponibile di default a Tkinter. Peccato che il mondo Python sia in ritardo rispetto ad altre lingue.

aggiornamento: le ultime versioni di Python ora includono il supporto per i widget a tema pronti all'uso. _

" O è semplicemente il caso che chiunque abbia bisogno di componenti per finestre più potenti debba usare wxPython? "
Risposta breve: sì.

Risposta lunga: Potrebbe essere necessario un po 'di pratica perché il tuo codice wxPython si senta "pulito", " ma è più bello e molto più potente di Tkinter. Otterrai anche un supporto migliore, dal momento che più persone lo usano in questi giorni.

Quali problemi hai avuto con pmw? È vecchio, sì, ma è puro pitone, quindi dovrebbe funzionare.

Nota che Tix non funziona con py2exe, se questo è un problema per te.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top