Foros Python

Versión completa: Como usar datos de un hilo para otro, python
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
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)
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
Muchas gracias, me funciono...