Widget per notebook in Tkinter
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?
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.