Jump to content

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


Jibberish
 Share

Recommended Posts

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.

Link to comment
Share on other sites

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 2022-02-19 - Version 1.6.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download
Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki
PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki
Task Scheduler (NEW 2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki

Standard UDFs:
Excel - Example Scripts - Wiki
Word - Wiki

Tutorials:
ADO - Wiki
WebDriver - Wiki

 

Link to comment
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
 Share

×
×
  • Create New...