[gelöst]Film abspielen - mein erstes Script

  • Hi,
    bin total neu in AutoIT (2 Wochen ab und zu damit "experimentieren").
    Hier ist mein erstes "richtiges" Script von mir, kann sich das jemand bitte anschauen und mir evtl. sagen was ich besser machen kann oder was von mir total falsch gelöst wurde ;)

    Neben dem Script gibt es einen Ordner "Extra"
    In ihm sind die Unterordner "Film" und "VLC"
    In "Film" sind die 4 Filme die durch drücken der Buttons gestartet werden sollen
    In "VLC" ist der Protable VLC-Player mit dem die Filme abgespielt werden

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    ;Hier das GUI - erstellt mit Koda (echt genial :))

    [/autoit] [autoit][/autoit] [autoit]

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

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### START Koda GUI section ### Form=C:\Dokumente und Einstellungen\cwedv23\Desktop\Image Film Projekt\Imagefilm - Extern.kxf
    $Form1_1_1 = GUICreate("Winkler Imagefilm", 339, 261, 253, 128)
    $Label1 = GUICtrlCreateLabel(" Welche Version soll abgespielt werden?", 0, 8, 327, 24)
    GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif")
    $Label2 = GUICtrlCreateLabel("Imagefilme in HD und Ton", 8, 48, 158, 20)
    GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
    $ButtonV1 = GUICtrlCreateButton("Abspielen", 208, 48, 107, 25, 0)
    $Label3 = GUICtrlCreateLabel("Imagefilm in HD ohne Ton", 8, 80, 158, 20)
    GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
    $ButtonV2 = GUICtrlCreateButton("Abspielen", 208, 80, 107, 25, 0)
    $Label4 = GUICtrlCreateLabel("Imagefilm in XY mit Ton", 8, 112, 142, 20)
    GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
    $ButtonV3 = GUICtrlCreateButton("Abspielen", 208, 112, 107, 25, 0)
    $Label5 = GUICtrlCreateLabel("Imagefilm in XY ohne Ton", 8, 144, 155, 20)
    GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
    $ButtonV4 = GUICtrlCreateButton("Abspielen", 208, 144, 107, 25, 0)
    $ButtonBeenden = GUICtrlCreateButton("Beenden", 104, 216, 123, 33, 0)
    $Label6 = GUICtrlCreateLabel("Das Fenster 'Privatsphären- und Netzwerkzugriff-Regel'", 8, 176, 264, 17)
    GUICtrlSetFont(-1, 9, 400, 0, "MS Sans Serif")
    $Label7 = GUICtrlCreateLabel("kann bedenkenlos mit 'Sichern und fortsetzen' bestätigt werden.", 8, 192, 305, 17)
    GUICtrlSetFont(-1, 9, 400, 0, "MS Sans Serif")
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    [/autoit] [autoit][/autoit] [autoit]

    $Film1 = "./Extra/Film/Test1.flv" ;Hier hab ich den Pfad zu den Filmen
    $Film2 = "./Extra/Film/Test2.mov"
    $Film3 = "./Extra/Film/Test3.wmv"
    $Film4 = "./Extra/Film/Test4.wmv"

    [/autoit] [autoit][/autoit] [autoit]

    $VLC = "./Extra/VLC/vlc.exe" ;Hier habe ich den VLC Portable

    [/autoit] [autoit][/autoit] [autoit]

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

    [/autoit] [autoit][/autoit] [autoit]

    Case $ButtonBeenden
    Exit

    Case $ButtonV1
    ShellExecute($VLC, $Film1) ;Führt den Film 1 aus
    WinWaitActive("./Extra/Film/") ;Wartet bis der Film läuft
    WinSetState($Film1, "", @SW_MAXIMIZE) ;Maximiert den Film
    WinSetOnTop($Film1, "", 1) ;Setzt den Film in den Vordergrund - hängte sich immer total auf wenn ein anderes Fenster in den Vordergrund gestellt wurde

    Sleep (1000)
    WinWait("VLC media player") ;Damit kill ich den VLC sobald der Film vorbei ist
    ProcessClose("vlc.exe")

    Case $ButtonV2
    ShellExecute($VLC, $Film2)
    WinWaitActive("./Extra/Film/")
    WinSetState($Film2, "", @SW_MAXIMIZE)
    WinSetOnTop($Film2, "", 1)

    Sleep (1000)
    WinWait("VLC media player")
    ProcessClose("vlc.exe")

    Case $ButtonV3
    ShellExecute($VLC, $Film3)
    WinWaitActive("./Extra/Film/")
    WinSetState($Film3, "", @SW_MAXIMIZE)
    WinSetOnTop($Film3, "", 1)

    Sleep (1000)
    WinWait("VLC media player")
    ProcessClose("vlc.exe")

    Case $ButtonV4
    ShellExecute($VLC, $Film4)
    WinWaitActive("./Extra/Film/")
    WinSetState($Film4, "", @SW_MAXIMIZE)
    WinSetOnTop($Film4, "", 1)

    Sleep (1000)
    WinWait("VLC media player")
    ProcessClose("vlc.exe")

    [/autoit] [autoit][/autoit] [autoit]

    EndSwitch
    WEnd

    [/autoit]

    Vielen Dank
    Fabian

    #Edit: *Spoiler*

    3 Mal editiert, zuletzt von Grapefruit (3. August 2012 um 16:38)

  • Für 2 Wochen Autoit ist dein Script schon bombig! :thumbup: Naja vielleicht sehen das manche anders aber zumindest ich habe nach 2 Wochen noch keine 89-Zeiler, die auch funktionieren geschrieben... ^^ Was mir aber trotzdem gleich aufgefallen ist ist folgendes: Da du in deinem Script 4 Buttons hast, die eigentlich genau die gleiche Funktion haben kannst du mit Hilfe von Arrays und eigenen Funktionen dein Script noch eleganter lösen... Hier mal ein alternativer Aufbau mit Funktionen und Arrays:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    Global $Button[4], $Filme[4] = ['./Extra/Film/Test1.flv', './Extra/Film/Test2.mov', './Extra/Film/Test3.wmv', './Extra/Film/Test4.wmv'], $VLC = './Extra/VLC/vlc.exe'
    $Form1 = GUICreate("Winkler Imagefilm", 339, 261, 253, 128)
    $Label1 = GUICtrlCreateLabel(" Welche Version soll abgespielt werden?", 0, 8, 327, 24)
    GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif")
    $Label2 = GUICtrlCreateLabel("Imagefilme in HD und Ton", 8, 48, 158, 20)
    GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
    $Button[0] = GUICtrlCreateButton("Abspielen", 208, 48, 107, 25, 0)
    $Label3 = GUICtrlCreateLabel("Imagefilm in HD ohne Ton", 8, 80, 158, 20)
    GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
    $Button[1] = GUICtrlCreateButton("Abspielen", 208, 80, 107, 25, 0)
    $Label4 = GUICtrlCreateLabel("Imagefilm in XY mit Ton", 8, 112, 142, 20)
    GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
    $Button[2] = GUICtrlCreateButton("Abspielen", 208, 112, 107, 25, 0)
    $Label5 = GUICtrlCreateLabel("Imagefilm in XY ohne Ton", 8, 144, 155, 20)
    GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
    $Button[3] = GUICtrlCreateButton("Abspielen", 208, 144, 107, 25, 0)
    $ButtonBeenden = GUICtrlCreateButton("Beenden", 104, 216, 123, 33, 0)
    $Label6 = GUICtrlCreateLabel("Das Fenster 'Privatsphären- und Netzwerkzugriff-Regel'", 8, 176, 264, 17)
    GUICtrlSetFont(-1, 9, 400, 0, "MS Sans Serif")
    $Label7 = GUICtrlCreateLabel("kann bedenkenlos mit 'Sichern und fortsetzen' bestätigt werden.", 8, 192, 305, 17)
    GUICtrlSetFont(-1, 9, 400, 0, "MS Sans Serif")
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $GuiMsg = GUIGetMsg()
    For $i = 0 To 3
    If $GuiMsg = $Button[$i] Then _Play($i)
    Next
    If $GuiMsg = $GUI_EVENT_CLOSE Or $GuiMsg = $ButtonBeenden Then Exit
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _Play($Number)
    $Execute = ShellExecute($VLC, $Filme[$Number], '', 'open', @SW_MAXIMIZE)
    If $Execute <> 1 Then
    MsgBox(16, 'Fehler', 'Fehler beim abspielen!', 5)
    Else
    WinSetOnTop($Filme[$Number], "", 1)
    WinWait("VLC media player")
    ProcessClose("vlc.exe")
    EndIf
    EndFunc ;==>_Play

    [/autoit]

    Da ich nicht die gleichen Verzeichnisse wie du habe, ist es noch ungetestet... Wie oben schon erwähnt, könntest du dich als nächstes mal mit Arrays und eigenen Funktionen auseinander setzten. ;)

    LG
    Christoph :)

  • Jep, da kann ich Cristoph54 nur zustimmen, für 2 Wochen AutoIt wirklich toll! Jetzt gleich mit Arrays zu arbeiten halte ich aber nach 2 Wochen allerdings für ein wenig übertrieben. Du könntest aber einen Button einbauen, mit dem man die Filmdateien aus dem Programm heraus auswählen kann. Die Auswahl kannst du dann in einer INI-Datei speichern (iniwrite) und beim Programmstart auslesen (iniread). Nur so als Vorschlag.

  • Man könnte auch die Dateinamen aus dem Filmordner in ein Array lesen und daraus die Buttons erzeugen etc.
    Damit wird das Programm universell, da gibts dann nichts mehr anzupassen.
    Je weniger Code wiederholt wird, desto eleganter ist das Programm. 8)

    Wer andern eine Bratwurst brät
    der hat ein Bratwurstbratgerät.

  • Schliesse mich den Vorrednern an, für 2 Wochen AutoIt TOP!

    2 Tipps von meiner Seite:

    1) Variablen immer einen eindeutigen Namen geben (nicht Label1, Label2, etc.)

    2) Das Programmwird von Buttons gesteuert, da stellt sich die Frage ob es Sinnvoller wäre die GUI in OnEventMode zu entwickeln

    [autoit]

    Opt("GUIOnEventMode", 1)

    [/autoit]

    Gruß Protaris

  • @All: Danke ^^ Es macht gleich doppelt Spaß wenn man Lob bekommt :)

    @Christoph54: Vielen Dank! Ich schaue mir dein Skript heute noch an und schau das ich es verstehe :)
    #Edit: Habs verstanden, musste allerdings noch ein

    [autoit]

    Sleep (1000)

    [/autoit]

    vor

    [autoit]

    WinWait("VLC media player")
    ProcessClose("vlc.exe")

    [/autoit]


    einbauen, da sich sonst der VLC Player direkt wieder schließt, er soll sich aber erst schließen wenn der Film zueende ist.
    (Film läuft -> Fenster Titel: Film XY - VLC media player, Film vorbei -> Fenster Titel: VLC media player)

    @Cheater Dieter: Klingt interessant, sind dann in der .ini die Informationen wie Fenstergröße etc?

    @ohforf: Danke für die Anregung, aber da ich befürchte bis ich das hin bekomme sitze ich noch einmal 2 Wochen ^^

    @Protaris: Ich schaue es mir mal an, danke :)

    3 Mal editiert, zuletzt von Grapefruit (10. Juli 2012 um 16:38)

    • Offizieller Beitrag

    Schau dir mal dan 3. Parameter von WinWait an, das erspart dir das Sleep. ;)

  • Schau dir mal dan 3. Parameter von WinWait an, das erspart dir das Sleep. ;)

    So weit ich das verstanden habe kann man als Parameter nur einen Timout einbauen.
    Das brauch ich aber nicht! ich will nur nicht, dass das WinWait bzw. der ProcessClose direkt greift
    Also der Ablauf soll/muss so aussehen:

    -> VLC wird geöffnet (Fenstername: VLC media player)
    (Hier greift WinWait & ProcessClose bereits wenn nicht der Sleep drin ist!)
    -> Film wird gestartet (Fenstername: Film XY - VLC media player)
    -> Film ist zuende (Fenstername: VLC media player)
    -> WinWait & ProcessClose greifen und beenden den VLC media player

    Sollte ich falsch liegen, verbessert mich bitte :) Das alles weiß ich nicht(!) ich habe es durch Anleitungen/Experimentieren/HowTo's so verstanden...
    (Wobei ich mich auf letzteres sowieso nur max. 10 min konzentrieren konnte, bevor ich wieder "rumprobieren" wollte ^^ )

    • Offizieller Beitrag

    Warum benutzt du eigentlich nicht WInWaitClose?

  • Warum benutzt du eigentlich nicht WInWaitClose?

    Schliest WinWaitClose ein Fenser, oder (so habe ich es verstanden) pausiert es das Skript, bis sich das Fenster (durch was auch immer) geschlossen hat?

    • Offizieller Beitrag

    Hab dein Post nich ganz gelesen. Du willst ja das Fenster schließen, wenn der Titel VLC Mediaplayer ist. 8|
    Vergiss was ich geschrieben habe, man sollte alles lesen. :D

  • Total überflüssige includes:

    ButtonConstants.au3
    StaticConstants.au3
    WindowsConstants.au3

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • OK, ty....was die includes sind kapiere ich sowieso noch gar nicht (bzw. hab ich mir noch nie wirklich angeschaut..) ^^
    Kann mir jemand sagen wo ich etwas zu den includes finde (was/wie/warum etc... )& wenn möglich (aber nicht zwingend nötig) in Deutsch...

  • Gelöst!
    Danke für die Anregungen & vorallem Christoph54, dass er mir 'nen komplett neuen Weg gezeigt hat ^^