Widget de cuaderno en Tkinter

Habiendo jugado un poco con Tkinter y wxPython, me gusta mucho más Tkinter en cuanto a la limpieza de mi código fuente. Sin embargo, no parece tener tantas características; en particular, no tiene tabs (como en, las tabs en la parte superior de una ventana de Firefox).

Un poco de Google sobre el tema ofrece algunas sugerencias. Hay una entrada de libro de cocina con una clase que te permite usar tabs, pero es muy primitiva. También hay megawidgets de Python en SourceForge, aunque esto parece muy antiguo y me dio errores durante la instalación.

¿Alguien tiene experiencia haciendo GUIs con tabs en Tkinter? ¿Que usaste? ¿O es simplemente el caso de que alguien que necesite componentes de ventanas más potentes tenga que usar wxPython?

En las versiones recientes de Python (> 2.7), puede usar el módulo ttk , que proporciona acceso al conjunto de widgets temáticos Tk , que se ha introducido en Tk 8.5 .

Así es como importas ttk en Python 2:

 import ttk help(ttk.Notebook) 

En Python 3, el módulo ttk viene con las distribuciones estándar como un submódulo de tkinter .

Aquí hay un ejemplo simple de trabajo basado en un ejemplo del TkDocs web de TkDocs :

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

Otra alternativa es usar el widget tkinter.tix biblioteca tkinter.tix . Para utilizar tkinter.tix , debe tener instalados los widgets de Tix , generalmente junto con su instalación de los widgets de Tk . Para probar su instalación, intente lo siguiente:

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

Para obtener más información, visite esta página web en el sitio web de PSF.

Tenga en cuenta que tix es bastante antiguo y no está bien soportado, por lo que su mejor opción podría ser ttk.Notebook por ttk.Notebook .

Si alguien sigue buscando, tengo este trabajo como Tab en tkinter. Juegue con el código para que funcione de la forma que desee (por ejemplo, puede agregar un botón para agregar una nueva pestaña):

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

Si bien puede que no te ayude en este momento, tk 8.5 viene con un conjunto extendido de widgets. Este conjunto extendido está disponible con tk 8.4 a través de una extensión conocida como “azulejo”. Incluido en el conjunto extendido de widgets es un widget de cuaderno. Desafortunadamente, en este momento Tkinter utiliza por defecto una versión bastante antigua de Tk que no viene con estos widgets.

Se han realizado esfuerzos para hacer que la baldosa esté disponible para Tkinter. Echa un vistazo a http://tkinter.unpythonic.net/wiki/TileWrapper . Para otro esfuerzo similar, consulte http://pypi.python.org/pypi/pyttk . Además, para conocer cómo se ven estos widgets (en Ruby, Perl y Tcl), visite http://www.tkdocs.com/ .

Tk 8.5 es una gran mejora sobre el stock Tk. Introduce varios widgets nuevos, widgets nativos y un motor de tematización. Esperemos que esté disponible por defecto en Tkinter algún día pronto. Lástima que el mundo Python se esté quedando atrás en otros idiomas.

actualización: las últimas versiones de Python ahora incluyen soporte para widgets temáticos listos para usar. _

“¿O es simplemente el caso de que alguien que necesite componentes de ventanas más potentes tenga que usar wxPython?”
Respuesta corta: si.

Respuesta larga: puede tomar algo de práctica para que su código wxPython se sienta “limpio”, pero es más agradable y mucho más poderoso que Tkinter. También obtendrá un mejor soporte, ya que más personas lo usan en estos días.

¿Qué problemas tuviste con PMW? Es viejo, sí, pero es puro python, así que debería funcionar.

Tenga en cuenta que Tix no funciona con py2exe, si eso es un problema para usted.