Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Pestañas laterales Tkinter Notebook
#1
Buenas:

Como dice el título del tema me gustaría saber si existe alguna manera de que las petañas que añadimos a un notebook en vez de hacerlo en la parte superior, se haga en un lateral o en la parte inferior.

Muchas Gracias.
Responder
#2
Hola. Sí se puede, acá tenés un ejemplo:

  1. import tkinter as tk
  2. from tkinter import ttk
  3.  
  4. root = tk.Tk()
  5. root.minsize(300, 300)
  6. root.geometry("1000x700")
  7.  
  8. s = ttk.Style()
  9. # Alineadas a la izquierda.
  10. s.configure('TNotebook', tabposition='w')
  11.  
  12. box = ttk.Notebook(root, width=1000, height=650)
  13.  
  14. tab1 = tk.Frame(root)
  15. tab2 = tk.Frame(root)
  16. tab3 = tk.Frame(root)
  17.  
  18. box.add(tab1, text="tab1")
  19. box.add(tab2, text="tab2")
  20. box.add(tab3, text="tab3")
  21.  
  22. box.pack(side=tk.TOP)
  23.  
  24. root.mainloop()


Los valores posibles para tabposition son:
  • n (arriba)
  • s (abajo)
  • w (izquierda)
  • e (derecha)
  • ne (extremo superior derecho)
  • nw (extremo superior izquierdo; este es el valor por defecto)
  • se (extremo inferior derecho)
  • sw (extremo inferior izquierdo)
  • wn (extremo izquierdo superior)
  • ws (extremo izquierdo inferior)
  • en (extremo derecho superior)
  • es (extremo derecho inferior)
Saludos
Responder
#3
Muchas gracias.

Es más fácil de lo que me esperaba
Responder
#4
Buenas:

Para no reabrir otro tema relacionado con el notebook de Tkinter lo pongo aquí:

Estoy haciendo pruebas para obtener un determinado elemento en un panel de pestañas pero soy incapaz.

Tengo esta mini aplicación(Es una prueba y por tanto es cutre y no hay que hacer caso a los import):

from tkinter import *
from tkinter import ttk
from datetime import *
from tkinter import messagebox
import time
import calendar
import psycopg2
import threading
from threading import Timer
import os
import sys
from functools import partial

class prueba:
    
    def __init__(self):
        
        self.root = Tk()
        self.root.title("PRUEBAS")
        self.root.geometry('600x300+500+200')
        
        def añadir():
            
            self.pestaña = ttk.Frame(self.cliente)
            self.cliente.add(self.pestaña, text='CLIENTE')
            
            self.nombre = ttk.Entry(self.pestaña)
            self.nombre.grid(row=1, column=0)
        
        def conseguido():
            x = self.cliente.tabs()
            
            for ele in x:
                
                self.imprime = ttk.Label(self.root, text=(self.nombre.get()))
                self.imprime.grid(row=3, column=0)
            
            
                    
        
        self.cliente = ttk.Notebook(self.root)
        self.cliente.grid(row=0, column=0)
        
        self.pestaña = ttk.Frame(self.cliente)
        self.cliente.add(self.pestaña, text='CLIENTE')
        
        self.nombre = ttk.Entry(self.pestaña)
        self.nombre.grid(row=0, column=0)
        
        self.añade = ttk.Button(self.root, text='AÑADE', command=añadir)
        self.añade.grid(row=1, column=0)
        
        self.conseguir = ttk.Button(self.root, text='CONSIGE', command=conseguido)
        self.conseguir.grid(row=2, column=0)
        
        
        
        
        
        self.root.mainloop()

def main():
    my_app = prueba()
    
if __name__ == '__main__':
    main()


Bien la idea es conseguir los nombres de todas las pestañas que figuran en los Entrys. Con lo que os mando lo único que consigo es que me imprima el nombre de la última pestaña. Siempre ignora los de las anteriores pestañas. Lo que me impide también hacer modificaciones en las pestañas anteriores a la última ya que no quedan reflejadas en la impresión. ¿Alguna idea?

Muchas Gracias.
Responder
#5
Hola. Lo ideal sería que guardes cada una de las cajas de texto que vas creando en una lista.

  1. from tkinter import *
  2. from tkinter import ttk
  3. from datetime import *
  4. from tkinter import messagebox
  5. import time
  6. import calendar
  7. import threading
  8. from threading import Timer
  9. import os
  10. import sys
  11. from functools import partial
  12.  
  13. class prueba:
  14.  
  15. def __init__(self):
  16.  
  17. self.root = Tk()
  18. self.root.title("PRUEBAS")
  19. self.root.geometry('600x300+500+200')
  20.  
  21. self.imprime = ttk.Label(self.root)
  22. self.imprime.grid(row=3, column=0)
  23.  
  24. def añadir():
  25.  
  26. self.pestaña = ttk.Frame(self.cliente)
  27. self.cliente.add(self.pestaña, text='CLIENTE')
  28.  
  29. self.nombre = ttk.Entry(self.pestaña)
  30. self.entries.append(self.nombre)
  31. self.nombre.grid(row=1, column=0)
  32.  
  33. def conseguido():
  34. self.imprime['text'] = ", ".join(
  35. entry.get() for entry in self.entries)
  36.  
  37. self.cliente = ttk.Notebook(self.root)
  38. self.cliente.grid(row=0, column=0)
  39.  
  40. self.pestaña = ttk.Frame(self.cliente)
  41. self.cliente.add(self.pestaña, text='CLIENTE')
  42.  
  43. self.nombre = ttk.Entry(self.pestaña)
  44. self.entries = [self.nombre]
  45. self.nombre.grid(row=0, column=0)
  46.  
  47. self.añade = ttk.Button(self.root, text='AÑADE', command=añadir)
  48. self.añade.grid(row=1, column=0)
  49.  
  50. self.conseguir = ttk.Button(self.root, text='CONSIGE', command=conseguido)
  51. self.conseguir.grid(row=2, column=0)
  52.  
  53.  
  54.  
  55.  
  56.  
  57. self.root.mainloop()
  58.  
  59. def main():
  60. my_app = prueba()
  61.  
  62. if __name__ == '__main__':
  63. main()


Saludos
Responder
#6
(10-04-2019, 02:19 PM)Francisco escribió: Hola. Lo ideal sería que guardes cada una de las cajas de texto que vas creando en una lista.

  1. from tkinter import *
  2. from tkinter import ttk
  3. from datetime import *
  4. from tkinter import messagebox
  5. import time
  6. import calendar
  7. import threading
  8. from threading import Timer
  9. import os
  10. import sys
  11. from functools import partial
  12.  
  13. class prueba:
  14.    
  15.    def __init__(self):
  16.        
  17.        self.root = Tk()
  18.        self.root.title("PRUEBAS")
  19.        self.root.geometry('600x300+500+200')
  20.        
  21.        self.imprime = ttk.Label(self.root)
  22.        self.imprime.grid(row=3, column=0)
  23.        
  24.        def añadir():
  25.            
  26.            self.pestaña = ttk.Frame(self.cliente)
  27.            self.cliente.add(self.pestaña, text='CLIENTE')
  28.            
  29.            self.nombre = ttk.Entry(self.pestaña)
  30.            self.entries.append(self.nombre)
  31.            self.nombre.grid(row=1, column=0)
  32.        
  33.        def conseguido():
  34.            self.imprime['text'] = ", ".join(
  35.                entry.get() for entry in self.entries)
  36.        
  37.        self.cliente = ttk.Notebook(self.root)
  38.        self.cliente.grid(row=0, column=0)
  39.        
  40.        self.pestaña = ttk.Frame(self.cliente)
  41.        self.cliente.add(self.pestaña, text='CLIENTE')
  42.        
  43.        self.nombre = ttk.Entry(self.pestaña)
  44.        self.entries = [self.nombre]
  45.        self.nombre.grid(row=0, column=0)
  46.        
  47.        self.añade = ttk.Button(self.root, text='AÑADE', command=añadir)
  48.        self.añade.grid(row=1, column=0)
  49.        
  50.        self.conseguir = ttk.Button(self.root, text='CONSIGE', command=conseguido)
  51.        self.conseguir.grid(row=2, column=0)
  52.        
  53.        
  54.        
  55.        
  56.        
  57.        self.root.mainloop()
  58.  
  59. def main():
  60.    my_app = prueba()
  61.    
  62. if __name__ == '__main__':
  63.    main()


Saludos
MUCHAS GRACIAS!!!!.

       def conseguido():
           self.imprime['text'] = ", ".join(
               entry.get() for entry in self.entries)

No entiendo muy bien esta parte. (nunca he usado .join()
Responder
#7
join() genera una nueva cadena a partir de un delimitador (en este caso, una coma y un espacio) y los elementos de una lista (que también tienen que ser cadenas). Así,

  1. ", ".join(["A", "B", "C"])


genera la cadena "A, B, C". Más info. acá: https://recursospython.com/guias-y-manua...s-cadenas/.

Saludos
Responder
#8
Buenas:

Muchas gracias por la explicación del join(). Creo que me será muy útil. En la práctica cutre fue fácil, en la app que estoy desarrollando no tanto ya que yo lo que necesito es coger muchos entries y comboboxes de distintas pestañas para guardarlos en un registro realizado a través de un treeview con columnas. (Aún no lo he conseguido pero estoy en ello).

¿Habría alguna posibilidad de coger los valores (entrys y comboboxes) de la pestaña seleccionada y así añadirlos a dicho registro (treeview) con un botón (así como modificarlos y con los datos de la pestaña seleccionada volver a añadirlos al registro)?

He probado con self.notebook.select(), con self.notebook.index(CURRENT) y nada de nada. Siempre me coge los valores de la última pestaña añadida.

Muchas gracias.

P.D. Os mando un par de imágenes de la app para que os hagáis una idea de como es dicha app y lo que quiero.


Archivos adjuntos Miniatura(s)
       
Responder
#9
(04-05-2019, 06:43 AM)Myszowor escribió: Buenas:

Muchas gracias por la explicación del join(). Creo que me será muy útil. En la práctica cutre fue fácil, en la app que estoy desarrollando no tanto ya que yo lo que necesito es coger muchos entries y comboboxes de distintas pestañas para guardarlos en un registro realizado a través de un treeview con columnas. (Aún no lo he conseguido pero estoy en ello).

¿Habría alguna posibilidad de coger los valores (entrys y comboboxes) de la pestaña seleccionada y así añadirlos a dicho registro (treeview) con un botón (así como modificarlos y con los datos de la pestaña seleccionada volver a añadirlos al registro)?

He probado con self.notebook.select(), con self.notebook.index(CURRENT) y nada de nada. Siempre me coge los valores de la última pestaña añadida.

Muchas gracias.

P.D. Os mando un par de imágenes de la app para que os hagáis una idea de como es dicha app y lo que quiero.
Buenas:

Sigo erre que erre. He avanzado un poco y mediante las listas (Gracias Francisco) he conseguido introducir en el registro los nombres de todas las pestañas. Ahora el problema viene con las modificaciones.

¿Cómo modificar una lista cuyos elementos son cadenas?. Es decir, si yo tengo una lista:

lista = [Josema, Josele, Pepiño]

y quiero cambiar que no mover ni borrar el nombre de Josele por Sebastian, ¿Cómo hacerlo?.

He visto que se podría hacer mediante la creación de una "lista temporal" aunque lo ideal son las llamadas listas por compresión que no tengo muy claro como funcionan.

No doy con la fórmula de una ni de otra. ¿Alguna ayuda?. Muchas Gracias.
Responder
#10
Hola. Si tu lista es esta...

  1. lista = ["Josema", "Josele", "Pepiño"]


...y querés cambiar Josele por Sebastian, simplemente:

  1. lista[1] = "Sebastian"


¿Era esa tu inquietud?
Responder


Salto de foro:


Usuarios navegando en este tema: 2 invitado(s)