Pregunta

Después de haber jugado un poco con Tkinter y wxPython, me gusta mucho más Tkinter en términos de cuán limpio se ve mi código fuente. Sin embargo, no parece tener tantas características; en particular no tiene pestañas (como en las pestañas 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 le permite usar pestañas, 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 GUI con pestañas en Tkinter? ¿Que usaste? ¿O es simplemente el caso de que cualquiera que necesite componentes de ventanas más potentes tiene que usar wxPython?

¿Fue útil?

Solución

En versiones recientes de Python (> 2.7), puede usar el ttk , que proporciona acceso al conjunto widget temático Tk , que se ha introducido en Tk 8.5 .

Aquí se explica cómo importar ttk en Python 2:

import ttk

help(ttk.Notebook)

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

Aquí hay un ejemplo de trabajo simple basado en un ejemplo de TkDocs sitio 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()

Otra alternativa es utilizar el widget NoteBook del tkinter.tix biblioteca. Para usar tkinter.tix , debe tener instalados los widgets Tix , generalmente junto con la instalación de los widgets 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, consulte 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 ir a ttk.Notebook .

Otros consejos

Si alguien sigue buscando, tengo esto funcionando como Tab en tkinter. Juegue con el código para que funcione de la manera 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 no serle útil 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 '' mosaico ''. Incluido en el conjunto extendido de widgets hay un widget de cuaderno. Desafortunadamente, en este momento, Tkinter utiliza de forma predeterminada una versión bastante antigua de Tk que no viene con estos widgets.

Se han realizado esfuerzos para que el mosaico esté disponible para Tkinter. Consulte http://tkinter.unpythonic.net/wiki/TileWrapper . Para otro esfuerzo similar, vea http://pypi.python.org/pypi/pyttk . Además, para ver cómo se ven estos widgets (en Ruby, Perl y Tcl), consulte http: //www.tkdocs. com / .

Tk 8.5 es una mejora enorme sobre el stock Tk. Presenta varios widgets nuevos, widgets nativos y un motor de temas. Esperemos que esté disponible por defecto en Tkinter algún día pronto. Lástima que el mundo de Python esté rezagado con respecto a otros idiomas.

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

" ¿O es simplemente el caso de que cualquiera que necesite componentes de ventanas más potentes tiene que usar wxPython? "
Respuesta corta: sí.

Respuesta larga: Puede tomar algo de práctica para que su código wxPython se sienta "limpio". pero es más bonito 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 Python puro, por lo que debería funcionar.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top