• Compra una licencia de Windows 10/11 (10€) u Office (18€) al mejor precio u Office al mejor precio. Entra en este post con las ofertas
  • Conoce los Días Naranjas de PcComponentes: descuentos de hasta un 40% en tecnología. Entra en este post con las ofertas
  • ¡Bienvenid@! Recuerda que para comentar en el foro de El Chapuzas Informático necesitas registrar tu cuenta, tardarás menos de 2 minutos y te dará valiosa información además de ayudarte en lo que necesites o pasar un rato agradable con nosotros.

¿Hacer un ciclo en un array en Python?

Elaphe

De profesión Chapuzas
Registrado
8 Mar 2016
Mensajes
370
Puntos
43
Hola. A ver si me podéis echar una mano, porque de AutoHotkey se un poco, pero de Python sé menos que nada y tengo un script que me gustaría poder modificar. Es muy sencillo. Simplemente hay un array con 4 elementos y al final hay 4 combinaciones de teclas cada una de las cuales activa uno de los elementos en pantalla. Eso funciona. Lo que me gustaría es tener una única combinación de teclas que al presionarse fuera pasando en un ciclo infinito desde el primer elemento hasta el último. ¿Me podríais por favor modificar el código para que eso funcione? Gracias.

Código:
import ac
import acsys
import os
import sys
import threading
from IS_ACUtil import *

arr = ["SHAKERS", "TIME", "FANS SPEED","FORCE FEEDBACK"]

runing_keyhook = False

shutdown = False

def acShutdown():
   global shutdown
 
   shutdown = True

def acMain(ac_version):
   global function, fswindow

   fswindow = ac.newApp("Function select")
   ac.setTitle(fswindow, "")
   ac.drawBorder(fswindow, 0)
   ac.setSize(fswindow, 137, 31)
   ac.setIconPosition(fswindow, 0, -10000)
   function = ac.addLabel(fswindow, arr[3]);
   ac.setPosition(function, 68, 5)
   ac.setFontColor(function, 0.945, 0.933, 0.102, 1.0)
   ac.setFontAlignment(function, 'center')

   runing_keyhook = True
   t_kh = threading.Thread(target=keyhook)
   t_kh.start()

   return "Function select"


def keyhook():
   global runing_keyhook
 
   while True:
      if getKeyState(18): # alt 6
         if getKeyState(54):
            ac.setText(function, arr[0].format(function))
      if getKeyState(18): # alt 7
         if getKeyState(55):
            ac.setText(function, arr[1].format(function))
      if getKeyState(18): # alt 8
         if getKeyState(56):
            ac.setText(function, arr[2].format(function))
      if getKeyState(18): # alt 9
         if getKeyState(57):
            ac.setText(function, arr[3].format(function))

      if shutdown:
         runing_keyhook = False
         break
 
Al final ChatGPT me lo ha resuelto. Además luego le he pedido que lo modificara para que la pulsación de la hotkey no se detectara tan rápida porque se trababa a sí misma. El resultado:

Código:
import ac
import acsys
import os
import sys
import threading
from IS_ACUtil import *

arr = ["FORCE FEEDBACK", "SHAKERS", "TIME", "FANS SPEED"]

running_keyhook = False
shutdown = False
current_index = 0

DEBOUNCE_TIME = 0.3
last_key_press_time = 0

def acShutdown():
    global shutdown
    shutdown = True

def acMain(ac_version):
    global function, fswindow, running_keyhook

    fswindow = ac.newApp("Function select")
    ac.setTitle(fswindow, "")
    ac.drawBorder(fswindow, 0)
    ac.setSize(fswindow, 137, 31)
    ac.setIconPosition(fswindow, 0, -10000)
    function = ac.addLabel(fswindow, arr[0])
    ac.setPosition(function, 68, 5)
    ac.setFontColor(function, 0.945, 0.933, 0.102, 1.0)
    ac.setFontAlignment(function, 'center')

    running_keyhook = True
    t_kh = threading.Thread(target=keyhook)
    t_kh.start()

    return "Function select"

def keyhook():
    global running_keyhook, current_index, last_key_press_time

    while True:
        if getKeyState(18):  # Alt key
            if getKeyState(55):  # 7 key
                current_time = time.time()

                if current_time - last_key_press_time > DEBOUNCE_TIME:
                    current_index = (current_index + 1) % len(arr)
                    ac.setText(function, arr[current_index].format(function))

                    last_key_press_time = current_time

        if shutdown:
            running_keyhook = False
            break
 
Arriba