Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Como usar datos de un hilo para otro, python
#1
Hola soy nuevo en python, estoy tratando de realizar el siguiente ejercicio: mientras e muestra un icono en la ventana de notificaciones se vaya mostrando el valor de x y y, cuyos valores de partida son 15 y 95 respectivamente; sin embargo, cuando le doy anticlic al icono de la ventanda de notificaciones y luego entro a configuraciones e ingreso nuevos valores de x y y, me siguen apareciendo 15 y 95, es decir, no cambian; si alguien me puede ayudar le agradecería: anexo el código y el icono utilizado. 

Código:
import os
import sys
from PySide2 import QtWidgets, QtGui
import threading
import time
x = 15
y = 95
class SystemTrayIcon(QtWidgets.QSystemTrayIcon):
    def __init__(self, icon, parent=None):
        QtWidgets.QSystemTrayIcon.__init__(self, icon, parent)
        self.setToolTip(f'Batería') #  enombre entre comillas
        menu = QtWidgets.QMenu(parent)
        open_app = menu.addAction("Configuraciones")
        open_app.triggered.connect(self.open_notepad)
        open_app.setIcon(QtGui.QIcon("icon.png"))

        exit_ = menu.addAction("Exit")
        exit_.triggered.connect(lambda: quit())
        exit_.setIcon(QtGui.QIcon("icon.png"))

        menu.addSeparator()
        self.setContextMenu(menu)
        self.activated.connect(self.onTrayIconActivated)

    def onTrayIconActivated(self, reason):
        " "

    def open_notepad(self): #  ejecuta lo seleccionado con anticlic
        x = int(input("Ingrese el nuevo valor de x: "))
        y = int(input("Ingrese el nuevo valor y: "))

def main():
    app = QtWidgets.QApplication(sys.argv)
    w = QtWidgets.QWidget()
    tray_icon = SystemTrayIcon(QtGui.QIcon("icon.png"), w)
    tray_icon.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    thread = threading.Thread(target=main) #  estas dos líneas permiten que haya dos procesos y no se atasque el print hola de la linea siguiente
    thread.start()
    time.sleep(5)
    i = 0
    while i == 0:
        print(x,y)


Archivos adjuntos Miniatura(s)
   
Responder
#2
Hola.

El problema no es con los hilos en este caso. El problema es que las variables definidas dentro de una función no tienen visibilidad fuera de la función: son variables locales. Una solución rápida sería usar global:

  1. def open_notepad(self): # ejecuta lo seleccionado con anticlic
  2. global x
  3. global y
  4. x = int(input("Ingrese el nuevo valor de x: "))
  5. y = int(input("Ingrese el nuevo valor y: "))


De todas formas, no es seguro trabajar con las mismas variables en dos hilos diferentes. Tenés que implementar algún tipo de coordinación para evitar que los hilos accedan en simultáneo a la misma variable. La forma más sencilla es usando threading.Lock.

Algo más: creo recordar que Qt tiene que correr en el hilo principal. Desconozco si correrlo en un hilo secundario traerá algún problema en el futuro.

Saludos
Responder
#3
Muchas gracias, me funciono...
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)