Автор Тема: Формирование GUI теста по txt  (Прочитано 2762 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Эта тема содержит сообщение, помеченное как лучший ответ. Кликните здесь для перехода к этому сообщению.

Оффлайн SergVrn [?]

  • Новичок
  • *
  • Сообщений: 32
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Доброго времени суток, форумчане.

Подскажите как реализовать такой скрипт с интерфейсом GUI:

В текстовом документе содержатся вопросы теста. Вопросов несколько и они идут - один за другим.

Как скриптом сформировать по этому txt - интерфейс теста с кнопками ?
Если ответ правильный (правильный щелчок на нужную кнопку выбора ответа теста) - то GUI скрывается в трей и появляется через 10-20 минут (если ответ неверный - то окно ничего не делает, никуда не исчезает, а через 1 минуту повторяет случайный вопрос)


Внимание: Для просмотра прикреплённых файлов необходимо Войти или Зарегистрироваться

Русское сообщество AutoIt

Формирование GUI теста по txt
« Отправлен: Май 14, 2019, 04:59:23 »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 8082
  • Репутация: 2314
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Формирование GUI теста по txt
« Ответ #1, Отправлен: Май 14, 2019, 08:42:45 »
SergVrn  [?]
Цитировать
Подскажите как реализовать такой скрипт с интерфейсом GUI:
Ну это не подсказка тут нужна, а реализация задачи.

Код: AutoIt [Выделить]
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $sRead = FileRead('Тестовые вопросы и ответы.txt')
Global $aData = StringRegExp($sRead, '(?s)(Вопрос \d+\r?\n[^\r\n]+\r?\nОтветы:\r?\n.*?\r?\nПравильный:\r?\n[^\r\n]+)', 3)
Global $aQuestion_Bttn[10], $iQuestion_Lbl, $sCorret_Answer

Opt('TrayMenuMode', 1)
TraySetState(2)

$hGUI = GUICreate('Test')

_Random_Question()

GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
   
    Switch $nMsg
        Case 0
            ContinueLoop
        Case $GUI_EVENT_CLOSE
            Exit
        Case $aQuestion_Bttn[1] To $aQuestion_Bttn[9]
            If GUICtrlRead($nMsg) = $sCorret_Answer Then
                TraySetState(1)
                GUISetState(@SW_HIDE)
                Sleep(1000 * 60 * 10) ;10 minutes
                GUISetState(@SW_SHOW)
                TraySetState(2)
               
                _Random_Question()
            Else
                Sleep(1000 * 60 * 1) ;1 minute
                _Random_Question()
            EndIf
    EndSwitch
WEnd

Func _Random_Question()
    Local Static $fFirst = True
    Local Static $iLast_Random
   
    Local $iRandom
   
    Do
        $iRandom = Random(0, UBound($aData) - 1, 1)
    Until $iRandom <> $iLast_Random
   
    $iLast_Random = $iRandom
   
    Local $sQuestion = StringRegExpReplace($aData[$iRandom], '(?s)Вопрос \d+\r?\n([^\r\n]+).*', '\1')
    Local $aQuestions = StringSplit(StringStripCR(StringRegExpReplace($aData[$iRandom], '(?s).*?Ответы:\r?\n(.*?)\r?\nПравильный:.*', '\1')), @LF)
   
    $sCorret_Answer = StringRegExpReplace($aData[$iRandom], '(?s).*?\r?\nПравильный:\r?\n([^\r\n]+)', '\1')
   
    If $fFirst Then
        $fFirst = False
        $iQuestion_Lbl = GUICtrlCreateLabel('', 20, 20, 200, 20)
       
        For $i = 1 To 9
            $aQuestion_Bttn[$i] = GUICtrlCreateButton('', 20, $i * 40, 200, 20)
            GUICtrlSetState($aQuestion_Bttn[$i], $GUI_HIDE)
        Next
    EndIf
   
    GUICtrlSetData($iQuestion_Lbl, $sQuestion)
   
    For $i = 1 To 9
        GUICtrlSetData($aQuestion_Bttn[$i], '')
        GUICtrlSetState($aQuestion_Bttn[$i], $GUI_HIDE)
    Next
   
    For $i = 1 To $aQuestions[0]
        GUICtrlSetData($aQuestion_Bttn[$i], $aQuestions[$i])
        GUICtrlSetState($aQuestion_Bttn[$i], $GUI_SHOW)
    Next
EndFunc



Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Оффлайн SergVrn [?]

  • Новичок
  • *
  • Сообщений: 32

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Формирование GUI теста по txt
« Ответ #2, Отправлен: Май 16, 2019, 08:35:13 »
CreatoR спасибо.
Все работает хорошо.
Но немного неточно.

Есть возможность сразу при первом запуске окна - нажать несколько неверных ответов.

Как поменять скрипт, чтобы он при неверном ответе - просто убирал бы кнопки с формы - на 1 минуту (пока длится пауза) ?
А потом бы, спустя минуту - снова показывал их при задании нового вопроса.
Таким образом нельзя будет нажать на кнопки несколько раз - только один раз - на одну кнопку.


Русское сообщество AutoIt

Re: Формирование GUI теста по txt
« Ответ #2 Отправлен: Май 16, 2019, 08:35:13 »

Помечен как лучший ответ пользователем SergVrn Отправлен Май 23, 2019, 11:52:57

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 8082
  • Репутация: 2314
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Формирование GUI теста по txt
« Ответ #3, Отправлен: Май 21, 2019, 23:19:16 »
SergVrn  [?]
Цитировать
немного неточно.
А вопрос был точно составлен? мне кажется нет, там нет упоминания о таких нюансах.

Цитировать
Как поменять скрипт, чтобы он при неверном ответе - просто убирал бы кнопки с формы - на 1 минуту (пока длится пауза) ?
Я бы их просто отключал.
Предвкушая вопрос о том, чтобы добавить отображение статуса...
"Исправленный" вариант:

Код: AutoIt [Выделить]
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

FileChangeDir(@DesktopDir)

Global $sRead = FileRead('Тестовые вопросы и ответы.txt')
Global $aData = StringRegExp($sRead, '(?s)(Вопрос \d+\r?\n[^\r\n]+\r?\nОтветы:\r?\n.*?\r?\nПравильный:\r?\n[^\r\n]+)', 3)
Global $aQuestion_Bttn[10], $iQuestion_Lbl, $sCorret_Answer
Global $iTimer

Global $iCrctAnswr_Sleep = 10 ;Minutes
Global $iInCrctAnswr_Sleep = 1 ;Minutes

Opt('TrayMenuMode', 1)
TraySetState(2)

$hGUI = GUICreate('Questions', 250, 300)

$iStatus_Lbl = GUICtrlCreateLabel('', 20, 270, 210, 30)
GUICtrlSetColor(-1, 0xFF0000)

_Questions_SetRandom()

GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
   
    Switch $nMsg
        Case 0
            ContinueLoop
        Case $GUI_EVENT_CLOSE
            Exit
        Case $aQuestion_Bttn[1] To $aQuestion_Bttn[9]
            If GUICtrlRead($nMsg) = $sCorret_Answer Then
                TraySetState(1)
                GUISetState(@SW_HIDE)
                Sleep(1000 * 60 * $iCrctAnswr_Sleep)
                GUISetState(@SW_SHOW)
                TraySetState(2)
            Else
                $iTimer = TimerInit()
                AdlibRegister('_Status_Timer', 1000)
                _Status_Timer()
               
                _Questions_SetState($GUI_DISABLE)
                Sleep(1000 * 60 * $iInCrctAnswr_Sleep)
                _Questions_SetState($GUI_ENABLE)
               
                AdlibUnRegister('_Status_Timer')
                GUICtrlSetData($iStatus_Lbl, '')
            EndIf
           
            _Questions_SetRandom()
    EndSwitch
WEnd

Func _Status_SetData($sData)
    If GUICtrlRead($iStatus_Lbl) <> $sData Then
        GUICtrlSetData($iStatus_Lbl, $sData)
    EndIf
EndFunc

Func _Status_Timer()
    _Status_SetData('Неверный ответ, до нового вопроса осталось: ' & (($iInCrctAnswr_Sleep * 60) - Round(TimerDiff($iTimer) / 1000)) & ' сек.')
EndFunc

Func _Questions_SetRandom()
    Local Static $fFirst = True
    Local Static $iLast_Random
   
    Local $iRandom
   
    Do
        $iRandom = Random(0, UBound($aData) - 1, 1)
    Until $iRandom <> $iLast_Random
   
    $iLast_Random = $iRandom
   
    Local $sQuestion = StringRegExpReplace($aData[$iRandom], '(?s)Вопрос \d+\r?\n([^\r\n]+).*', '\1')
    Local $aQuestions = StringSplit(StringStripCR(StringRegExpReplace($aData[$iRandom], '(?s).*?Ответы:\r?\n(.*?)\r?\nПравильный:.*', '\1')), @LF)
   
    $sCorret_Answer = StringRegExpReplace($aData[$iRandom], '(?s).*?\r?\nПравильный:\r?\n([^\r\n]+)', '\1')
   
    If $fFirst Then
        $fFirst = False
        $iQuestion_Lbl = GUICtrlCreateLabel('', 20, 20, 200, 20)
       
        For $i = 1 To 9
            $aQuestion_Bttn[$i] = GUICtrlCreateButton('', 20, $i * 40, 200, 20)
            GUICtrlSetState($aQuestion_Bttn[$i], $GUI_HIDE)
        Next
    EndIf
   
    GUICtrlSetData($iQuestion_Lbl, $sQuestion)
   
    For $i = 1 To 9
        GUICtrlSetData($aQuestion_Bttn[$i], '')
        GUICtrlSetState($aQuestion_Bttn[$i], $GUI_HIDE)
    Next
   
    For $i = 1 To $aQuestions[0]
        GUICtrlSetData($aQuestion_Bttn[$i], $aQuestions[$i])
        GUICtrlSetState($aQuestion_Bttn[$i], $GUI_SHOW)
    Next
EndFunc

Func _Questions_SetState($iState)
    For $i = 1 To 9
        If $aQuestion_Bttn[$i] Then
            GUICtrlSetState($aQuestion_Bttn[$i], $iState)
        EndIf
    Next
EndFunc


Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 8082
  • Репутация: 2314
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Формирование GUI теста по txt
« Ответ #4, Отправлен: Май 22, 2019, 21:06:34 »
Хотя я бы делал лучше так:

Код: AutoIt [Выделить]
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $sData_File = @ScriptDir & '\Data.ini'
Global $aQuestion_Bttn[10], $sCorret_Answer, $iTimer
Global $iCrctAnswr_Sleep = 10 ;Minutes
Global $iInCrctAnswr_Sleep = 1 ;Minutes

Opt('TrayMenuMode', 1)
TraySetState(2)

Global $hGUI = GUICreate('Questions', 250, 300)
Global $iStatus_Lbl = GUICtrlCreateLabel('', 20, 270, 210, 30)
GUICtrlSetColor(-1, 0xFF0000)

_Questions_SetRandom()
GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
   
    Switch $nMsg
        Case 0
            ContinueLoop
        Case $GUI_EVENT_CLOSE
            Exit
        Case $aQuestion_Bttn[1] To $aQuestion_Bttn[9]
            If GUICtrlRead($nMsg) = $sCorret_Answer Then
                TraySetState(1)
                GUISetState(@SW_HIDE)
                Sleep(1000 * 60 * $iCrctAnswr_Sleep)
                GUISetState(@SW_SHOW)
                TraySetState(2)
            Else
                $iTimer = TimerInit()
                AdlibRegister('_Status_Timer', 1000)
                _Status_Timer()
               
                _Questions_SetState($GUI_DISABLE)
                Sleep(1000 * 60 * $iInCrctAnswr_Sleep)
                _Questions_SetState($GUI_ENABLE)
               
                AdlibUnRegister('_Status_Timer')
                GUICtrlSetData($iStatus_Lbl, '')
            EndIf
           
            _Questions_SetRandom()
    EndSwitch
WEnd

Func _Status_Timer()
    _Status_SetData('Неверный ответ, до нового вопроса осталось: ' & (($iInCrctAnswr_Sleep * 60) - Round(TimerDiff($iTimer) / 1000)) & ' сек.')
EndFunc

Func _Status_SetData($sData)
    If GUICtrlRead($iStatus_Lbl) <> $sData Then
        GUICtrlSetData($iStatus_Lbl, $sData)
    EndIf
EndFunc

Func _Questions_SetRandom()
    Local Static $fFirst = True
    Local Static $iLast_Random, $iQuestion_Lbl
   
    Local $iRandom
    Local $aSects = IniReadSectionNames($sData_File)
   
    If Not IsArray($aSects) Then
        MsgBox(48, @ScriptName, 'Ошибка чтения вопросов с файла:' & @CRLF & $sData_File, 0, $hGUI)
        Exit
    EndIf
   
    Do
        $iRandom = Random(1, $aSects[0], 1)
    Until $iRandom <> $iLast_Random
   
    $iLast_Random = $iRandom
   
    Local $sQuestion = IniRead($sData_File, $aSects[$iRandom], 'Question', '')
    Local $aAnswers = StringSplit(IniRead($sData_File, $aSects[$iRandom], 'Answers', ''), '|')
   
    $sCorret_Answer = IniRead($sData_File, $aSects[$iRandom], 'Correct Answer', '')
   
    If $fFirst Then
        $fFirst = False
        $iQuestion_Lbl = GUICtrlCreateLabel('', 20, 20, 200, 20)
       
        For $i = 1 To 9
            $aQuestion_Bttn[$i] = GUICtrlCreateButton('', 20, $i * 40, 200, 20)
            GUICtrlSetState($aQuestion_Bttn[$i], $GUI_HIDE)
        Next
    EndIf
   
    GUICtrlSetData($iQuestion_Lbl, $sQuestion)
   
    For $i = 1 To 9
        GUICtrlSetData($aQuestion_Bttn[$i], '')
        GUICtrlSetState($aQuestion_Bttn[$i], $GUI_HIDE)
    Next
   
    For $i = 1 To $aAnswers[0]
        GUICtrlSetData($aQuestion_Bttn[$i], $aAnswers[$i])
        GUICtrlSetState($aQuestion_Bttn[$i], $GUI_SHOW)
    Next
EndFunc

Func _Questions_SetState($iState)
    For $i = 1 To 9
        If $aQuestion_Bttn[$i] Then
            GUICtrlSetState($aQuestion_Bttn[$i], $iState)
        EndIf
    Next
EndFunc


Файл Data.ini:
Код: (ini) [Выделить]
  1. [Q1]
  2. Question=Сколько длятся сутки?
  3. Answers=23 часа|20 часов|25 часов|24 часа|Ни один из ответов
  4. Correct Answer=24 часа
  5.  
  6. [Q2]
  7. Question=Сколько минут в часе?
  8. Answers=50 минут|60 минут|40 минут|Ни один из ответов
  9. Correct Answer=60 минут

Русское сообщество AutoIt

Re: Формирование GUI теста по txt
« Ответ #4 Отправлен: Май 22, 2019, 21:06:34 »

Оффлайн SergVrn [?]

  • Новичок
  • *
  • Сообщений: 32

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Формирование GUI теста по txt
« Ответ #5, Отправлен: Май 23, 2019, 13:56:33 »
CreatoR
Подскажите, а если одна из записей в тексте файла txt -  будет выглядеть так:

Код: AutoIt [Выделить]
Вопрос 3
Сколько времени показано на картинке?
Адрес:
C:\папка с картинками\
Ответы:
1 час 50 минут
7 часов 15 минут
12 часов 10 минут
Ни один из ответов
Правильный:
7 часов 15 минут
 


Как разместить на этой форме - под последней кнопкой ответа - уменьшенную копию картинки, лежащей по данному адресу ?


Внимание: Для просмотра прикреплённых файлов необходимо Войти или Зарегистрироваться
« Последнее редактирование: Май 23, 2019, 14:03:17 от SergVrn »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 8082
  • Репутация: 2314
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Формирование GUI теста по txt
« Ответ #6, Отправлен: Май 26, 2019, 00:16:10 »
SergVrn  [?]
Цитировать
если одна из записей в тексте файла txt -  будет выглядеть так
Кто устанавливает структуру этого файла?
Если файл твой, то я показал выше как это делать проще и доступнее.

Вариант №1 для картинки (исходная структура файла - не рекомендуемая)
Код: AutoIt [Выделить]
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $sRead = FileRead(@ScriptDir & '\Тестовые вопросы и ответы.txt')
Global $aData = StringRegExp($sRead, '(?s)(Вопрос \d+\r?\n[^\r\n]+\r?\n(?:Адрес:\r?\n[^\r\n]+\r?\n)?Ответы:\r?\n.*?\r?\nПравильный:\r?\n[^\r\n]+)', 3)
Global $aQuestion_Bttn[10], $iQuestion_Lbl, $iImage_Pic, $sCorret_Answer
Global $iTimer

Global $iCrctAnswr_Sleep = 10 ;Minutes
Global $iInCrctAnswr_Sleep = 1 ;Minutes

Opt('TrayMenuMode', 1)
TraySetState(2)

$hGUI = GUICreate('Questions', 250, 400)

$iStatus_Lbl = GUICtrlCreateLabel('', 20, 370, 210, 30)
GUICtrlSetColor(-1, 0xFF0000)

_Questions_SetRandom()

GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
   
    Switch $nMsg
        Case 0
            ContinueLoop
        Case $GUI_EVENT_CLOSE
            Exit
        Case $aQuestion_Bttn[1] To $aQuestion_Bttn[9]
            If GUICtrlRead($nMsg) = $sCorret_Answer Then
                TraySetState(1)
                GUISetState(@SW_HIDE)
                Sleep(1000 * 60 * $iCrctAnswr_Sleep)
                GUISetState(@SW_SHOW)
                TraySetState(2)
            Else
                $iTimer = TimerInit()
                AdlibRegister('_Status_Timer', 1000)
                _Status_Timer()
               
                _Questions_SetState($GUI_DISABLE)
                Sleep(1000 * 60 * $iInCrctAnswr_Sleep)
                _Questions_SetState($GUI_ENABLE)
               
                AdlibUnRegister('_Status_Timer')
                GUICtrlSetData($iStatus_Lbl, '')
            EndIf
           
            _Questions_SetRandom()
    EndSwitch
WEnd

Func _Status_SetData($sData)
    If GUICtrlRead($iStatus_Lbl) <> $sData Then
        GUICtrlSetData($iStatus_Lbl, $sData)
    EndIf
EndFunc

Func _Status_Timer()
    _Status_SetData('Неверный ответ, до нового вопроса осталось: ' & (($iInCrctAnswr_Sleep * 60) - Round(TimerDiff($iTimer) / 1000)) & ' сек.')
EndFunc

Func _Questions_SetRandom()
    Local Static $fFirst = True
    Local Static $iLast_Random
   
    Local $iRandom
   
    Do
        $iRandom = Random(0, UBound($aData) - 1, 1)
    Until $iRandom <> $iLast_Random
   
    $iLast_Random = $iRandom
   
    Local $sQuestion = StringRegExpReplace($aData[$iRandom], '(?s)Вопрос \d+\r?\n([^\r\n]+).*', '\1')
    Local $aQuestions = StringSplit(StringStripCR(StringRegExpReplace($aData[$iRandom], '(?s).*?Ответы:\r?\n(.*?)\r?\nПравильный:.*', '\1')), @LF)
    Local $aAddress = StringRegExp($aData[$iRandom], '(?s).*?Адрес:\r?\n([^\r\n]+)\r\n?Ответы:.*', 3)
   
    $sCorret_Answer = StringRegExpReplace($aData[$iRandom], '(?s).*?\r?\nПравильный:\r?\n([^\r\n]+)', '\1')
   
    If $fFirst Then
        $fFirst = False
        $iQuestion_Lbl = GUICtrlCreateLabel('', 20, 20, 200, 25)
       
        For $i = 1 To 9
            $aQuestion_Bttn[$i] = GUICtrlCreateButton('', 20, $i * 45, 200, 20)
            GUICtrlSetState($aQuestion_Bttn[$i], $GUI_HIDE)
        Next
       
        $iImage_Pic = GUICtrlCreatePic('', 85, 290, 75, 75)
    EndIf
   
    GUICtrlSetData($iQuestion_Lbl, $sQuestion)
   
    For $i = 1 To 9
        GUICtrlSetData($aQuestion_Bttn[$i], '')
        GUICtrlSetState($aQuestion_Bttn[$i], $GUI_HIDE)
    Next
   
    For $i = 1 To $aQuestions[0]
        GUICtrlSetData($aQuestion_Bttn[$i], $aQuestions[$i])
        GUICtrlSetState($aQuestion_Bttn[$i], $GUI_SHOW)
    Next
   
    If IsArray($aAddress) Then
        GUICtrlSetState($iImage_Pic, $GUI_SHOW)
        GUICtrlSetImage($iImage_Pic, $aAddress[0])
    Else
        GUICtrlSetState($iImage_Pic, $GUI_HIDE)
    EndIf
EndFunc

Func _Questions_SetState($iState)
    For $i = 1 To 9
        If $aQuestion_Bttn[$i] Then
            GUICtrlSetState($aQuestion_Bttn[$i], $iState)
        EndIf
    Next
EndFunc


Вариант №2 для картинки (собственная структура ini-файла)
Код: AutoIt [Выделить]
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $sData_File = @ScriptDir & '\Data.ini'
Global $aQuestion_Bttn[10], $sCorret_Answer, $iTimer
Global $iCrctAnswr_Sleep = 10 ;Minutes
Global $iInCrctAnswr_Sleep = 1 ;Minutes

Opt('TrayMenuMode', 1)
TraySetState(2)

Global $hGUI = GUICreate('Questions', 250, 400)
Global $iStatus_Lbl = GUICtrlCreateLabel('', 20, 370, 210, 30)
GUICtrlSetColor(-1, 0xFF0000)

_Questions_SetRandom()
GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
   
    Switch $nMsg
        Case 0
            ContinueLoop
        Case $GUI_EVENT_CLOSE
            Exit
        Case $aQuestion_Bttn[1] To $aQuestion_Bttn[9]
            If GUICtrlRead($nMsg) = $sCorret_Answer Then
                TraySetState(1)
                GUISetState(@SW_HIDE)
                Sleep(1000 * 60 * $iCrctAnswr_Sleep)
                GUISetState(@SW_SHOW)
                TraySetState(2)
            Else
                $iTimer = TimerInit()
                AdlibRegister('_Status_Timer', 1000)
                _Status_Timer()
               
                _Questions_SetState($GUI_DISABLE)
                Sleep(1000 * 60 * $iInCrctAnswr_Sleep)
                _Questions_SetState($GUI_ENABLE)
               
                AdlibUnRegister('_Status_Timer')
                GUICtrlSetData($iStatus_Lbl, '')
            EndIf
           
            _Questions_SetRandom()
    EndSwitch
WEnd

Func _Status_Timer()
    _Status_SetData('Неверный ответ, до нового вопроса осталось: ' & (($iInCrctAnswr_Sleep * 60) - Round(TimerDiff($iTimer) / 1000)) & ' сек.')
EndFunc

Func _Status_SetData($sData)
    If GUICtrlRead($iStatus_Lbl) <> $sData Then
        GUICtrlSetData($iStatus_Lbl, $sData)
    EndIf
EndFunc

Func _Questions_SetRandom()
    Local Static $fFirst = True
    Local Static $iLast_Random, $iQuestion_Lbl, $iImage_Pic
   
    Local $iRandom
    Local $aSects = IniReadSectionNames($sData_File)
   
    If Not IsArray($aSects) Then
        MsgBox(48, @ScriptName, 'Ошибка чтения вопросов с файла:' & @CRLF & $sData_File, 0, $hGUI)
        Exit
    EndIf
   
    Do
        $iRandom = Random(1, $aSects[0], 1)
    Until $iRandom <> $iLast_Random
   
    $iLast_Random = $iRandom
   
    Local $sQuestion = IniRead($sData_File, $aSects[$iRandom], 'Question', '')
    Local $aAnswers = StringSplit(IniRead($sData_File, $aSects[$iRandom], 'Answers', ''), '|')
    Local $sImage = IniRead($sData_File, $aSects[$iRandom], 'Image', '')
   
    $sCorret_Answer = IniRead($sData_File, $aSects[$iRandom], 'Correct Answer', '')
   
    If $fFirst Then
        $fFirst = False
        $iQuestion_Lbl = GUICtrlCreateLabel('', 20, 20, 200, 25)
        $iImage_Pic = GUICtrlCreatePic('', 85, 290, 75, 75)
       
        Local $iTop = 50
       
        For $i = 1 To 9
            $aQuestion_Bttn[$i] = GUICtrlCreateButton('', 20, $iTop, 200, 20)
            GUICtrlSetState($aQuestion_Bttn[$i], $GUI_HIDE)
           
            $iTop += 25
        Next
    EndIf
   
    GUICtrlSetData($iQuestion_Lbl, $sQuestion)
   
    For $i = 1 To 9
        GUICtrlSetData($aQuestion_Bttn[$i], '')
        GUICtrlSetState($aQuestion_Bttn[$i], $GUI_HIDE)
    Next
   
    For $i = 1 To $aAnswers[0]
        GUICtrlSetData($aQuestion_Bttn[$i], $aAnswers[$i])
        GUICtrlSetState($aQuestion_Bttn[$i], $GUI_SHOW)
    Next
   
    If $sImage Then
        GUICtrlSetState($iImage_Pic, $GUI_SHOW)
        GUICtrlSetImage($iImage_Pic, $sImage)
    Else
        GUICtrlSetState($iImage_Pic, $GUI_HIDE)
    EndIf
EndFunc

Func _Questions_SetState($iState)
    For $i = 1 To 9
        If $aQuestion_Bttn[$i] Then
            GUICtrlSetState($aQuestion_Bttn[$i], $iState)
        EndIf
    Next
EndFunc


Data.ini:
Код: (ini) [Выделить]
  1. [Q1]
  2. Question=Сколько длятся сутки?
  3. Answers=23 часа|20 часов|25 часов|24 часа|Ни один из ответов
  4. Correct Answer=24 часа
  5.  
  6. [Q2]
  7. Question=Сколько минут в часе?
  8. Answers=50 минут|60 минут|40 минут|Ни один из ответов
  9. Correct Answer=60 минут
  10.  
  11. [Q3]
  12. Question=Сколько времени показано на картинке?
  13. Image=C:\Image.jpg
  14. Answers=1 час 50 минут|7 часов 15 минут|12 часов 10 минут|Ни один из ответов
  15. Correct Answer=7 часов 15 минут

Оффлайн SergVrn [?]

  • Новичок
  • *
  • Сообщений: 32

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Формирование GUI теста по txt
« Ответ #7, Отправлен: Май 28, 2019, 13:35:09 »
CreatoR
Спасибо большое.
Первый вариант хорошо работает.
(ini не подходит, поскольку тяжело туда записывать что либо, если ответы - не короткие, а длинные)

Подскажите - а вот ваш скрипт добавляет картинку с жестко заданными размерами 75х75:
(нажмите для показа/скрытия)

А как поменять эту часть кода:
Код: AutoIt [Выделить]
$iImage_Pic = GUICtrlCreatePic('', 85, 290, 75, 75)
 

, чтобы картинка имела размер 75 - лишь только по ширине, а ее длина - изменялась бы в соответствии с имеющимися у нее пропорциями ?
(Потому что сейчас картинка искажается. А если бы размер задавался только по одной стороне, то искажений бы не было.)

Русское сообщество AutoIt

Re: Формирование GUI теста по txt
« Ответ #7 Отправлен: Май 28, 2019, 13:35:09 »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 8082
  • Репутация: 2314
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Формирование GUI теста по txt
« Ответ #8, Отправлен: Май 28, 2019, 17:39:52 »
SergVrn  [?]
Цитировать
если бы размер задавался только по одной стороне, то искажений бы не было
Кто рисует картинки? Я так понимаю что ты, так и рисуй их пропорционально )).
Искажение будет если нет соотношения сторон, не важно по ширине или по высоте.
Тут нужно рисовать изображение другими методами.
« Последнее редактирование: Май 28, 2019, 22:44:31 от CreatoR »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 8082
  • Репутация: 2314
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Формирование GUI теста по txt
« Ответ #9, Отправлен: Май 28, 2019, 22:45:05 »
Можно примеры таких изображений?

Оффлайн SergVrn [?]

  • Новичок
  • *
  • Сообщений: 32

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Формирование GUI теста по txt
« Ответ #10, Отправлен: Май 29, 2019, 13:46:19 »
CreatoR
Я не рисую эти картинки.
Это фотографии.


Добавлено: Май 29, 2019, 14:25:32
CreatoR  [?]
Цитировать
Можно примеры таких изображений?

Вот такой пример:
(Здесь как раз ширина и длина не равны. Поэтому так важно сохранить пропорции)


Внимание: Для просмотра прикреплённых файлов необходимо Войти или Зарегистрироваться
« Последнее редактирование: Май 29, 2019, 18:03:43 от SergVrn »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 8082
  • Репутация: 2314
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Формирование GUI теста по txt
« Ответ #11, Отправлен: Май 30, 2019, 02:03:16 »
SergVrn
Все изображения имеют ширину больше чем высоту?

Оффлайн SergVrn [?]

  • Новичок
  • *
  • Сообщений: 32

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Формирование GUI теста по txt
« Ответ #12, Отправлен: Май 30, 2019, 11:20:34 »
CreatoR 
Цитировать
Все изображения имеют ширину больше чем высоту?

Нет иногда ширина - меньше чем высота.
Вот например на этой фотографии.

Вопрос здесь - как большую сторону картинки - всегда уменьшать до 75 ?
Чтобы картинка - пропорционально становилась меньше.


Внимание: Для просмотра прикреплённых файлов необходимо Войти или Зарегистрироваться
« Последнее редактирование: Май 30, 2019, 11:32:08 от SergVrn »

Оффлайн SergVrn [?]

  • Новичок
  • *
  • Сообщений: 32

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Формирование GUI теста по txt
« Ответ #13, Отправлен: Июнь 04, 2019, 08:38:29 »
Как же решить этот непростой вопрос ?

Оффлайн joiner [?]

  • Расмус-бродяга
  • Локальный модератор
  • *
  • Сообщений: 2959
  • Репутация: 495
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Формирование GUI теста по txt
« Ответ #14, Отправлен: Июнь 04, 2019, 09:45:26 »
SergVrn  [?]
Цитировать
Как же решить этот непростой вопрос ?
искать по форуму. уже давно большинство вопросов решены или есть варианты решения
Изменение размера картинки
но пропорции картинок все равно разные, даже после уменьшения
как вариант, подгонять размер элемента "картинка" под размер изображения. тогда не будет искажений
пример
(нажмите для показа/скрытия)
в этом коде используется Icons.au3 с небольшим редактированием


Внимание: Для просмотра прикреплённых файлов необходимо Войти или Зарегистрироваться
Были времена, когда солнце было ярче, трава зеленее, а водка сорокоградуснее

Русское сообщество AutoIt

Re: Формирование GUI теста по txt
« Ответ #14 Отправлен: Июнь 04, 2019, 09:45:26 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
2 Ответов
3042 Просмотров
Последний ответ Февраль 20, 2012, 09:31:19
от kibermag1
9 Ответов
4974 Просмотров
Последний ответ Март 05, 2012, 13:37:07
от cobra2029
0 Ответов
1277 Просмотров
Последний ответ Март 03, 2012, 14:45:14
от CreatoR
0 Ответов
1493 Просмотров
Последний ответ Октябрь 20, 2012, 22:27:53
от ypor
6 Ответов
2834 Просмотров
Последний ответ Декабрь 02, 2012, 15:31:59
от shift72
5 Ответов
3740 Просмотров
Последний ответ Июнь 18, 2013, 04:05:50
от Andrey_A
10 Ответов
7345 Просмотров
Последний ответ Сентябрь 22, 2013, 21:20:13
от Юрий
0 Ответов
1275 Просмотров
Последний ответ Сентябрь 21, 2013, 09:06:04
от madmasles
11 Ответов
3032 Просмотров
Последний ответ Март 01, 2017, 17:14:01
от inververs
1 Ответов
169 Просмотров
Последний ответ Май 25, 2019, 06:47:03
от joiner