Jibberish

Automatic creation of GUI Radio Buttons based on input from a file

3 posts in this topic

#1 ·  Posted

Hi,

I am automating the testing of a video player. I search a file for ".mp4" and want to create a GUI with radio buttons to select what video to play. The number of videos can change based on the user's library so this must be created automatically.  I have searched for how to accomplish this and there are several posts out there that help a little but I can't figure out the solution. I pulled the offending code from my main script and created the file below to make this easier to read. I am sure one of our experts here can help!

#include <MsgBoxConstants.au3>
#include <StringConstants.au3>
#include <array.au3>
#include <File.au3>
#include <GUIConstantsEx.au3>


Local $sMediaFile = "D:\MediaFiles\MediaFiles.txt"
Local $iStrReturn = 0
Local $aText
Local $aArrayFile
Local $iMax = 6 ;Default number of Videos - 1 for the array counter
Local $aVideoName[$iMax] = [0]
Local $sCheckBox1
Local $iT = 0, $iVideoCount = 0, $iCount
Local $ix = 0
Local $iy = 0
Local $idClose1
Const $iL = 10  ; Count from Left for GUI so all buttons line up

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;
;   Read a list of video file names and create a GUI with Radio Buttons to select a single video.
;   Problem: We don't know how many video names will be in the text file, so we can't hard code Case Statements & their variables

; Put the Video File Names into an Array
_FileReadToArray($sMediaFile, $aArrayFile)
For $a = 1 To $aArrayFile[0]    ; Step through the array looking for .mp4
    If StringInStr($aArrayFile[$a], ".mp4") Then
        $iVideoCount = $iVideoCount + 1
        $aText = StringSplit($aArrayFile[$a],"\\")  ; This video player reads double backslashes
        For $a1 = 1 to $aText[0]
        ; Check that the array is big enough
            If StringInStr($aText[$a1], ".mp4") Then
                ;MsgBox(0,"","Video is " & $aText[$a1])
                If UBound($aVideoName) = $iVideoCount Then
                    ; Resize the array when $iCount is equal to the element count in the array to prevent subscript error
                    ReDim $aVideoName[$aVideoName[0] + $iMax]
                EndIf

                $aVideoName[$iVideoCount] = $aText[$a1]; add data to new index element

                $aVideoName[0] = $a1 ; update the index count for future reference

                ;   The idea is to create a GUI width to accommodate long video file names
                $it = StringLen($aVideoName[$iVideoCount])
                If $iT > $ix Then
                    $ix = $iT
                EndIf
            EndIf
        Next
    EndIf
Next
; Move backwards through the array deleting blank rows
For $iCount = UBound($aVideoName) - 1 To 0 Step -1
    If $aVideoName[$iCount] = "" Then
        _ArrayDelete($aVideoName, $iCount)
    EndIf
Next
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;
;   Create the GUI - Names and Radio Button counts will vary - How do I do this?
;
;_ArrayDisplay($aVideoName)
;Local $aVarName[$aVideoName[0]]
Local $iRows = UBound($aVideoName, $UBOUND_ROWS)
$iRows = $iRows -1
$aVideoName[0] = $iRows
; Prep the GUI to display the FileNames with Radio Buttons - Can only select one at a time.
$a = 0
$ix = $ix + 200
$iy = ($aVideoName[0] * 30) + 60
$hGUI = GUICreate("Videos", $ix, $iy)
;$iT = $iT+30

;   Create the variable names for the Case statement - Video count may change so Video Names displayed and GUICtrlCreateRadio count may change.

;~ For $a = 1 to $aVarName[0]
;~  If UBound($aVarName) = $aVarName Then
;~      ; Resize the array when $iCount is equal to the element count in the array to prevent subscript error
;~      ReDim $aVarName[$aVarName[0] + $iMax]
;~  EndIf

;~  Assign("$bVideoName" & $a, $a)
;~  Local $aVarName[$a] = Eval($bVideoName[$a])
;~ ;    $aVarName[$a] = GUICtrlCreateRadio($aVarName[$a], $iL, $iT)
;~ Next
$iCount = 1
;MsgBox(0,"","VideoName[0] is "&$aVideoName[0])
;_ArrayDisplay($aVideoName)
Local $bVideoName1
If $iCount < $aVideoName[0] Then
    $bVideoName1 = GUICtrlCreateRadio($aVideoName[$iCount], $iL, $iT)
    GUICtrlSetState($bVideoName1, $GUI_CHECKED)
    $iT = $iT+30
EndIf
$iCount = $iCount + 1
If $iCount <= ($aVideoName[0]) Then
    Local $bVideoName2 = GUICtrlCreateRadio($aVideoName[$iCount],$iL,$iT)
    $iT = $iT+30
EndIf
$iCount = $iCount + 1
If $iCount <= ($aVideoName[0]) Then
    Local $bVideoName3 = GUICtrlCreateRadio($aVideoName[$iCount],$iL,$iT)
    $iT = $iT+30
EndIf
$iCount = $iCount + 1
If $iCount <= ($aVideoName[0]) Then
    Local $bVideoName4 = GUICtrlCreateRadio($aVideoName[$iCount],$iL,$iT)
    $iT = $iT+30
EndIf
$iCount = $iCount + 1
If $iCount <= ($aVideoName[0] -1) Then
    Local $bVideoName5 = GUICtrlCreateRadio($aVideoName[$iCount],$iL,$iT)
    $iT = $iT+30
EndIf
$iCount = $iCount + 1
If $iCount <= ($aVideoName[0] -1) Then
    Local $bVideoName6 = GUICtrlCreateRadio($aVideoName[$iCount],$iL,$iT)
    $iT = $iT+30
EndIf
$iCount = $iCount + 1
If $iCount <= ($aVideoName[0] -1) Then
    Local $bVideoName7 = GUICtrlCreateRadio($aVideoName[$iCount],$iL,$iT)
    $iT = $iT+30
EndIf

$iT = $iT + 30
$idClose1 = GUICtrlCreateButton("Go!", $iL, $iT)
GUISetState(@SW_SHOW)

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;
;   Switch Statement
;
;Local $nMsg = ""
While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit

        Case $bVideoName1

        Case $bVideoName2

        Case $bVideoName3

        Case $bVideoName4

        Case $bVideoName5

        ;Case $bVideoName6 <- Fails because there are only 5 videos - Need variable $bVideoNames

        ;Case $bVideoName7 <- Fails because there are only 5 videos

        Case $idClose1
            $bVideoName1 = GUICtrlRead($bVideoName1)
            $bVideoName2 = GUICtrlRead($bVideoName2)
            $bVideoName3 = GUICtrlRead($bVideoName3)
            $bVideoName4 = GUICtrlRead($bVideoName4)
            $bVideoName5 = GUICtrlRead($bVideoName5)
            ;$bVideoName6 = GUICtrlRead($bVideoName6)
            ;$bVideoName7 = GUICtrlRead($bVideoName7)
        ExitLoop
    EndSwitch
WEnd
GUIDelete($nMsg)
MsgBox(0,"","Case " & $nMsg & " was selected.") ;   Always returns 8. ???

This is the "MediaFiles.txt" file I am reading:

D:\\MediaFiles\\BigBuckBunny.mp4
D:\\MediaFiles\\BigBuckBunny60fps.mp4
D:\\MediaFiles\\Sintel.mp4
D:\\MediaFiles\\sintel-2048-surround.mp4
D:\\MediaFiles\\TearsOfSteel.mp4
D:\\MediaFiles\\tearsofsteel_4K.mp4

I'm sure I have several mistakes (or poor coding methods) in my AutoIt file.

Share this post


Link to post
Share on other sites



#2 ·  Posted

This subject has been discussed lately. I have posted some example code in the following thread.

 


My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2017-04-18 - Version 1.4.8.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2017-02-27 - Version 1.3.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites

#3 ·  Posted

Thanks Water. I am reviewing your code to try to understand it!

Of course I am reading a .json file and not a .ini file so I will have to replace the IniReadSection lines...

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now

  • Similar Content

    • anusha
      By anusha
      Hi I have jus started using auto-it . Please correct me if I'm wrong.
      I need to read data from an input in text box and search in excel file and return value in next column of matched cell on GUI.
      I have written below code but i cannot use variable which has data stored. it works only when search string is hard coded.
      Please help out.
       
      Example()
      Func Example()
      Local $GuiMain = GUICreate("EXCEL TEST", 399, 180) ;creates main GUI
      ;~ Local $idOK = GUISetOnEvent($GUI_EVENT_CLOSE, "Close")
      Local $iWidthCell = 70
      Local $idLabel = GUICtrlCreateLabel("PART NUMBER", 10, 30, $iWidthCell,50)
      Local $RUN_1 = GUICtrlCreateButton("OK", 70, 70, 85, 25)
      Local $Input_1 = GUICtrlCreateInput("PART NUMBER", 100, 20, 120, 20)
      Local $sMenutext = GUICtrlRead($Input_1, 1)
      GUISetState(@SW_SHOW, $GuiMain)

          While 1
          $MSG = GUIGetMsg()
          Select
              Case $MSG = $GUI_EVENT_CLOSE
                  Exit
              Case $MSG = $RUN_1
                  Local $oAppl = _Excel_Open()

      Local $sFilePath1 = "D:\Anu_WorkFolder\Components.xlsx"
      Local $oWorkbook = _Excel_BookOpen($oAppl, $sFilePath1, Default, Default, True)
      Local $aResult = _Excel_RangeFind($oWorkbook, $sMenutext , Default, Default, $xlWhole)
    • Miliardsto
      By Miliardsto
      Hello.
      Drag option works only on parent window but as we can see on the parent gui is showed up child gui (on the right side with the color).
      Desired action is when we want to drag whole program we can also drag child gui and child gui will drag with parent gui.
      How to do this?
       
      #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <Array.au3> GUIRegisterMsg($WM_NCHITTEST, "_NCHITTEST") $hGUI = GUICreate("Test", 500, 500, -1, -1) $cButton_0 = GUICtrlCreateButton("Child 0", 10, 10, 80, 30) $cButton_1 = GUICtrlCreateButton("Child 1", 10, 50, 80, 30) $cButton_2 = GUICtrlCreateButton("Child 2", 10, 90, 80, 30) GUISetState(@SW_SHOW, $hGUI) ; guis Global $hChild_[3] Global $countGUI = UBound($hChild_) - 1 ;MsgBox("","",$countGUI) ; licznik dla GUI Global $gui = 0 $hChild_[0] = GUICreate("Child 0", 350, 300, 150, 0, $WS_POPUP, $WS_EX_MDICHILD, $hGUI) GUISetBkColor(0xFF0000) GUISetState(@SW_SHOW, $hChild_[0]) $hChild_[1] = GUICreate("Child 1", 350, 300, 150, 0, $WS_POPUP, $WS_EX_MDICHILD, $hGUI) GUISetBkColor(0x00FF00) GUISetState(@SW_HIDE, $hChild_[1]) $hChild_[2] = GUICreate("Child 2", 350, 300, 150, 0, $WS_POPUP, $WS_EX_MDICHILD, $hGUI) GUISetBkColor(0x0000FF) GUISetState(@SW_HIDE, $hChild_[2]) While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE Exit Case $cButton_0 _All_Hide() GUISetState(@SW_SHOW, $hChild_[0]) $gui = 0 Case $cButton_1 _All_Hide() GUISetState(@SW_SHOW, $hChild_[1]) $gui = 1 Case $cButton_2 _All_Hide() GUISetState(@SW_SHOW, $hChild_[2]) $gui = 2 EndSwitch WEnd Func _All_Hide() GUISetState(@SW_HIDE, $hChild_[0]) GUISetState(@SW_HIDE, $hChild_[1]) GUISetState(@SW_HIDE, $hChild_[2]) EndFunc Func _NCHITTEST($hWnd, $uMsg, $wParam, $lParam) If $hWnd = $hGUI Then Local $aPos = WinGetPos($hWnd) If Abs(BitAND(BitShift($lParam, 16),0xFFFF)- $aPos[1]) < 500 Then Return $HTCAPTION EndIf Return $GUI_RUNDEFMSG EndFunc  
    • IAMK
      By IAMK
      Hello,
       
      I have a script which uses a GUI with two buttons. It gets shown and hidden., and pressing the buttons (including their hotkeys) highlights the button, making you able to press enter the next time.
      However, I don't want that.
       
      I've tried using WinActivate() to make enter do things on another program, but the enter is still tied to the AutoIT GUI (which still has the button highlighted).
       
      Here's the important part of my code:
      $MY_GUI = GUICreate("Check.exe", 400, 300, ((@DesktopWidth / 2) - 200), -500) WinSetOnTop($MY_GUI, "", 1) ;Keeps the window on the top. $Button1 = GUICtrlCreateButton("Pass (Ctrl+P)", 40, 250, 120, 40, $WS_GROUP) GUICtrlSetFont(-1, 12, 400, 0, "MS Sans Serif") $Button2 = GUICtrlCreateButton("Fail (Ctrl+F)", 240, 250, 120, 40, $WS_GROUP) GUICtrlSetFont(-1, 12, 400, 0, "MS Sans Serif") $GUIText = GUICtrlCreateLabel("", 20, 10, 360, 230) GUICtrlSetFont(-1, 13, 400, 0, "MS Sans Serif") GUICtrlSetData($GUIText, Execute($stepMessage[$step])) $showGUI = "True" GUISetState(@SW_SHOW) While($showGUI = "True") $buttonPressed = GUIGetMsg() Switch $buttonPressed Case $Button1 ;Pass $pass = "True" $buttonPressed = 0 $showGUI = "False" GUISetState(@SW_HIDE) Case $Button2 ;Fail $buttonPressed = 0 $showGUI = "False" GUISetState(@SW_HIDE) While($message = "") $message = InputBox("Check.exe", "Please enter the reason the step failed." & @CRLF, "", "", 300, 200, ((@DesktopWidth / 2) - 150), -400) WEnd Return $message EndSwitch WEnd Local $pass = "False" ;Whether "Pass" or "Fail" was pressed. Local $failLog = xxxfunc($pass) ;Returns a message to log if the step failed. ##THIS CALLS THE CODE SNIPPET ABOVE## FileWrite($file, _Now() & ": Step " & $step & getStatus($pass) & "and took " & Ceiling(TimerDiff($timer) / 1000) & " seconds." & @CRLF) If($failLog <> "") Then FileWrite($file, "Logged comment: " & $failLog & @CRLF) EndIf WinActivate("[TITLE:ProgramName]") ;Hotkeys: HotKeySet("^{p}", "pressPass") HotKeySet("^{f}", "pressFail") Func pressPass() $buttonPressed = $Button1 EndFunc Func pressFail() $buttonPressed = $Button2 EndFunc  
      The GUI's button/hotkey pressing works correctly.
      The same WinActivate code works in another script of mine.
      Together, WinActivate is not take "Active" away from the GUI's last-pressed button. How do I fix this?
       
      Thank you in advance.
    • fatpig
      By fatpig
      Dear AutoIT Community.
      I am currently working on a program that will display lots of images in a scroll down GUI.
      I create the GUI based on the number of images, which works fine.
      But all images I place using GuiCtrlCreatePic above a threshold of around 32000 pixels (cant say exactly) are placed at negative locations and finally will reach 0 again
      and will then populate on top of the images placed there before.
      For $i = 1 To $Images[0] ; Get picture dimensions $hImage = _GDIPlus_ImageLoadFromFile($ImgRep & $Images[$i]) $iX = _GDIPlus_ImageGetWidth($hImage) $iY = _GDIPlus_ImageGetHeight($hImage) _GDIPlus_ImageDispose($hImage) ; Resize & place images in GUI $Pic[$i] = GUICtrlCreatePic($ImgRep & $Images[$i], $Spacer, Round($yPos, 0), $MaxImgWidth, $MaxImgWidth * ($iY / $iX)) $yPos = $yPos + $MaxImgWidth * ($iY / $iX) + $Spacer $log = $log & "|" & $yPos $currentlut = $Images[1] Next I have found a limit at 32767 pixels for some GUI elements when googling around.
      Can someone tell me how to circumvent that?
      thanks!
      cheers
      Felix
    • Shirdish_chakravarthi
      By Shirdish_chakravarthi
      Hello Guys this is my gui and i need the numeric value typed in the highlighted  inputbox. if this value is greater than 1 i need to perform some operations
      \
       
      Here is the summary about that field which i got from wininfo tool

      i tried writing the code as shown below.. but the msgbox is popping up empty value..when the same code is pasted under some button action i am able to access the value present in the field..but when placed alone as written in the attached script i am unable to fetch it... 

      here i am using the valu present in the field

      can you guys tell me what's wrong??? or how can i get that value?
       
      My_GUI.au3