Foros del Web » Programando para Internet » Python »

Checkbutton no modifica variable

Estas en el tema de Checkbutton no modifica variable en el foro de Python en Foros del Web. Antes de empezar quiero decir que tengo cero conocimientos de programacion, este es mi primer programa y lo fui haciendo investigando... Ya cumple su función ...
  #1 (permalink)  
Antiguo 16/10/2014, 13:43
 
Fecha de Ingreso: octubre-2014
Mensajes: 1
Antigüedad: 9 años, 6 meses
Puntos: 0
Checkbutton no modifica variable

Antes de empezar quiero decir que tengo cero conocimientos de programacion, este es mi primer programa y lo fui haciendo investigando...

Ya cumple su función que es recibir bytes y según cual sea este activar una alarma.

Pero quiero hacer que con un Checkbutton se pueda desactivar la alarma para un byte en particular (poniendo a 1 o 0 una variable):

Código Python:
Ver original
  1. w1= Checkbutton(principal, text= "Silenciar Modem 3", variable = enmascarar3, onvalue = 1, offvalue = 0, height=5, width = 20).pack()

la variable enmascarar3 se modifica perfectamente al tildar o destildar la casilla pero en otra porción del código tengo un condicional que usa esa variable y no la lee como realmente es sino que la ve como PY_VAR1, y ya probé con "global enmascarar3"

Código Python:
Ver original
  1. elif (data) == (14).to_bytes(1,byteorder='big'):
  2.                 if v[11] == 0:
  3.                         txt=open('historial.txt','a')
  4.                         txt.write(datetime.datetime.now().ctime())
  5.                         txt.write(': MODEM 3 Unit Fault \n')
  6.                         txt.close()
  7.                         if (enmascarar3 == 0): #AQUI ES DONDE VE PY_VAR1 (cuando deberia ser 1 o 0)
  8.                                 startAlarm()
  9.                         v[11] = 1 #print ("MODEM 3 \tUnit Fault")
  10.                         v[10] = 0

adjunto el codigo por si pueden darse cuenta en donde estoy fallando...
no me parece conveniente tener que hacerlo con botones y etiquetas teniendo la opcion del checkbutton...
ya aprovecho y les cuento que intente "ordenar" los componentes de la ventana cambiando pack() por grid() y dejan de aparecer en la misma

codigo:
en linea 24 defino variable
linea 46 la defino como global
linea 69,80,91 estan los condicionales
linea 184 el checkbutton

Código Python:
Ver original
  1. import socket#              funcionalidad para recibir UDP
  2. import os #                 usaremos system para limpiar pantalla
  3. import time#                para delays
  4. import datetime#            para la fecha y hora
  5. import threading
  6. from tkinter import *
  7. import winsound
  8.  
  9. UDP_IP = "192.168.0.1"#    ip de host donde corre el software
  10. UDP_PORT = 5005#           verificar que sea el mismo puerto a donde envia el arduino
  11.  
  12. sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #crea un soket INET para IPV4 de UDP para enviar datagramas
  13. sock.bind((UDP_IP, UDP_PORT))
  14. v = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
  15.  
  16. var=1
  17.  
  18. principal = Tk()
  19. principal.minsize(800,600)
  20. principal.maxsize(800,600)
  21. principal.title("titulo----")
  22. pantalla=StringVar()
  23.  
  24. enmascarar3 = 0#variable a modificar con "enmascarar"
  25.  
  26. enmascarar6 = IntVar()
  27.  
  28. #recibe el texto de la alarma y suena
  29. def alertar():
  30.     if var:
  31.                
  32.         principal.bell()
  33.     principal.after(500, alertar)
  34.  
  35.  
  36. def stopAlarm():
  37.     global var
  38.     var=0
  39.    
  40.    
  41. def startAlarm():
  42.     global var
  43.     var=1
  44.    
  45. def leerAlarmas():
  46.         global enmascarar3
  47.  
  48.         lienzo = "" #variable para sumar los textos a mostrar
  49.          
  50.         data, addr = sock.recvfrom(512) #   se reciben los datos en el buffer(ojo con el nro de buffer, no debe ser menor que los datos recibidos)recvfrom(...)
  51.     #                                   recvfrom(buffersize[, flags]) -> (data, address info)se crea buffer de 512 Kbytes, addr no importa para este caso
  52.     #                                   a continunacion segun los datos recibidos se setean las variables para cada estado de cada modem
  53.     #                                   int.to_bytes(length, byteorder, *, signed=False) "big" setea el bit mas significativo
  54.         if (data) == (2).to_bytes(1,byteorder='big'):
  55.                 if v[10] == 0:
  56.                         v[10] = 1#print("MODEM 3 \tOK")
  57.                         v[11] = 0
  58.                         v[12] = 0
  59.                         v[13] = 0
  60.                         v[14] = 0
  61.                         stopAlarm()
  62.         #                                      
  63.         elif (data) == (14).to_bytes(1,byteorder='big'):
  64.                 if v[11] == 0:
  65.                         txt=open('historial.txt','a')
  66.                         txt.write(datetime.datetime.now().ctime())
  67.                         txt.write(': MODEM 3 Unit Fault \n')
  68.                         txt.close()
  69.                         if (enmascarar3 == 0):
  70.                                 startAlarm()
  71.                         v[11] = 1 #print ("MODEM 3 \tUnit Fault")
  72.                         v[10] = 0
  73.  
  74.         elif (data) == (26).to_bytes(1,byteorder='big'):
  75.                 if v[12] == 0:
  76.                         txt=open('historial.txt','a')
  77.                         txt.write(datetime.datetime.now().ctime() )
  78.                         txt.write(': MODEM 3 TX Traffic \n')
  79.                         txt.close()
  80.                         if enmascarar3 == 0:
  81.                                 startAlarm()
  82.                         v[12] = 1 #print ("MODEM 3 \tTX Traffic")
  83.                         v[10] = 0
  84.  
  85.         elif (data) == (38).to_bytes(1,byteorder='big'):
  86.                 if v[13] == 0:
  87.                         txt=open('historial.txt','a')
  88.                         txt.write(datetime.datetime.now().ctime() )
  89.                         txt.write(': MODEM 3 RX Traffic \n')
  90.                         txt.close()
  91.                         if enmascarar3 == 0:
  92.                                 startAlarm()
  93.                         v[13] = 1 #print ("MODEM 3 \tRX Traffic")
  94.                         v[10] = 0
  95.  
  96.         elif (data) == (50).to_bytes(1,byteorder='big'):
  97.                 if v[14] == 0:
  98.                         txt=open('historial.txt','a')
  99.                         txt.write(datetime.datetime.now().ctime() )
  100.                         txt.write(': MODEM 3 Deferred Alarm \n')
  101.                         txt.close()
  102.                         if enmascarar3 == 0:
  103.                                 startAlarm()
  104.                         v[14] = 1 #print ("MODEM 3 \tDeferred Alarm")
  105.                         v[10] = 0
  106.  
  107.             #imprimimos los encabezados:
  108.  
  109.         lienzo = (lienzo + "Nro. Modem \tEstado\n")
  110. ###################################################
  111.         #ahora segun la variable que se encuentre en '1' va a ser lo que se imprima:
  112.         #sentencias para el MODEM Nro. 3:
  113.         if v[10] == 1:
  114.                
  115.                 lienzo = (lienzo + "MODEM 3\tOK\n")
  116.                 w = Label(principal, text="MODEM 3\tOK\n", bg="green", fg="black")
  117.                 w.pack()
  118.                
  119.         #--------------------------------------------------
  120.         elif ((v[11] and v[12] and v[13]) or (v[11] and v[12] and v[14]) or (v[11] and v[13] and v[14]) or (v[12] and v[13] and v[14]) or (v[11] and v[12] and v[13] and v[14])):
  121.                
  122.                 lienzo = (lienzo + "MODEM 3\tMULTIPLES FALLAS!\n")
  123.                
  124.         elif v[11] and v[12] == 1:
  125.                
  126.                 lienzo = (lienzo + "MODEM 3\tUnit Fault - Tx Fault\n")
  127.                
  128.         elif v[11] and v[13] == 1:
  129.                
  130.                 lienzo = (lienzo + "MODEM 3\tUnit Fault - Rx Fault\n")
  131.                
  132.         elif v[11] and v[14] == 1:
  133.                
  134.                 lienzo = (lienzo + "MODEM 3\tUnit Fault - Deferred Alarm\n")
  135.                
  136.         elif v[12] and v[13] == 1:
  137.                
  138.                 lienzo = (lienzo + "MODEM 3\tRx Fault - Tx Fault\n")
  139.                
  140.         elif v[12] and v[14] == 1:
  141.                
  142.                 lienzo = (lienzo + "MODEM 3\tTx Fault - Deferred Alarm\n")
  143.                
  144.         elif v[13] and v[14] == 1:
  145.                
  146.                 lienzo = (lienzo + "MODEM 3\tRx Fault - Deferred Alarm\n")
  147.                
  148.         #--------------------------------------------------
  149.         elif v[11] == 1:
  150.                
  151.                 lienzo = (lienzo + "MODEM 3\tUnit Fault\n")
  152.                
  153.                
  154.         elif v[12] == 1:
  155.                
  156.                 lienzo = (lienzo + "MODEM 3\tTX Traffic\n")
  157.                
  158.         elif v[13] == 1:
  159.                
  160.                 lienzo = (lienzo + "MODEM 3\tRX Traffic\n")
  161.                
  162.         elif v[14] == 1:
  163.                
  164.                 lienzo = (lienzo + "MODEM 3\tDeferred Alarm\n")
  165.                
  166.         hora = (str(datetime.datetime.now()))
  167.         txt=open('historial.txt','r')
  168.         lineas = txt.readlines()
  169.         txt.close()
  170.  
  171.         print ('enmascarar3')
  172.         print (enmascarar3)
  173.         print ('v[11]')
  174.         print (v[11])
  175.        
  176.         pantalla.set(lienzo)
  177.         principal.after(200, leerAlarmas)
  178.  #elementos de la ventana:
  179. modem = Label(principal, text = 'Nro. Modem').pack()
  180. estado = Label(principal, text = 'Estado')
  181. w= Label(principal, textvariable=pantalla).pack(side=LEFT)#Texto de una línea que sirve de etiqueta para identificar otros widgets. Se puede insertar dentro de él una imagen.
  182. w= Label(principal, textvariable=enmascarar3).pack(side=RIGHT)
  183.  
  184. w1= Checkbutton(principal, text= "Silenciar Modem 3", variable = enmascarar3, onvalue = 1, offvalue = 0, height=5, width = 20).pack()#pone variable enmascarar3 a 1 o a 0
  185.  
  186. botones= Frame(principal, bd=5, relief="groove").pack()#Se utiliza como contenedor para organizar otros widgets.
  187. b=Button(botones, text="Silenciar", bg="green", underline = 0, width=25, command=stopAlarm).pack(side=LEFT)#Mostrar botones en la aplicación.          
  188. b=Button(botones, text="Alarmar", width=25 ,command=startAlarm).pack(side=RIGHT)           
  189.  
  190. alertar()
  191. leerAlarmas()
  192. principal.mainloop()

Última edición por razpeitia; 16/10/2014 a las 17:02
  #2 (permalink)  
Antiguo 19/10/2014, 19:31
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años
Puntos: 1360
Respuesta: Checkbutton no modifica variable

Después de leerme tu código un rato. Y ver la documetación de tkinter http://effbot.org/tkinterbook/checkbutton.htm

Tu error es bastante obvio.
enmascarar3 (enmascarar6) en algún punto se convierte en IntVar. Y por eso te aparece PY_VAR1.

Lo que tienes que hacer es:
Código Python:
Ver original
  1. enmascarar3.get() # para obtener el estado del checkbox o tal vez enmascarar6.get()

En general, si se ve que es tu primer programa, pero que sigas avanzando es lo importante +1

Etiquetas: ip, red, variable, variables
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:28.