standard libreria library instalar examples python tkinter tcl

python - libreria - tkinter examples



Pase las variables de Python a `Tkinter.Tcl(). Eval()` (1)

Las clases variables son una buena idea, pero no hay una versión dict específica de las disponibles, lo que es un poco feo, pero puedes simplemente usar una versión de cadena (y obtener un golpe de rendimiento debido a eso, pero eso es reparable).

Entonces, el camino fácil primero. Un dict de Tcl tiene una representación de cadena y es convertible desde y hacia su representante de cadena automáticamente, por lo que si tienes un proceso que necesita un dict, simplemente puedes pasar el representante de cadena para el dict y simplemente funciona.

interp = tkinter.Tcl() myvar = tkinter.StringVar() def pydict2tcldict(d): return tkinter._stringify(list(d.items())) d = {''num'': 10000, ''time'': 10000, ''rate'': 10} myvar.set(pydict2tcldict(d)) interp.eval("""source {myscript.tcl} myproc $%s""" % myvar._name)

Por supuesto, puede hacer las cosas un poco más agradables y rápidas al proporcionar un contenedor de variables dict especial en lugar del viaje de ida y vuelta lento a través del representante de cadenas, consulte la implementación de las clases de variables.

Pero, fundamentalmente, tkinter solo falta unas pocas funciones de conversión en el módulo _tkinter.c (ver AsObj / FromObj / CallArgs ) si se agrega el código apropiado para las asignaciones (trivial), simplemente se puede hacer esto y hacerse (y sería razonable rápido):

interp.call("myproc", d)

El parche para modules/_tkinter.c debería ser bastante trivial, después de leer la página de manual de Tcl dict C API y la API C-API de mapeo de Python ( https://www.tcl.tk/man/tcl8.6/TclLib/DictObj.htm y https://docs.python.org/2/c-api/mapping.html ).

Puedo generar un script Tcl y ejecutar un proc desde dicho script así:

import Tkinter >>> tclsh = Tkinter.Tcl() >>> tclsh.eval(''source {myscript.tcl}'') >>> tclsh.eval(''myproc'') ...[output of proc] >>>

Sin embargo, si quiero pasar variables a este proceso, tengo que hacerlo así (suponiendo que el proc toma un dict como parámetro:

>>> tclsh.eval(''dict set spec num 10000'') >>> tclsh.eval(''dict set spec time 10000'') >>> tclsh.eval(''dict set spec rate 10'')

¿Hay una manera más fácil, más Pythonic de hacer esto desde el contexto de Tkinter? He visto las clases de variables , pero no parecen tener una variable de tipo dict, ni siquiera están relacionadas con la parte del código del intérprete Tcl.