Что нового

[Элементы GUI] Связывание кнопок со скриптом

Corwin

Новичок
Сообщения
5
Репутация
0
3d8f64c2b4b4.jpg


Здравствуйте! Я новичок в программировании.
Пытаюсь написать программу которая будет:
1. скачивать картинку из инета,
2. сохранять,
3. конвертировать в заданный размер,
4. сохранять,
5. удалять файл из 2 пункта
6. ждать минуту
7. повторять всё

Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>

#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Программа", 330, 135, 416, 428)
$Button1 = GUICtrlCreateButton("Старт", 8, 8, 65, 25, $WS_GROUP)
$Button2 = GUICtrlCreateButton("Стоп", 80, 8, 65, 25, $WS_GROUP)
$Label1 = GUICtrlCreateLabel("Картинка:", 8, 40, 55, 17)
$foto = GUICtrlCreateInput("", 64, 40, 257, 21) ;ссылка на фото
$Label2 = GUICtrlCreateLabel("Временная папка:", 8, 72, 97, 17)
$temp = GUICtrlCreateInput("", 104, 72, 217, 21) ;ссылка на сохранения
$Label3 = GUICtrlCreateLabel("Конечная папка:", 8, 104, 88, 17)
$finish = GUICtrlCreateInput("", 96, 104, 225, 21) ;ссылка на сохранения конвертированно
$Label4 = GUICtrlCreateLabel("Высота:", 152, 8, 45, 17)
$y = GUICtrlCreateInput("", 200, 8, 33, 21) ;высота
$Label5 = GUICtrlCreateLabel("Ширина:", 240, 8, 46, 17)
$x = GUICtrlCreateInput("", 288, 8, 33, 21) ;ширина
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
		Exit
	EndSwitch
WEnd

Func __ImageResize($sFile, $sOutput, $iWidth, $iHeight)
    Local $hBMP, $hImage1, $hImage2, $hGraphic
    _GDIPlus_Startup()
    $hBMP = _WinAPI_CreateBitmap($iWidth, $iHeight, 1, 32) ; Create a bitmap (handle)
    $hImage1 = _GDIPlus_BitmapCreateFromHBITMAP($hBMP)  ; Create a bitmap object from a bitmap handle.
    $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage1) ; Get the graphic context of the blank bitmap.
    $hImage2 = _GDIPlus_ImageLoadFromFile($sFile)   ; Load the image you want to resize.
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hImage2, 0, 0, $iWidth, $iHeight) ;Draw the loaded image to the graphics of the blank bitmap at the size you want.
    _GDIPlus_ImageSaveToFile($hImage1, $sOutput)
    _GDIPlus_ImageDispose($hImage1)
    _GDIPlus_ImageDispose($hImage2)
    _GDIPlus_GraphicsDispose($hGraphic)
    _WinAPI_DeleteObject($hBMP)
    _GDIPlus_Shutdown()
EndFunc ;==>__ImageResize

InetGet($foto, $temp, 1, 1)
__ImageResize($temp, $finish, $y, $x)

Sleep(60000) ;ожижание


Подскажите пожалуйста как настроить кнопки "Старт" и "Стоп" и как написать 5 и 7 пункт.
Старт - запуск всего цикла, Стоп - остановка (для возможности ввода другой информации).
Так же нужна блокировка всех полей для ввода во время работы цикла.
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Не понятно назначение пункта 6. Зачем ждать?(или это будет ограничением демо-версии - не более одного файла в минуту? :D ) обработали файл, и ждем следующих данных.
С прерыванием операции тоже неясно в чем смысл? Скачать файл секунда, обработать еще одна, удаление мгновенное. Другое дело если обрабатывать кучу файлов - в таком случае лучше вынести пункты с 1 по 5 в отдельную функцию и вызывать ее для каждого файлика, вот тогда есть смысл в прерывании.
7 пункт - после завершения обработки одного файла нужно вернуть программу в исходное состояние? или снова и снова обрабатывать один и тот же файл? :shok:
В общем сделал два варианта: одни с прерывание(прервать можно только до и после скачки файла) второй без (думаю он подойдет также).
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>
Global $bStop
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Программа", 330, 135, 416, 428)
$Button1 = GUICtrlCreateButton("Старт", 8, 8, 65, 25, $WS_GROUP)
$Button2 = GUICtrlCreateButton("Стоп", 80, 8, 65, 25, $WS_GROUP)
$Label1 = GUICtrlCreateLabel("Картинка:", 8, 40, 55, 17)
$foto = GUICtrlCreateInput("", 64, 40, 257, 21) ;ссылка на фото
$Label2 = GUICtrlCreateLabel("Временная папка:", 8, 72, 97, 17)
$temp = GUICtrlCreateInput("", 104, 72, 217, 21) ;ссылка на сохранения
$Label3 = GUICtrlCreateLabel("Конечная папка:", 8, 104, 88, 17)
$finish = GUICtrlCreateInput("", 96, 104, 225, 21) ;ссылка на сохранения конвертированно
$Label4 = GUICtrlCreateLabel("Высота:", 152, 8, 45, 17)
$y = GUICtrlCreateInput("", 200, 8, 33, 21) ;высота
$Label5 = GUICtrlCreateLabel("Ширина:", 240, 8, 46, 17)
$x = GUICtrlCreateInput("", 288, 8, 33, 21) ;ширина
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
$nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			If GUICtrlRead($foto) = '' Or GUICtrlRead($temp) = '' Or GUICtrlRead($finish) = '' Or GUICtrlRead($y) = '' Or GUICtrlRead($x) = '' Then
				MsgBox(0, 'Ошибка!', 'Не все поля формы заполнены!')
			Else
				GUICtrlSetState($foto, $GUI_DISABLE)
				GUICtrlSetState($temp, $GUI_DISABLE)
				GUICtrlSetState($finish, $GUI_DISABLE)
				GUICtrlSetState($y, $GUI_DISABLE)
				GUICtrlSetState($x, $GUI_DISABLE)
				$sfoto = GUICtrlRead($foto)
				$sfinish = GUICtrlRead($finish)
				$stemp = GUICtrlRead($temp)
				$sy = GUICtrlRead($y)
				$sx = GUICtrlRead($x)
				Opt('GUIOnEventMode', 1) ; включаем обработчик событий от элементов управления GUI, для возможности прервать обработку
				GUICtrlSetOnEvent($Button2, '_stop') ; функция прерывания по кнопке стоп
				$bStop = False ; задаем значение прерывания ложным
				If Not $bStop Then ; была нажата кнопка стоп - прерываемся
					InetGet($sfoto, $stemp, 1, 1)
					If Not $bStop Then ; была нажата кнопка стоп - прерываемся
						__ImageResize($stemp, $sfinish, $sy, $sx)
						FileDelete($stemp)
;~ 						Sleep(60000) ;ожижание
					EndIf
				EndIf
				Opt('GUIOnEventMode', 0) ; выключаем обработчик событий от элементов управления GUI
				GUICtrlSetState($foto, $GUI_ENABLE)
				GUICtrlSetState($temp, $GUI_ENABLE)
				GUICtrlSetState($finish, $GUI_ENABLE)
				GUICtrlSetState($y, $GUI_ENABLE)
				GUICtrlSetState($x, $GUI_ENABLE)
			EndIf
    EndSwitch
WEnd

Func __ImageResize($sFile, $sOutput, $iWidth, $iHeight)
    Local $hBMP, $hImage1, $hImage2, $hGraphic
    _GDIPlus_Startup()
    $hBMP = _WinAPI_CreateBitmap($iWidth, $iHeight, 1, 32) ; Create a bitmap (handle)
    $hImage1 = _GDIPlus_BitmapCreateFromHBITMAP($hBMP)  ; Create a bitmap object from a bitmap handle.
    $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage1) ; Get the graphic context of the blank bitmap.
    $hImage2 = _GDIPlus_ImageLoadFromFile($sFile)   ; Load the image you want to resize.
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hImage2, 0, 0, $iWidth, $iHeight) ;Draw the loaded image to the graphics of the blank bitmap at the size you want.
    _GDIPlus_ImageSaveToFile($hImage1, $sOutput)
    _GDIPlus_ImageDispose($hImage1)
    _GDIPlus_ImageDispose($hImage2)
    _GDIPlus_GraphicsDispose($hGraphic)
    _WinAPI_DeleteObject($hBMP)
    _GDIPlus_Shutdown()
EndFunc ;==>__ImageResize

Func _stop()
	$bStop = True ; флаг прерывания - истина (была нажата кнопка стоп)
EndFunc
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>

#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Программа", 330, 135, 416, 428)
$Button1 = GUICtrlCreateButton("Старт", 8, 8, 65, 25, $WS_GROUP)

$Label1 = GUICtrlCreateLabel("Картинка:", 8, 40, 55, 17)
$foto = GUICtrlCreateInput("", 64, 40, 257, 21) ;ссылка на фото
$Label2 = GUICtrlCreateLabel("Временная папка:", 8, 72, 97, 17)
$temp = GUICtrlCreateInput("", 104, 72, 217, 21) ;ссылка на сохранения
$Label3 = GUICtrlCreateLabel("Конечная папка:", 8, 104, 88, 17)
$finish = GUICtrlCreateInput("", 96, 104, 225, 21) ;ссылка на сохранения конвертированно
$Label4 = GUICtrlCreateLabel("Высота:", 152, 8, 45, 17)
$y = GUICtrlCreateInput("", 200, 8, 33, 21) ;высота
$Label5 = GUICtrlCreateLabel("Ширина:", 240, 8, 46, 17)
$x = GUICtrlCreateInput("", 288, 8, 33, 21) ;ширина
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
$nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			If GUICtrlRead($foto) = '' Or GUICtrlRead($temp) = '' Or GUICtrlRead($finish) = '' Or GUICtrlRead($y) = '' Or GUICtrlRead($x) = '' Then
				MsgBox(0, 'Ошибка!', 'Не все поля формы заполнены!')
			Else
				GUICtrlSetState($foto, $GUI_DISABLE)
				GUICtrlSetState($temp, $GUI_DISABLE)
				GUICtrlSetState($finish, $GUI_DISABLE)
				GUICtrlSetState($y, $GUI_DISABLE)
				GUICtrlSetState($x, $GUI_DISABLE)
				$sfoto = GUICtrlRead($foto)
				$sfinish = GUICtrlRead($finish)
				$stemp = GUICtrlRead($temp)
				$sy = GUICtrlRead($y)
				$sx = GUICtrlRead($x)
				InetGet($sfoto, $stemp, 1, 1)
				__ImageResize($stemp, $sfinish, $sy, $sx)
				FileDelete($stemp)
				GUICtrlSetState($foto, $GUI_ENABLE)
				GUICtrlSetState($temp, $GUI_ENABLE)
				GUICtrlSetState($finish, $GUI_ENABLE)
				GUICtrlSetState($y, $GUI_ENABLE)
				GUICtrlSetState($x, $GUI_ENABLE)
			EndIf
    EndSwitch
WEnd

Func __ImageResize($sFile, $sOutput, $iWidth, $iHeight)
    Local $hBMP, $hImage1, $hImage2, $hGraphic
    _GDIPlus_Startup()
    $hBMP = _WinAPI_CreateBitmap($iWidth, $iHeight, 1, 32) ; Create a bitmap (handle)
    $hImage1 = _GDIPlus_BitmapCreateFromHBITMAP($hBMP)  ; Create a bitmap object from a bitmap handle.
    $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage1) ; Get the graphic context of the blank bitmap.
    $hImage2 = _GDIPlus_ImageLoadFromFile($sFile)   ; Load the image you want to resize.
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hImage2, 0, 0, $iWidth, $iHeight) ;Draw the loaded image to the graphics of the blank bitmap at the size you want.
    _GDIPlus_ImageSaveToFile($hImage1, $sOutput)
    _GDIPlus_ImageDispose($hImage1)
    _GDIPlus_ImageDispose($hImage2)
    _GDIPlus_GraphicsDispose($hGraphic)
    _WinAPI_DeleteObject($hBMP)
    _GDIPlus_Shutdown()
EndFunc ;==>__ImageResize
 
Автор
C

Corwin

Новичок
Сообщения
5
Репутация
0
На счет времени - программа должна раз в минуту скачивать файл с инета, конвертировать и сохранять.
У меня не работает. Обьясни пожалуйста в первом примере:
Код:
$bStop = False ; задаем значение прерывания ложным
If Not $bStop Then ; была нажата кнопка стоп - прерываемся
InetGet($foto, $temp, 1, 1)
If Not $bStop Then ; была нажата кнопка стоп - прерываемся
ImageResize($temp, $finish, $y, $x)
FileDelete($temp)
;~ Sleep(60000) ;ожижание
EndIf
EndIf
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Что не работает?
У тебя написано временная папка и конечная папка, а нужно указывать путь до файла!('c:\1.jpeg')
Не успеваешь нажать стоп, как картинка уже скачалась?
Код:
; $bStop это переменная которая может быть ЛИБО либо ИСТИНОЙ
$bStop = False ; здесь мы задаем ей значение ложь(скрипт не надо прерывать)
If Not $bStop Then ; если $bStop имеет значение ложь(аналог чтобы тебе лучше понять: If $bStop = False), то есть кнопка все еще не нажата - копируем картинку
	InetGet($sfoto, $stemp, 1, 1)
	If Not $bStop Then ; если кнопка все еще не нажата - ресайзим картинку
		ImageResize($stemp, $sfinish, $sy, $sx)
		FileDelete($stemp) ; удаляем файл куда сохранили картинку после скачивания
;~ 		Sleep(60000) ;ожижание
	EndIf
EndIf

Func _stop() ; а эта функция будет срабатывать при нажатии стоп и менять значение $bStop на ИСТИНУ
    $bStop = True ; флаг прерывания - истина (была нажата кнопка стоп)
EndFunc

Чтобы увидеть срабатывает стоп или нет сделай так:
Код:
Opt('GUIOnEventMode', 1)
                GUICtrlSetOnEvent($Button2, '_stop')
                $bStop = False
				ConsoleWrite('можно жать стоп!' & @CRLF)
				Sleep(5000)
                If Not $bStop Then
                    InetGet($foto, $temp, 1, 1)
					ConsoleWrite('можно жать стоп!' & @CRLF)
					Sleep(5000)
                    If Not $bStop Then
                        __ImageResize($temp, $finish, $y, $x)
                        FileDelete($temp)
                    EndIf
                EndIf
                Opt('GUIOnEventMode', 0)



Добавлено:
Сообщение автоматически объединено:

Corwin [?]
На счет времени - программа должна раз в минуту скачивать файл с инета, конвертировать и сохранять
Ну тогда так
Код:
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			If GUICtrlRead($foto) = '' Or GUICtrlRead($temp) = '' Or GUICtrlRead($finish) = '' Or GUICtrlRead($y) = '' Or GUICtrlRead($x) = '' Then
				MsgBox(0, 'Ошибка!', 'Не все поля формы заполнены!')
			Else
				$bStop = False
				Opt('GUIOnEventMode', 1)
				GUICtrlSetState($foto, $GUI_DISABLE)
				GUICtrlSetState($temp, $GUI_DISABLE)
				GUICtrlSetState($finish, $GUI_DISABLE)
				GUICtrlSetState($y, $GUI_DISABLE)
				GUICtrlSetState($x, $GUI_DISABLE)
				GUICtrlSetOnEvent($Button2, '_stop')
				$sfoto = GUICtrlRead($foto)
				$sfinish = GUICtrlRead($finish)
				$stemp = GUICtrlRead($temp)
				$sy = GUICtrlRead($y)
				$sx = GUICtrlRead($x)
				Do ; запуск бесконечного цикла пока не будет нажата кнопка стоп
					InetGet($sfoto, $stemp, 1, 1)
					__ImageResize($stemp, $sfinish, $sy, $sx)
					FileDelete($stemp)
					Sleep(60000)
				Until $bStop
				GUICtrlSetState($foto, $GUI_ENABLE)
				GUICtrlSetState($temp, $GUI_ENABLE)
				GUICtrlSetState($finish, $GUI_ENABLE)
				GUICtrlSetState($y, $GUI_ENABLE)
				GUICtrlSetState($x, $GUI_ENABLE)
				Opt('GUIOnEventMode', 0)
			EndIf
	EndSwitch
WEnd

PS: а нужно ли тогда удалять файл? ведь при копировании обновленного файла InetGet его заменит.

Прошу прощения за невнимательность! спешил с написанием скриптов и забыл считать входные данные для функций! Все переправил - тестируй
 
Автор
C

Corwin

Новичок
Сообщения
5
Репутация
0
Цикл не повторяется.
После нажатия "Старт" кнопка "Стоп" не работает.
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Corwin [?]
После нажатия "Старт" кнопка "Стоп" не работает.
Она срабатывает, но через минуту :D потому что флаг остоновки проверятся после Sleep(60000)
Можно и это обойти - замени Sleep(60000) на
Код:
For $i = 1 To 60
						If $bStop Then ExitLoop 2
						Sleep(1000)
					Next

тогда флаг будет проверяться каждую секунду.

У меня цикл пошел нормально, но понадобилось изменить InetGet($sfoto, $stemp, 1, 1) на InetGet($sfoto, $stemp, 1), иначе скрипт не дожидался окончания скачки файла и обрабатывал несуществующий или старый файл
 
Автор
C

Corwin

Новичок
Сообщения
5
Репутация
0
Спасибо! Все работает! :D :IL_AutoIt_1:
Рабочий скрипт:
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>
Global $bStop
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Программа", 330, 135, 416, 428)
$Button1 = GUICtrlCreateButton("Старт", 8, 8, 65, 25, $WS_GROUP)
$Button2 = GUICtrlCreateButton("Стоп", 80, 8, 65, 25, $WS_GROUP)
$Label1 = GUICtrlCreateLabel("Картинка:", 8, 40, 55, 17)
$foto = GUICtrlCreateInput("", 64, 40, 257, 21) ;ссылка на фото
$Label2 = GUICtrlCreateLabel("Временный файл:", 8, 72, 97, 17)
$temp = GUICtrlCreateInput("", 104, 72, 217, 21) ;ссылка на сохранения
$Label3 = GUICtrlCreateLabel("Конечный файл:", 8, 104, 88, 17)
$finish = GUICtrlCreateInput("", 96, 104, 225, 21) ;ссылка на сохранения конвертированно
$Label4 = GUICtrlCreateLabel("Высота:", 152, 8, 45, 17)
$x = GUICtrlCreateInput("", 200, 8, 33, 21) ;высота
$Label5 = GUICtrlCreateLabel("Ширина:", 240, 8, 46, 17)
$y = GUICtrlCreateInput("", 288, 8, 33, 21) ;ширина
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button1
            If GUICtrlRead($foto) = '' Or GUICtrlRead($temp) = '' Or GUICtrlRead($finish) = '' Or GUICtrlRead($y) = '' Or GUICtrlRead($x) = '' Then
                MsgBox(0, 'Ошибка!', 'Не все поля формы заполнены!')
            Else
                $bStop = False
                Opt('GUIOnEventMode', 1)
                GUICtrlSetState($foto, $GUI_DISABLE)
                GUICtrlSetState($temp, $GUI_DISABLE)
                GUICtrlSetState($finish, $GUI_DISABLE)
                GUICtrlSetState($y, $GUI_DISABLE)
                GUICtrlSetState($x, $GUI_DISABLE)
                GUICtrlSetOnEvent($Button2, '_stop')
                $sfoto = GUICtrlRead($foto)
                $sfinish = GUICtrlRead($finish)
                $stemp = GUICtrlRead($temp)
                $sy = GUICtrlRead($y)
                $sx = GUICtrlRead($x)
                Do ; запуск бесконечного цикла пока не будет нажата кнопка стоп
                    InetGet($sfoto, $stemp, 1)
                    __ImageResize($stemp, $sfinish, $sy, $sx)
                    FileDelete($stemp)
                    For $i = 1 To 60
                        If $bStop Then ExitLoop 2
                        Sleep(1000)
                    Next
                Until $bStop
                GUICtrlSetState($foto, $GUI_ENABLE)
                GUICtrlSetState($temp, $GUI_ENABLE)
                GUICtrlSetState($finish, $GUI_ENABLE)
                GUICtrlSetState($y, $GUI_ENABLE)
                GUICtrlSetState($x, $GUI_ENABLE)
                Opt('GUIOnEventMode', 0)
            EndIf
    EndSwitch
WEnd

Func __ImageResize($sFile, $sOutput, $iWidth, $iHeight)
    Local $hBMP, $hImage1, $hImage2, $hGraphic
    _GDIPlus_Startup()
    $hBMP = _WinAPI_CreateBitmap($iWidth, $iHeight, 1, 32) ; Create a bitmap (handle)
    $hImage1 = _GDIPlus_BitmapCreateFromHBITMAP($hBMP)  ; Create a bitmap object from a bitmap handle.
    $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage1) ; Get the graphic context of the blank bitmap.
    $hImage2 = _GDIPlus_ImageLoadFromFile($sFile)   ; Load the image you want to resize.
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hImage2, 0, 0, $iWidth, $iHeight) ;Draw the loaded image to the graphics of the blank bitmap at the size you want.
    _GDIPlus_ImageSaveToFile($hImage1, $sOutput)
    _GDIPlus_ImageDispose($hImage1)
    _GDIPlus_ImageDispose($hImage2)
    _GDIPlus_GraphicsDispose($hGraphic)
    _WinAPI_DeleteObject($hBMP)
    _GDIPlus_Shutdown()
EndFunc ;==>__ImageResize

Func _stop()
    $bStop = True ; флаг прерывания - истина (была нажата кнопка стоп)
EndFunc
 
Верх