Discussion:
[Python-es] Editar variables en aplicaciones de consola
unknown
2014-08-17 17:45:43 UTC
Permalink
Hola.

Estoy haciendo varias aplicaciones/utilidades de consola que necesito.
La cuestión es que no conozco ninguna forma de "editar" una variable,
con raw_input se introduce nueva.. en fin he recurrido a Tkinter.

Pero me parece una tremenda chapuza lo que he hecho:
------------------codigo chapuza------------------
from Tkinter import *

global T
global sArgumentos

root = Tk()
T = Text(root, height=4, width=60)
T.pack()
sArgumentos = ""

def click():
"""Debe lanzarse en el click de Aceptar"""
global T
global sArgumentos
sArgumentos = T.get('1.0', 'end').strip()
root.destroy()

def editar(argumentos):
"""Edita los argumentos y el resultado
lo guarda en la varibale global sArgumentos """
global T
T.insert(END, argumentos)
b = Button(root, text="Aceptar", command=click)
b.pack(fill=BOTH, expand=1)
b = Button(root, text="Cancelar", command=root.destroy)
b.pack(fill=BOTH, expand=1)
mainloop()
--------------------------------------------------------------------

En la aplicación se invoca a "editar('valor a editar')" y en la variable
global sArgumentos se almacena la edición. Que además es la variable que
contiene el origen.

Me gustaría saber si alguien ha resuelto este problema de editar el
contenido de variables mejor que esto.

Gracias.
unknown
2014-08-17 18:13:50 UTC
Permalink
lo que podes hacer es usar locals() o globals depende
x = 1 print locals()
locals()["x"] = 2
print "x=",x
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20140817/7b7e35c9/attachment.html>
unknown
2014-08-17 19:05:27 UTC
Permalink
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20140817/c6be54c3/attachment.html>
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: gjifdgda.png
Type: image/png
Size: 38975 bytes
Desc: no disponible
URL: <Loading Image...>
unknown
2014-08-17 19:56:54 UTC
Permalink
no entiendo valga la rebusnancia que no entendes
capturas con raw x= hola lo partís, metes la variable asi como se muestra
en lo otro y ya .
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20140817/0022cba2/attachment.html>
unknown
2014-08-17 22:16:49 UTC
Permalink
Post by unknown
Hola.
Estoy haciendo varias aplicaciones/utilidades de consola que necesito.
La cuestión es que no conozco ninguna forma de "editar" una variable, con
raw_input se introduce nueva.. en fin he recurrido a Tkinter.
------------------codigo chapuza------------------
from Tkinter import *
global T
global sArgumentos
root = Tk()
T = Text(root, height=4, width=60)
T.pack()
sArgumentos = ""
"""Debe lanzarse en el click de Aceptar"""
global T
global sArgumentos
sArgumentos = T.get('1.0', 'end').strip()
root.destroy()
"""Edita los argumentos y el resultado
lo guarda en la varibale global sArgumentos """
global T
T.insert(END, argumentos)
b = Button(root, text="Aceptar", command=click)
b.pack(fill=BOTH, expand=1)
b = Button(root, text="Cancelar", command=root.destroy)
b.pack(fill=BOTH, expand=1)
mainloop()
--------------------------------------------------------------------
En la aplicación se invoca a "editar('valor a editar')" y en la variable
global sArgumentos se almacena la edición. Que además es la variable que
contiene el origen.
Me gustaría saber si alguien ha resuelto este problema de editar el
contenido de variables mejor que esto.
Para empezar: los objetos "string" son "inmutables". No puedes "editarlos".
Como mucho podrás crear nuevas cadenas a partir de otras.

Si lo que quieres es un interface en Tkinter, lo recomendable es usar las
StringVars. Lee la documentación porque tienen tienen muchas
características interesantes. Aquí sólo te pongo un código para que te
oriente:

import Tkinter as tk

master = tk.Tk()

v = tk.StringVar()
v.set("A variable text")

e = tk.Entry(master, textvariable=v)
e.pack()

b = tk.Button(master, text="get", width=10, command=master.quit)
b.pack()

tk.mainloop()

edited_text = v.get()
print(edited_text)
Post by unknown
Gracias.
_______________________________________________
Python-es mailing list
Python-es en python.org
https://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/
--
Hyperreals *R "Quarks, bits y otras criaturas infinitesimales":
http://ch3m4.org/blog
Buscador Python Hispano: http://ch3m4.org/python-es
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20140818/137693e6/attachment.html>
unknown
2014-08-17 23:08:38 UTC
Permalink
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20140818/c3ef28a0/attachment.html>
unknown
2014-08-18 13:02:53 UTC
Permalink
Magistral, Chema.
Mucho mejor que lo que yo usaba.
Por cierto como haces tu para editar en aplicaciones de consola ?
No suelo necesitarlo, pero dejaría que las tareas de edición las hagan los
editores (vim/emacs/nano...notepad...st2). Crea un fichero temporal, añade
el texto, y ábrelo con el editor por defecto que tenga el sistema:

import os
import subprocess
import tempfile

def editar(texto):

with tempfile.NamedTemporaryFile(mode="w+",suffix='.txt',delete=False)
as fp:
fp.write(texto)

filename = fp.name

if os.name=="nt":
subprocess.call("notepad "+filename)
elif os.name == "posix":
editor = os.getenv('EDITOR')
if not editor:
editor = "editor" # normalmente un alias del editor 'nano'
subprocess.call(editor + ' ' + filename)

with open(filename) as fp:
res = fp.read()

os.remove(filename)

return res

texto = editar("Hello world!")
print(texto)
saludos.
Post by unknown
Hola.
Estoy haciendo varias aplicaciones/utilidades de consola que necesito.
La cuestión es que no conozco ninguna forma de "editar" una variable, con
raw_input se introduce nueva.. en fin he recurrido a Tkinter.
------------------codigo chapuza------------------
from Tkinter import *
global T
global sArgumentos
root = Tk()
T = Text(root, height=4, width=60)
T.pack()
sArgumentos = ""
"""Debe lanzarse en el click de Aceptar"""
global T
global sArgumentos
sArgumentos = T.get('1.0', 'end').strip()
root.destroy()
"""Edita los argumentos y el resultado
lo guarda en la varibale global sArgumentos """
global T
T.insert(END, argumentos)
b = Button(root, text="Aceptar", command=click)
b.pack(fill=BOTH, expand=1)
b = Button(root, text="Cancelar", command=root.destroy)
b.pack(fill=BOTH, expand=1)
mainloop()
--------------------------------------------------------------------
En la aplicación se invoca a "editar('valor a editar')" y en la variable
global sArgumentos se almacena la edición. Que además es la variable que
contiene el origen.
Me gustaría saber si alguien ha resuelto este problema de editar el
contenido de variables mejor que esto.
Para empezar: los objetos "string" son "inmutables". No puedes
"editarlos". Como mucho podrás crear nuevas cadenas a partir de otras.
Si lo que quieres es un interface en Tkinter, lo recomendable es usar
las StringVars. Lee la documentación porque tienen tienen muchas
características interesantes. Aquí sólo te pongo un código para que te
import Tkinter as tk
master = tk.Tk()
v = tk.StringVar()
v.set("A variable text")
e = tk.Entry(master, textvariable=v)
e.pack()
b = tk.Button(master, text="get", width=10, command=master.quit)
b.pack()
tk.mainloop()
edited_text = v.get()
print(edited_text)
Post by unknown
Gracias.
_______________________________________________
Python-es mailing list
Python-es en python.org
https://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/
--
http://ch3m4.org/blog
Buscador Python Hispano: http://ch3m4.org/python-es
_______________________________________________
Python-es mailing listPython-es en python.orghttps://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/
_______________________________________________
Python-es mailing list
Python-es en python.org
https://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/
--
Hyperreals *R "Quarks, bits y otras criaturas infinitesimales":
http://ch3m4.org/blog
Buscador Python Hispano: http://ch3m4.org/python-es
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20140818/27021004/attachment.html>
unknown
2014-08-18 13:25:30 UTC
Permalink
Post by unknown
editor = os.getenv('EDITOR')
En mi máquina (Fedora LXDE) no está definida, y el comando "editor" tampoco
existe. Sin embargo, siempre puedes tener vi en la recámara.
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20140818/8589e201/attachment.html>
unknown
2014-08-18 15:46:36 UTC
Permalink
Post by unknown
editor = os.getenv('EDITOR')
En mi máquina (Fedora LXDE) no está definida, y el comando "editor"
tampoco existe. Sin embargo, siempre puedes tener vi en la recámara.
Entonces tampoco tienes definido el sistema de "alternativas"
(update-alternatives).

'vi' es siempre seguro que esté, aunque no es tan seguro que el usuario
sepa como salir de él. Por eso suele incluirse 'nano' como editor más
amigable con el usuario.
Post by unknown
_______________________________________________
Python-es mailing list
Python-es en python.org
https://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/
--
Hyperreals *R "Quarks, bits y otras criaturas infinitesimales":
http://ch3m4.org/blog
Buscador Python Hispano: http://ch3m4.org/python-es
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20140818/4c49df0f/attachment.html>
unknown
2014-08-18 21:12:10 UTC
Permalink
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20140818/1577164a/attachment.html>
unknown
2014-08-18 20:15:59 UTC
Permalink
Magistral, Chema.
Mucho mejor que lo que yo usaba.
Por cierto como haces tu para editar en aplicaciones de consola ?
En aplicaciones por consola lo que se suele hacer es pasar las
opciones por la linea de comandos, por ejemplo:

script.py -o --foo bar baz


Chequea el módulo argparse[0] que viene incluido en python para algo
simple o el módulo click[1] para una aplicación mucho más compleja.


Saludos

[0] https://docs.python.org/dev/library/argparse.html
[1] http://click.pocoo.org/
--
A menudo unas pocas horas de "Prueba y error" podrán ahorrarte minutos
de leer manuales.
Loading...