Python - Variables Globales

 
Vista:
sin imagen de perfil
Val: 5
Ha disminuido su posición en 19 puestos en Python (en relación al último mes)
Gráfica de Python

Variables Globales

Publicado por Jaime (3 intervenciones) el 12/05/2020 14:17:43
Buenas:

Soy novatillo y tengo un problema con una definición de una variable tipo StringVar con un programa con TKinter.

La cuestión es que defino una variable a nivel del root.tk tipo StringVar y luego llamo a una serie de funciones, definiendo la variable como global y el valor no se pasa entre las funciones.

La idea es que en la función agregar_categoria se pide, por un Entry, un valor en la variable categoria, y esta debe de pasarse a la función alta_categoria que está definida en un Button.

Muchas gracias,

Jaime.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
from tkinter import *
from tkinter import messagebox as MessageBox
 
 
def alta_categoria():
 
    global categoria  #Indico que la variable es global
 
    MessageBox.showinfo("Alta Categoria","Categoria: {}".format(categoria.get()))  #Muestro el valor
 
def agregar_categoria():
 
    global categoria           #Indico que la variable es global
    tkCat= Tk()
    tkCat.config(bd=15)
    categoria.set("Especialidad")  # Le cambio el valor
 
    MessageBox.showinfo("Agregar Categoria","Categoria: {}".format(categoria.get()))  # Lo muestro
 
 
    Label(tkCat,text="Categoria:").pack(side="left")
    Entry(tkCat,textvariable=categoria).pack(side="left")     #Defino la entrada que no toma el valor de la variable
    Button(tkCat,text="Crear",command=alta_categoria).pack(side="bottom")   #Defino el Button que llama la función
 
    tkCat.mainloop()
 
 
## Root Menu
root= Tk()
root.config(bd=15)
 
categoria=StringVar()    # Defino la variable y le asigno un valor.
categoria.set("Postre")
 
menubar=Menu(root)
root.config(menu=menubar)
 
categoriamenu=Menu(menubar,tearoff=0)
categoriamenu.add_command(label="Crear",command=agregar_categoria)   #Llamo a la función
 
 
menubar.add_cascade(label="Catetorias",menu=categoriamenu)
 
root.mainloop()
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 2.808
Oro
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Variables Globales

Publicado por tincopasan (1082 intervenciones) el 12/05/2020 22:33:24
antes de mirar ese código: ¿querés crear un menú en tiempo de ejecución?, si es así, ¿con qué sentido?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 5
Ha disminuido su posición en 19 puestos en Python (en relación al último mes)
Gráfica de Python

Variables Globales

Publicado por Jaime (3 intervenciones) el 13/05/2020 00:00:01
Buenas:

Acabo de terminar un curso de Python y estoy practicando. No quiero crear un menu interactivo, lo que quiero es utilizar una variable tipo StringVar (categoria) en varias funciones. La idea es leer esta variable (categoria) en una función (agregar_categoria) y que al ejecutar otra función (alta_categoria), invocada mediante un Button definido en la función anterior, esta última función pueda usar el valor de la variable StringVal (categoria).

Yo lo que he hecho es definir la variable en el modulo principal, y en las funciones definirla como global. pero parce que algo no estoy haciendo bien.

Muchas gracias,

Jaime.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 2.808
Oro
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Variables Globales

Publicado por tincopasan (1082 intervenciones) el 13/05/2020 04:57:47
1
Acabo de terminar un curso de Python y estoy practicando.
Bueno creo que te conviene repasar los conceptos del curso nuevamente, honestamente me parece imposible de realizar como lo querés hacer, por varios motivos, el uso de stingvar no es como lo querés usar , dos "ventanas" y su comunicación, el uso de clases, etc.
voy a poner un ejemplo, que es un asco, pero cumplirá lo que basicamente querés hacer, de otra forma, pero funcional.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#-*- coding: utf -8 -*-
 
import tkinter as tk
from tkinter import messagebox as MessageBox
 
class Agregar:
    def __init__(self,parent ):
        top = self.top = tk.Toplevel(parent)
        self.lblcategoria = tk.Label(top,text="Categoría para agregar")
        self.lblcategoria.pack()
        self.txtentrada= tk.Entry(top)
        self.txtentrada.pack()
        self.txtentrada.focus()
        self.aceptar = tk.Button(top,text="Listo",command= self.cerrar)
        self.aceptar.pack()
 
    def cerrar(self):
        self.regresa(self.txtentrada.get())
        self.top.destroy()
 
    def regresa(self, funcion):
        self.regresa = funcion
#===========================================
 
class Principal(tk.Frame):
    def __init__(self,parent,**kwargs):
        super().__init__(parent,**kwargs)
        self.place(x=50,y=50)
        self.lblinvisible=tk.Label(parent,text="Postre")
        self.lblinvisible.place(x=10,y=10)
        self.lblinvisible.place_forget()
        menubar=tk.Menu(parent)
        categoriamenu = tk.Menu(menubar,tearoff=0)
        categoriamenu.add_command(label="Crear",command=self.agregar_categoria)
        categoriamenu.add_command(label="Categoría",command=self.alta_categoria)
        menubar.add_cascade(label="Catetorias",menu=categoriamenu)
        parent.config(menu=menubar)
 
    def agregar_categoria(self):
        mw =Agregar(None)
        mw.regresa(self.set_label)
 
    def set_label(self,texto= ""):
        self.lblinvisible["text"]=texto
 
    def alta_categoria(self):
        MessageBox.showinfo("Alta Categoria","Categoria: {}".format(self.lblinvisible["text"]))
 
 
root= tk.Tk()
inicio= Principal(root)
root.mainloop()

con el comando categoría puedes ver en cualquier momento cuanto vale, y con crear, lo cambias. Te vuelvo a repetir, no sirve crear menus en tiempo de ejecución,para que no pierdas tiempo en eso, pero si es por cambiar una "variable" este ejemplo te muestra que no todo es lo que parece.
Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 5
Ha disminuido su posición en 19 puestos en Python (en relación al último mes)
Gráfica de Python

Variables Globales

Publicado por Jaime (3 intervenciones) el 13/05/2020 13:09:08
Buenas:

Muchas gracias ante todo. A ver me estoy adaptando a esto la programación orientada a objeto y con interfaz gráfica, yo empece programando en Turbo Pascal, hace ya ni se sabe y en los últimos 20 años me he dedicado a la técnica de sistema (DBA Oracle, Unix, Linux, etc). Y ahora en el cliente donde me extremo este próximo lunes me dicen que utilizan Pyton, así que aquí estoy poniéndome las pilas...

A ver lo que yo quiero no es exactamente lo que me propones, pero se le parece mucho. Llevo toda la mañana dándole vueltas al código, y no logro mi objetivo, que es tan simple como desde la función cerrar que se ejecuta en el boton Listo hacer referencia al valor leido por el Entry.

1
2
3
4
def cerrar(self):
    MessageBox.showinfo("Alta Categoria","Categoria: {}".format(self.txtentrada["text"]))
    self.regresa(self.txtentrada.get())
    self.top.destroy()

O bien al salir de la función agregar_categoria.

1
2
3
4
def agregar_categoria(self):
    mw =Agregar(None)
    MessageBox.showinfo("Alta Categoria","Categoria: {}".format(self.lblinvisible["text"]))
    mw.regresa(self.set_label)

En este caso me sale cada ventana por un lado, creo que este no es el sitio indicado.

Muchas gracias,

Jaime.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar