Parpadeo en los botones

Pregunta Sin Miedo no te cortes cualquier cosa para empezar - Autoit se comienza facilmente.Para Ordenes o Comandos sueltos. Ver nota como preguntar.
Responder
adrianodj
Mensajes: 13
Registrado: 18 May 2011, 22:42

Parpadeo en los botones

Mensaje por adrianodj »

Hola amigos he leido mucho por el foro y he avanzado mucho con mi proyecto que en realidad es un instalador y desinstalador de 3 programas echos por mi .
El problema que tengo ahora es que tengo el script y un archivo.ini que le va diciendo al script si el programa esta instalado o no y me activa automaticamente los botones de desinstalar
pero cuando el script me activa los botones de desinstalar estos empieza a parpadear y no lo se porque
os pongo el codigo del script y el del archivo .ini
Este es mi primer script que he creado con autoit y la primera vez que he programado algo
espero vuestra respuesta
gracias

Código: Seleccionar todo

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <guiconstants.au3>

#Region ### START Koda GUI section ### Form=
$var = 1
$Form1 = GUICreate("Form1", 361, 202, 286, 228)
$Checkbox1 = GUICtrlCreateCheckbox("Install 1", 40, 32, 81, 17)
$Checkbox2 = GUICtrlCreateCheckbox("Install 2", 40, 72, 81, 17)
$Group1 = GUICtrlCreateGroup("Theme", 8, 8, 345, 137)
$Button3 = GUICtrlCreateButton("Desinstalar", 144, 32, 81, 17, $WS_GROUP)
$Button4 = GUICtrlCreateButton("Desinstalar", 144, 72, 81, 17, $WS_GROUP)
$Checkbox3 = GUICtrlCreateCheckbox("Install 3", 40, 112, 73, 17)
$Button5 = GUICtrlCreateButton("Desinstalar", 144, 112, 81, 17, $WS_GROUP)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Button1 = GUICtrlCreateButton("Aceptar", 64, 160, 97, 25, $WS_GROUP)
$Button2 = GUICtrlCreateButton("Cancelar", 200, 160, 97, 25, $WS_GROUP)
$Checkbox1estado = IniRead("estados.ini","Checkbox1", "estado", "")
$Checkbox1estado = IniRead("estados.ini","Checkbox2", "estado", "")
$Checkbox1estado = IniRead("estados.ini","Checkbox3", "estado", "")
GUICtrlSetState($Button3,$GUI_DISABLE)
GUICtrlSetState($Button4,$GUI_DISABLE)
GUICtrlSetState($Button5,$GUI_DISABLE)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

Func _chkIsChecked($chk)
   Return BitAnd(GUICtrlRead($chk),$GUI_CHECKED) = $GUI_CHECKED
EndFunc
Func Checkbox1()
	GUICtrlSetState($Button3,$GUI_ENABLE)
	GUICtrlSetState($Checkbox1,$GUI_DISABLE)
EndFunc
Func Checkbox2()
	GUICtrlSetState($Button4,$GUI_ENABLE)
	GUICtrlSetState($Checkbox2,$GUI_DISABLE)
EndFunc
Func Checkbox3()
	GUICtrlSetState($Button5,$GUI_ENABLE)
	GUICtrlSetState($Checkbox3,$GUI_DISABLE)
EndFunc

While 2
	$msg = GUIGetMsg()
		If IniRead("estados.ini","Checkbox1","estado","") Then Checkbox1()
		If IniRead("estados.ini","Checkbox2","estado","") Then Checkbox2()
        If IniRead("estados.ini","Checkbox3","estado","") Then Checkbox3()
Switch $Msg
      Case $GUI_EVENT_CLOSE
		Exit

	Case $Button1
         If _chkIsChecked($Checkbox1) Then
       ShellExecute("prueba1.exe")
	   IniWrite("estados.ini","Checkbox1", "estado","instalado")
	   GUICtrlSetState($Checkbox1,$GUI_UNCHECKED)
			EndIf
         If _chkIsChecked($Checkbox2) Then
       ShellExecute("prueba2.exe")
	   IniWrite("estados.ini","Checkbox2", "estado","instalado")
	   GUICtrlSetState($Checkbox2,$GUI_UNCHECKED)
			EndIf
		If _chkIsChecked($Checkbox3) Then
       ShellExecute("prueba3.exe")
	   IniWrite("estados.ini","Checkbox3", "estado","instalado")
	   GUICtrlSetState($Checkbox3,$GUI_UNCHECKED)
			EndIf

	Case $Button2
		Exit

	Case $Button3
         If IniRead("estados.ini","Checkbox1","estado","instalado") Then
		ShellExecute("desinstalar3.exe")
		IniDelete("estados.ini","Checkbox1","estado")
		GUICtrlSetState($Button3,$GUI_DISABLE)
		GUICtrlSetState($Checkbox1,$GUI_ENABLE)
		GUICtrlSetState($Checkbox1,$GUI_UNCHECKED)
			EndIf

    Case $Button4
          If IniRead("estados.ini","Checkbox2","estado","instalado") Then
       ShellExecute("desinstalar4.exe")
	   IniDelete("estados.ini","Checkbox2","estado")
	   GUICtrlSetState($Button4,$GUI_DISABLE)
	   GUICtrlSetState($Checkbox2,$GUI_ENABLE)
	   GUICtrlSetState($Checkbox2,$GUI_UNCHECKED)
			EndIf

    Case $Button5
          If IniRead("estados.ini","Checkbox3","estado","instalado") Then
       ShellExecute("desinstalar5.exe")
	   IniDelete("estados.ini","Checkbox3","estado")
	   GUICtrlSetState($Button5,$GUI_DISABLE)
	   GUICtrlSetState($Checkbox3,$GUI_ENABLE)
	   GUICtrlSetState($Checkbox3,$GUI_UNCHECKED)
			EndIf

EndSwitch
WEnd
.ini

Código: Seleccionar todo

[Checkbox1]
[Checkbox2]
estado=instalado
[Checkbox3]
estado=instalado
Avatar de Usuario
sahsanu
Mensajes: 9
Registrado: 02 May 2011, 05:58
Ubicación: Zaragoza, España

Re: Parpadeo en los botones

Mensaje por sahsanu »

Buenas,

Te está parapeando porque estás comtinuamente usando GUICtrlSetState. Cada vez que lo usas se redibuja el botón.
Para solucionarlo, yo pondría los tres primeros If IniRead que tienes en el While y los metería en una función. Esa función la llamaría sólo cuando se presiona uno de los botones.

Y antes de WEnd métele un Sleep(40) para que tu script no devore toda la CPU.

Con esto debería desaparecer el parpadeo.
adrianodj
Mensajes: 13
Registrado: 18 May 2011, 22:42

Re: Parpadeo en los botones

Mensaje por adrianodj »

hola muy buensa
lo del parpadeo esta solucinado pero ahora tengo otra duda .
tengo 3 checkbox 1,2y3 cuando activo el checkbox3 se me activan automaticamente los checkbox 1 y 2
la pregunta es como hacer que cuando desleciono la checkbox3 se desactiven tambien los 1 y el 2
el codigo es este

Código: Seleccionar todo

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <guiconstants.au3>

#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 285, 159, 192, 124)
$Checkbox1 = GUICtrlCreateCheckbox("Checkbox1", 80, 16, 129, 25)
$Checkbox2 = GUICtrlCreateCheckbox("Checkbox2", 80, 56, 129, 33)
$Checkbox3 = GUICtrlCreateCheckbox("Checkbox3", 80, 96, 121, 33)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
Func _chkIsChecked($chk)
	Return BitAND(GUICtrlRead($chk), $GUI_CHECKED) = $GUI_CHECKED
EndFunc   ;==>_chkIsChecked


Func Checkbox7() ; activacion de los checkbox 1y2 si se activa el 3
	GUICtrlSetState($Checkbox1, $GUI_CHECKED)
	GUICtrlSetState($Checkbox2, $GUI_CHECKED)
EndFunc   ;==>Checkbox7

While 2
	Sleep(100)
	$msg = GUIGetMsg()
	If _chkIsChecked($Checkbox3) Then Checkbox7() ; si se activa checkbox 3 se activa automaticamente las 1 y 2.
	Switch $msg
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
	Sleep(40)
WEnd
lo he intentado hacer asi pero no funcciona

Código: Seleccionar todo

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <guiconstants.au3>

#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 285, 159, 192, 124)
$Checkbox1 = GUICtrlCreateCheckbox("Checkbox1", 80, 16, 129, 25)
$Checkbox2 = GUICtrlCreateCheckbox("Checkbox2", 80, 56, 129, 33)
$Checkbox3 = GUICtrlCreateCheckbox("Checkbox3", 80, 96, 121, 33)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
Func _chkIsChecked($chk)
	Return BitAND(GUICtrlRead($chk), $GUI_CHECKED) = $GUI_CHECKED
EndFunc   ;==>_chkIsChecked


Func Checkbox7() ; activacion de los checkbox 1y2 si se activa el 3
	GUICtrlSetState($Checkbox1, $GUI_CHECKED)
	GUICtrlSetState($Checkbox2, $GUI_CHECKED)
EndFunc   ;==>Checkbox7

Func Uncheckbox7()
	GUICtrlSetState($Checkbox1, $GUI_UNCHECKED)
	GUICtrlSetState($Checkbox2, $GUI_UNCHECKED)
EndFunc   ;==>Uncheckbox7

While 2
	Sleep(100)
	$msg = GUIGetMsg()
	If _chkIsChecked($Checkbox3) Then Checkbox7() ; si se activa checkbox 3 se activa automaticamente las 1 y 2.
	If GUICtrlGetState($Checkbox3) = $GUI_UNCHECKED Then Uncheckbox7()
	Switch $msg
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
	Sleep(40)
WEnd
ps: no es mi proyecto es solamente un ejemplo
adrianodj
Mensajes: 13
Registrado: 18 May 2011, 22:42

Re: Parpadeo en los botones

Mensaje por adrianodj »

hola la respuesta la tengo investigando he encotrado la solucion

Código: Seleccionar todo

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <guiconstants.au3>

#Region ### START Koda GUI section ### Form=
$control = False
$Form1 = GUICreate("Form1", 285, 159, 192, 124)
$Checkbox1 = GUICtrlCreateCheckbox("Checkbox1", 80, 16, 129, 25)
$Checkbox2 = GUICtrlCreateCheckbox("Checkbox2", 80, 56, 129, 33)
$Checkbox3 = GUICtrlCreateCheckbox("Checkbox3", 80, 96, 121, 33)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
Func _chkIsChecked($chk)
	Return BitAND(GUICtrlRead($chk), $GUI_CHECKED) = $GUI_CHECKED
EndFunc   ;==>_chkIsChecked


Func Checkbox7() ; activacion de los checkbox 1y2 si se activa el 3
	GUICtrlSetState($Checkbox1, $GUI_CHECKED)
	GUICtrlSetState($Checkbox2, $GUI_CHECKED)
EndFunc   ;==>Checkbox7

Func Uncheckbox7()
	GUICtrlSetState($Checkbox1, $GUI_UNCHECKED)
	GUICtrlSetState($Checkbox2, $GUI_UNCHECKED)
EndFunc   ;==>Uncheckbox7

While 2
	$msg = GUIGetMsg()
	If $control = False Then
	Switch $msg
		Case $GUI_EVENT_CLOSE
			Exit

		Case $Checkbox3
			If _chkIsChecked($Checkbox3) Then
				Checkbox7()
			Else
				Uncheckbox7()
			$control = False
			EndIf
	EndSwitch
	Sleep(40)
	EndIf
WEnd
adrianodj
Mensajes: 13
Registrado: 18 May 2011, 22:42

Re: Parpadeo en los botones

Mensaje por adrianodj »

Hola otra vez bueno que estoy terminando mi script pero tengo un problema
os la esplico:
tengo las 3 checkbox y un boton
quiero que cuando pulso el boton y alguna checkbox esta selectionada que me salga un mensaje que diga que alguna de las checkbox esta activa
os pongo mi codigo

Código: Seleccionar todo

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <guiconstants.au3>

#Region ### START Koda GUI section ### Form=
$control = False
$Form1 = GUICreate("Form1", 285, 159, 192, 124)
$Checkbox1 = GUICtrlCreateCheckbox("Checkbox1", 80, 15, 129, 25)
$Checkbox2 = GUICtrlCreateCheckbox("Checkbox2", 80, 45, 129, 33)
$Checkbox3 = GUICtrlCreateCheckbox("Checkbox3", 80, 75, 121, 33)
$Button1 = GUICtrlCreateButton("Aceptar", 160, 120, 97, 25, $WS_GROUP)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
Func _chkIsChecked($chk)
	Return BitAND(GUICtrlRead($chk), $GUI_CHECKED) = $GUI_CHECKED
EndFunc   ;==>_chkIsChecked


Func Checkbox7() ; activacion de los checkbox 1y2 si se activa el 3
	GUICtrlSetState($Checkbox1, $GUI_CHECKED)
	GUICtrlSetState($Checkbox2, $GUI_CHECKED)
EndFunc   ;==>Checkbox7

Func Uncheckbox7()
	GUICtrlSetState($Checkbox1, $GUI_UNCHECKED)
	GUICtrlSetState($Checkbox2, $GUI_UNCHECKED)
EndFunc   ;==>Uncheckbox7

While 2
	$msg = GUIGetMsg()
	If $control = False Then
		EndIf
		Switch $msg
			Case $GUI_EVENT_CLOSE
				Exit
			Case $Checkbox3
				If _chkIsChecked($Checkbox3) Then
					Checkbox7()
				Else
					Uncheckbox7()
					$control = False
				EndIf
			Case $Button1
				If _chkIsChecked($Checkbox1) Then
					MsgBox("0", "Activacion", "Activada una de las checkbox")
				Else
					MsgBox("0", "Activacion", "No hai nada selectionado")
				EndIf
				If _chkIsChecked($Checkbox2) Then
					MsgBox("0", "Activacion", "Activada una de las checkbox")
				Else
					MsgBox("0", "Activacion", "No hai nada selectionado")
					EndIf
$control = False
	EndSwitch
	Sleep(40)
WEnd
el problema es que si tengo las dos checkbox 1y2 selectionada me manda dos mensajes uno detras de otro , tambien si no hay nada selectionado
lo que io quiero es que si estan selectionadas las dos que me mande un mensaje solo
gracias
un saludo
Avatar de Usuario
sahsanu
Mensajes: 9
Registrado: 02 May 2011, 05:58
Ubicación: Zaragoza, España

Re: Parpadeo en los botones

Mensaje por sahsanu »

adrianodj escribió:el problema es que si tengo las dos checkbox 1y2 selectionada me manda dos mensajes uno detras de otro , tambien si no hay nada selectionado
lo que io quiero es que si estan selectionadas las dos que me mande un mensaje solo
gracias
un saludo
Cambia los dos If que tienes en Case $Button1 por esto:

Código: Seleccionar todo

If _chkIsChecked($Checkbox1) Or _chkIsChecked($Checkbox2) Then
      MsgBox("0", "Activación", "Activada una de las checkbox")
Else
      MsgBox("0", "Activación", "No hay nada seleccionado")
EndIf
Responder