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:

Código:
def open_notepad(self): #  ejecuta lo seleccionado con anticlic
    global x
    global y
    x = int(input("Ingrese el nuevo valor de x: "))
    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
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder
#3
Muchas gracias, me funciono...
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)