Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Tkinter margenes text widget
#1
hola,

Estoy haciendo la presentación de un texto con el widget Text, y tengo ciertos problemas con los márgenes.
Los margenes de texto estandar los toma correctamente.
El problema, es cuando trato de insertar una etiqueta, boton, o imagen con unos márgenes definidos en el tag_configure.

Pongo un ejemplo simple, donde se ve el problema (quiero poner la etiqueta con un margen de 45, como el resto del texto):


Código:
from tkinter import *

root = Tk()
caja_texto = Text(root, width=150)
caja_texto.pack()

# creo un identificador/tag para los margenes
caja_texto.tag_configure('var1', lmargin1=45, lmargin2=45)

# el texto de prueba
con1="Postgresql.driver proporciona una interfaz PG-API, postgresql.api, \
a un servidor PostgreSQL utilizando PQ versión 3.0 para facilitar la comunicación. "

con2="Utiliza las funciones extendidas del protocolo para proporcionar \
transmisiones binarias de tipo de datos y declaraciones preparadas en el \
nivel de protocolo para parámetros fuertemente tipados.\n\n"

caja_texto.insert(INSERT,con1, 'var1')
caja_texto.insert(INSERT,con2, 'var1')

# vamos a ver una etiqueta, por sencillez
etiq = Label(caja_texto, text='Etiqueta de Prueba',bd=0, bg='white', \
      fg='blue', font='size 20')
           
# esto funciona
caja_texto.window_create(INSERT, window = etiq)

#esto no funciona
#caja_texto.window_create(INSERT, window = etiq, 'var1')
#caja_texto.window_create(INSERT, window = etiq, ('var1'))

root.mainloop()
Edito:
He solucionado el tema, pero con una solución nada elegante, esto es; muy sucia. La pregunta sigue siendo ¿como poner margenes a un objeto?

Código:
from tkinter import *

root = Tk()
caja_texto = Text(root, width=150)
caja_texto.pack()

# creo un identificador/tag para los margenes
caja_texto.tag_configure('var1', lmargin1=45, lmargin2=45)

# el texto de prueba
con1="Postgresql.driver proporciona una interfaz PG-API, postgresql.api, \
a un servidor PostgreSQL utilizando PQ versión 3.0 para facilitar la comunicación. "

con2="Utiliza las funciones extendidas del protocolo para proporcionar \
transmisiones binarias de tipo de datos y declaraciones preparadas en el \
nivel de protocolo para parámetros fuertemente tipados.\n\n"

caja_texto.insert(INSERT,con1, 'var1')
caja_texto.insert(INSERT,con2, 'var1')

# vamos a ver una etiqueta, por sencillez
etiq = Label(caja_texto, text='Etiqueta de Prueba',bd=0, bg='white', fg='blue', font='size 20')  

# vamos a probar con un texto con un espacio, por si acaso
# el tag de lmargin1 lo hago con 1 menos
# MUY SUCIO
caja_texto.tag_configure('var2', lmargin1=35, lmargin2=35)
caja_texto.insert(INSERT, ' ', 'var2')
 
# esto funciona
caja_texto.window_create(INSERT, window = etiq)

#esto no funciona
#caja_texto.window_create(INSERT, window = etiq, 'var1')
#caja_texto.window_create(INSERT, window = etiq, ('var1'))

root.mainloop()
Responder
#2
Hola. Podrías utilizar el argumento padx:

Código:
caja_texto.window_create(INSERT, window=etiq, padx=45)

No obstante esto también añade un espacio extra en la parte izquierda del control.

De todas formas tal vez deberías plantearte si necesariamente la etiqueta debe ir dentro del texto, o bien si ese mismo efecto no podría conseguirse usando las propiedades del texto directamente.

Saludos
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder
#3
(21-10-2017, 08:51 PM)Francisco escribió: Hola. Podrías utilizar el argumento padx:

Código:
caja_texto.window_create(INSERT, window=etiq, padx=45)

No obstante esto también añade un espacio extra en la parte izquierda del control.

De todas formas tal vez deberías plantearte si necesariamente la etiqueta debe ir dentro del texto, o bien si ese mismo efecto no podría conseguirse usando las propiedades del texto directamente.

Saludos

hola,

lo de la etiqueta es un ejemplo simple, por no complicar el ejemplo. quiero que en el texto aparezcan intercalados, botones que abran otros modulos, graficos, hipervinculos, etc...

ademas -creo recordar- el padx me añade espacios a los dos lados.

lo que estoy haciendo es una especie de html sin permiso de escritura, y que dependiendo de ciertas acciones del usuario, la caja de texto se actualiza con los cambios. Ya tengo hecho el parser, y solo me queda lo de los márgenes de los botones y los gráficos. (los hipervinculos están controlados, he hecho una clase solo para ellos).

Adjuntaria el programa (es trabajo de hobby), pero son varios miles de lineas. Me llevaría tiempo explicar la lógica

La plantilla estandar que se distribuirá trabajará con unos 20.000 INSERT del tipo:


Código:
self.T.insert(INSERT, '1.', 'var00')
self.T.insert(INSERT, ' ', 'var00')
self.T.insert(INSERT, ' d4 ', self.hyperlink.add(partial(self.muestraJugada,'Var0Mv1','d4','1','b','rnbqkbnr/pppppppp/8/8/3P4/8/PPP1PPPP/RNBQKBNR b KQkq d3 0 1',' Ftacnik','1','0')))
self.T.insert(INSERT, ' Ftacnik', 'var00')
self.T.insert(INSERT, ' ', 'var00')
self.T.insert(INSERT, ' Nf6 ', self.hyperlink.add(partial(self.muestraJugada,'Var0Mv2','Nf6','1','w','rnbqkb1r/pppppppp/5n2/8/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - 1 2','','2','0')))
self.T.insert(INSERT, '', 'var00')
self.T.insert(INSERT, '2.', 'var00')
self.T.insert(INSERT, ' ', 'var00')
self.T.insert(INSERT, ' c4 ', self.hyperlink.add(partial(self.muestraJugada,'Var0Mv3','c4','2','b','rnbqkb1r/pppppppp/5n2/8/2PP4/8/PP2PPPP/RNBQKBNR b KQkq c3 0 2','','3','0')))
self.T.insert(INSERT, '', 'var00')
self.T.insert(INSERT, ' ', 'var00')
self.T.insert(INSERT, ' e6 ', self.hyperlink.add(partial(self.muestraJugada,'Var0Mv4','e6','2','w','rnbqkb1r/pppp1ppp/4pn2/8/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - 0 3','','4','0')))
self.T.insert(INSERT, '', 'var00')
self.T.insert(INSERT, '3.', 'var00')
self.T.insert(INSERT, ' ', 'var00')
self.T.insert(INSERT, ' Nc3 ', self.hyperlink.add(partial(self.muestraJugada,'Var0Mv5','Nc3','3','b','rnbqkb1r/pppp1ppp/4pn2/8/2PP4/2N5/PP2PPPP/R1BQKBNR b KQkq - 1 3','','5','0')))
self.T.insert(INSERT, '', 'var00')
self.T.insert(INSERT, ' ', 'var00')
self.T.insert(INSERT, ' Bb4 ', self.hyperlink.add(partial(self.muestraJugada,'Var0Mv6','Bb4','3','w','rnbqk2r/pppp1ppp/4pn2/8/1bPP4/2N5/PP2PPPP/R1BQKBNR w KQkq - 2 4','','6','0')))
self.T.insert(INSERT, '', 'var00')
self.T.insert(INSERT, '4.', 'var00')
self.T.insert(INSERT, ' ', 'var00')
self.T.insert(INSERT, ' Qc2 ', self.hyperlink.add(partial(self.muestraJugada,'Var0Mv7','Qc2','4','b','rnbqk2r/pppp1ppp/4pn2/8/1bPP4/2N5/PPQ1PPPP/R1B1KBNR b KQkq - 3 4','','7','0')))
self.T.insert(INSERT, '', 'var00')
self.T.insert(INSERT, ' ', 'var00')
self.T.insert(INSERT, ' O-O ', self.hyperlink.add(partial(self.muestraJugada,'Var0Mv8','O-O','4','w','rnbq1rk1/pppp1ppp/4pn2/8/1bPP4/2N5/PPQ1PPPP/R1B1KBNR w KQ - 4 5','?  The entire strategy centers around box e4 . Surrender of this point delivers a distinct advantage to White.','8','0')))
self.T.insert(INSERT, '?  The entire strategy centers around box e4 . Surrender of this point delivers a distinct advantage to White.', 'var00')
self.T.insert(INSERT, '5.', 'var00'
Responder
#4
Bien. En ese caso, realmente ignoro alguna otra forma de conseguir lo que estás buscando. Tal vez simplemente el control Text de Tcl/Tk no sea lo suficientemente completo como para poder representar la información tal como lo planteás. De todas formas, seguramente puedas lograrlo con algún método "ad hoc" como comentabas anteriormente.

Saludos!
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)