4 Finger Swipe Kalender Ansicht wechseln (mit BTT)

K

Kater Louis

Mitglied
Thread Starter
Dabei seit
17.10.2010
Beiträge
94
Reaktionspunkte
1
Hey Leute,

möchte mich jetzt mit neuem MBP von 10.6 auf 10.9 endlich mit Automator / AppleScript auseinander setzen. Ich lerne am besten an konkreten Beispielen und hoffe mein Wunsch ist für erfahrene Hasen so einfach zu bewältigen, dass mir kurz auf die Sprünge geholfen wird bevor ich beim Suchen danach wieder die Lust verliere.

Zum Wunsch:
Ich mache mit BetterTouchTool nahezu überall wo Tabs sind mit 4 Finger Swipe (links / rechts) den Tab-Switch. Im Kalender würde ich es jetzt geil finden mit den Gesten zwischen Tag, Woche, Monat und Jahr zu wechseln. Mit Automator glaube ich nicht wirklich machbar. AppleScript aber kann das doch sicher.

Wie setzt man das jetzt am besten um um über BetterTouchTool mit der Geste auf die Aktion zuzugreifen?



Würde mich sehr um Hilfe freuen :)
Danke!




Eschi
 
du definierst einfach die Geste für Kalender und wählst als Aktion "Open Application / File / Apple Script..."
 
du definierst einfach die Geste für Kalender und wählst als Aktion "Open Application / File / Apple Script..."

Ok, und dann ein Script, das nach rechts wechselt und ein Script, das nach links wechselt. Jetzt fehlen nur noch die Scripts!
Mir fehlt leider total das Wissen wie man diese Zustände anspricht, wie ausliest wo man ist um den nächsten anzusprechen und und und-

Aber vielen Dank schon einmal für die Antwort!
 
Hallo,

das ist wesentlich schwieriger, als du dir das eventuell vorstellst.
Öffne doch mal den AppleScript Editor und dort das Fenster "Bibliothek".
Klicke auf "Kalender" (oder füge erst "Kalender" hinzu, falls noch nicht gelistet)
Dann suche die möglichen Parameter. Ich kürze das mal ab: switch view

Du wirst sehen, es gibt weder ein Befehl für die Jahresansicht, noch "nach links/rechts wechseln". Und die aktuelle Ansicht auslesen geht auch nicht.
Also müsste man über Umwege gehen: Und zwar Ui Scripting. Und auch da nur mit Abstrichen.

Ist die Frage, ob sich das lohnt, da man die Aktuelle Ansicht ja jederzeit mit einem Tastaturkürzel ändern kann.
Auch das wäre in BTT einzustellen:
Select Application : Calendar
Gesture 4 Finger Swipe Left
Custom Keyboard Shortcut: cmd 1

usw


So. Ich stelle dir mal ein AppleScript mit Zugriff auf Hilfsfunktionen ein, welches "nach rechts" wechselt. Versuche mal als ersten Gehversuch, ein weiteres zu erstellen, welches "nach links" wechselt ...

property x : 1
tell application "System Events"
tell process "Calendar"
get UI elements of window 1
click radio button x of radio group 1 of group 1 of toolbar 1 of window "Kalender"
end tell
set x to x + 1
if x > 4 then set x to 1
end tell
 
Viiiielen Dank für diese detaillierte Antwort. Und vor allem dem ersten Versuch, der schon genauso funktioniert wie ich das gerne hätte! Sogar mit Loop-
Und da wir zwei verschiedene Gesten haben können wir doch einfach 2 Scripts machen mit kleinsten Änderungen an nach dem ersten "end tell" um rückwärts zu gehen.

Das einzige was jetzt noch fehlt ist das Auslesen wo ich gerade bin. Aber das verkrafte ich glaube ich sehr gut, weil mir das Beispiel einen super Einstieg in AppleScript gibt.


Problem ist jetzt aber, dass ich aus dem AS-Editor ausführen kann und es klappt nach rechts wunderbar. Gespeichert mit BTT drauf zugegriffen funktioniert nur einmal von TAG zu WOCHE, was einleuchtet, da X ja bei jedem Aufruf erneut auf 1 gesetzt wird, was entweder ein neues Speichern oder eine Art "Permanent-Variable" erfordert oder eben doch eine Möglichkeit auszulesen wo man ist.

Man kann folgendes zwar easy googlen, aber ich rede eben gern mit Leuten und höre gern Erfahrungen und Empfehlungen, daher speziell an dich varuna jetzt die Frage wo du nachschlägst um die Befehle zu bekommen; auf get "UI elements of window 1" wäre ich wohl nicht so ohne weiteres gekommen.



Daaanke, wirklich :)



Eschi
 
Hallo,

das hast du ja schnell erfasst :) ...

Du hast vollkommen recht und ehrlich gesagt habe ich einfach nicht aufgepasst und weitergedacht :d
Ok! Das ist jetzt etwas tricky:
Ist eine property mit "" definiert, so wird immer der letzte Wert ins Skript geschrieben:


property x : ""


if x is "" then set x to 1
tell application "System Events"
tell process "Calendar"
get UI elements of window 1
click radio button x of radio group 1 of group 1 of toolbar 1 of window "Kalender"
end tell
set x to x + 1
if x > 4 then set x to 1
end tell



So, und jetzt füge das nicht als Open AppleScript Action in BTT hinzu, sondern wähle die Aktion Execute Terminal Command.
In das sich öffnende Fenster tippst du folgendes ein:
usr/bin/osascript
dann ein Leerzeichen
jetzt noch den Pfad zum Skript. Ziehe das Skript vom Finder einfach in das geöffnete BTT Fenster.
Das sieht dann z.B. so aus
Code:
usr/bin/osascript /Users/eschi/Library/Scripts/iCal_swipe.scpt
Speichern.

Die letztere Aktion dient nur dazu, dass AppleScripts wie gewollt in BTT ausgeführt werden.

Und ja: zwei Gesten, zwei Skripts.

Gruß
 
Hallo,

ich habe gerade noch mal überlegt. Mir fällt kein Weg ein, den Status auszulesen ... ausser über ein weiteres UI-Script ...
Zusammen würde das dann so aussehen:

Code:
[FONT=Verdana][B]tell[/B] [COLOR=#0433ff][I]application[/I][/COLOR] "System Events"[/FONT]
[FONT=Verdana]    [B]tell[/B] [COLOR=#0433ff][I]process[/I][/COLOR] "Calendar"[/FONT]
[COLOR=#5E6161][FONT=Verdana][COLOR=#000000]        [/COLOR]-- attribute auslesen:[/FONT][/COLOR]
[COLOR=#5E6161][FONT=Verdana][COLOR=#000000]        [/COLOR]--set xxx to attributes of menu item 2 of menu 1 of menu bar item "Darstellung" of menu bar 1[/FONT][/COLOR]
[FONT=Verdana]        [/FONT]
[FONT=Verdana]        [B]try[/B][/FONT]
[FONT=Verdana]            [B]set[/B] [COLOR=#4f8f00]n[/COLOR] [B]to[/B] [COLOR=#812fdc]name[/COLOR] [B]of[/B] [B]first[/B] [COLOR=#0433ff][I]menu item[/I][/COLOR] [B]of[/B] [COLOR=#0433ff][I]menu[/I][/COLOR] 1 [B]of[/B] [COLOR=#0433ff][I]menu bar item[/I][/COLOR] "Darstellung" [B]of[/B] [COLOR=#0433ff][I]menu bar[/I][/COLOR] 1 [B]where[/B] [COLOR=#812fdc]value[/COLOR] [B]of[/B] [COLOR=#0433ff][I]attribute[/I][/COLOR] "AXMenuItemMarkChar" [B]is[/B] "[FONT=Lucida Grande]✓[/FONT]"[/FONT]
[FONT=Verdana]            [/FONT]
[FONT=Verdana]            [B]if[/B] [COLOR=#4f8f00]n[/COLOR] [B]is[/B] "Wochenansicht" [B]then[/B][/FONT]
[FONT=Verdana]                [B]set[/B] [COLOR=#4f8f00]x[/COLOR] [B]to[/B] 2[/FONT]
[FONT=Verdana]            [B]else[/B] [B]if[/B] [COLOR=#4f8f00]n[/COLOR] [B]is[/B] "Monatsansicht" [B]then[/B][/FONT]
[FONT=Verdana]                [B]set[/B] [COLOR=#4f8f00]x[/COLOR] [B]to[/B] 3[/FONT]
[FONT=Verdana]            [B]else[/B] [B]if[/B] [COLOR=#4f8f00]n[/COLOR] [B]is[/B] "Jahresansicht" [B]then[/B][/FONT]
[FONT=Verdana]                [B]set[/B] [COLOR=#4f8f00]x[/COLOR] [B]to[/B] 4[/FONT]
[FONT=Verdana]            [B]else[/B][/FONT]
[FONT=Verdana]                [B]set[/B] [COLOR=#4f8f00]x[/COLOR] [B]to[/B] 1[/FONT]
[FONT=Verdana]            [B]end[/B] [B]if[/B][/FONT]
[FONT=Verdana]            [/FONT]
[FONT=Verdana]        [B]on[/B] [B]error[/B][/FONT]
[COLOR=#5E6161][FONT=Verdana][COLOR=#000000]            [/COLOR]-- wenn gar kein "[FONT=Lucida Grande]✓[/FONT]" im Menü Darstellung:[/FONT][/COLOR]
[FONT=Verdana]            [B]set[/B] [COLOR=#4f8f00]x[/COLOR] [B]to[/B] 1[/FONT]
[FONT=Verdana]        [B]end[/B] [B]try[/B][/FONT]
[FONT=Verdana]        [/FONT]
[COLOR=#5E6161][FONT=Verdana][COLOR=#000000]        [/COLOR]-- nach "rechts":[/FONT][/COLOR]
[FONT=Verdana]        [B]set[/B] [COLOR=#4f8f00]x[/COLOR] [B]to[/B] [COLOR=#4f8f00]x[/COLOR] + 1[/FONT]
[FONT=Verdana]        [B]if[/B] [COLOR=#4f8f00]x[/COLOR] > 4 [B]then[/B] [B]set[/B] [COLOR=#4f8f00]x[/COLOR] [B]to[/B] 1[/FONT]
[FONT=Verdana]        [/FONT]
[COLOR=#5E6161][FONT=Verdana][COLOR=#000000]        [/COLOR]--nach "links":[/FONT][/COLOR]
[COLOR=#5E6161][FONT=Verdana][COLOR=#000000]        [/COLOR]-- set x to x - 1[/FONT][/COLOR]
[COLOR=#5E6161][FONT=Verdana][COLOR=#000000]        [/COLOR]-- if x < 1 then set x to 4[/FONT][/COLOR]
[FONT=Verdana]        [/FONT]
[COLOR=#0433FF][COLOR=#000000][FONT=Verdana]        [/FONT][/COLOR][FONT=Verdana][B]click radio[/B][/FONT][I] button [/I][COLOR=#4f8f00][FONT=Verdana]x[/FONT][/COLOR][COLOR=#000000][FONT=Verdana] [B]of[/B] [/FONT][/COLOR][I]radio group[/I][COLOR=#000000][FONT=Verdana] 1 [B]of[/B] [/FONT][/COLOR][I]group[/I][COLOR=#000000][FONT=Verdana] 1 [B]of[/B] [/FONT][/COLOR][I]toolbar[/I][COLOR=#000000][FONT=Verdana] 1 [B]of[/B] [/FONT][/COLOR][I]window[/I][COLOR=#000000][FONT=Verdana] "Kalender"[/FONT][/COLOR][/COLOR]
[FONT=Verdana]        [/FONT]
[FONT=Verdana]    [B]end[/B] [B]tell[/B][/FONT]
[FONT=Verdana][B]end[/B] [B]tell[/B][/FONT]


Bei mir wird in der Tagesansicht kein Haken im Menü Darstellung angezeigt, deshalb das Skript in dieser Form

Gruß
 
Jetzt hat's dich aber gepackt, ne? :)
Macht mir ja fast ein schlechtes Gewissen so viel Arbeit von dir darin zu sehen!

In der Version hier triggert er sowohl aus dem AS-Editor selbst als auch über BTT mit "Execute Terminal Command" (musste die Leerzeichen aus dem Dateinamen nehmen, seitdem geht's) muss ich bei den ersten paar Durchläufen immer 2 mal wischen bis es weitergeht. Ab irgendwann dann sogar dreimal, was ich mir gerade nicht wirklich erklären kann oO


Danke :)
Eschi
 
Mir fällt kein Weg ein, den Status auszulesen

Die Radio Buttons haben ein Value-Atribut (0 oder 1) - lässt sich etwa im UI Element Inspector sehen. Es ist somit theoretisch auch möglich, das Ganze zum Einzeiler zu machen – indem man die Liste aller Value-Attribute der Radio Buttons in einen String wandelt, in welchem die Position der einzigen 1 unter sonst nur Nullen bestimmt wird, was dann der Nummer des aktiven Radio Buttons entspricht. Unter Zuhilfenahme des Modulo-Operators kann der zuständige nächste Button in linker oder rechter Richtung angeklickt werden. D.h. im Applescript-Editor mit entsprechender Klammerung:

Code:
[COLOR=#000000][FONT=Verdana][B]property[/B] [/FONT][/COLOR][COLOR=#4F8F00][FONT=Verdana]directionOffset[/FONT][/COLOR][COLOR=#000000][FONT=Verdana] : 2 [/FONT][/COLOR][COLOR=#5E6161][FONT=Verdana]-- <-- Wert auf 0 ändern, um nach rechts statt nach links zu wechseln.
[/FONT][/COLOR][B]tell [/B][COLOR=#0433FF][FONT=Verdana][I]application[/I][/FONT][/COLOR][FONT=Verdana] "System Events" [/FONT][B]to [/B][B]tell [/B][B]the [/B][B]first [/B][COLOR=#0433FF][FONT=Verdana][I]radio group [/I][/FONT][/COLOR][B]of [/B][B]the [/B][B]first [/B][COLOR=#0433FF][FONT=Verdana][I]group [/I][/FONT][/COLOR][B]of [/B][B]the [/B][B]first [/B][COLOR=#0433FF][FONT=Verdana][I]toolbar [/I][/FONT][/COLOR][B]of [/B][B]the [/B][B]first [/B][COLOR=#0433FF][FONT=Verdana][I]window [/I][/FONT][/COLOR][B]of [/B][COLOR=#0433FF][FONT=Verdana][I]process[/I][/FONT][/COLOR][FONT=Verdana] "Calendar" [/FONT][B]to [/B][COLOR=#0433FF][FONT=Verdana][B]click[/B][/FONT][/COLOR][FONT=Verdana] ([/FONT][COLOR=#0433FF][FONT=Verdana][I]radio button[/I][/FONT][/COLOR][FONT=Verdana] (((([/FONT][COLOR=#012FBE][FONT=Verdana][B]offset [/B][/FONT][/COLOR][COLOR=#012FBE][FONT=Verdana]of[/FONT][/COLOR][FONT=Verdana] 1 [/FONT][COLOR=#012FBE][FONT=Verdana]in[/FONT][/COLOR][FONT=Verdana] ([/FONT][B]the [/B][COLOR=#812FDC][FONT=Verdana]value [/FONT][/COLOR][B]of [/B][B]every [/B][COLOR=#0433FF][FONT=Verdana][I]radio button[/I][/FONT][/COLOR][FONT=Verdana]) [/FONT][B]as [/B][COLOR=#0433FF][FONT=Verdana][I]string[/I][/FONT][/COLOR][FONT=Verdana]) + [/FONT][COLOR=#4F8F00][FONT=Verdana]directionOffset[/FONT][/COLOR][FONT=Verdana]) [/FONT][B]mod[/B][FONT=Verdana] 4) + 1))[/FONT]

Alternativ als Skript zum parametrisierten Aufruf aus der Shell heraus, per ‘osascript theScript.scpt 2’ (für den Wechsel nach *links*) :

Code:
[B]on [/B][COLOR=#0433FF][FONT=Verdana][B]run [/B][/FONT][/COLOR][COLOR=#4F8F00][FONT=Verdana]argv[/FONT][/COLOR][FONT=Verdana]    
[B]tell[/B] [COLOR=#0433ff][I]application[/I][/COLOR] "System Events" [B]to[/B] [B]tell[/B] [B]the[/B] [B]first[/B] [COLOR=#0433ff][I]radio group[/I][/COLOR] [B]of[/B] [B]the[/B] [B]first[/B] [COLOR=#0433ff][I]group[/I][/COLOR] [B]of[/B] [B]the[/B] [B]first[/B] [COLOR=#0433ff][I]toolbar[/I][/COLOR] [B]of[/B] [B]the[/B] [B]first[/B] [COLOR=#0433ff][I]window[/I][/COLOR] [B]of[/B] [COLOR=#0433ff][I]process[/I][/COLOR] "Calendar" [B]to[/B] [COLOR=#0433ff][B]click[/B][/COLOR] ([COLOR=#0433ff][I]radio button[/I][/COLOR] (((([COLOR=#012fbe][B]offset[/B][/COLOR] [COLOR=#012fbe]of[/COLOR] 1 [COLOR=#012fbe]in[/COLOR] ([B]the[/B] [COLOR=#812fdc]value[/COLOR] [B]of[/B] [B]every[/B] [COLOR=#0433ff][I]radio button[/I][/COLOR]) [B]as[/B] [COLOR=#0433ff][I]string[/I][/COLOR]) + ([B]first[/B] [COLOR=#0433ff][I]item[/I][/COLOR] [B]of[/B] [COLOR=#4f8f00]argv[/COLOR])) [B]mod[/B] 4) + 1))[/FONT]
[B]end [/B][COLOR=#0433FF][FONT=Verdana][B]run[/B][/FONT][/COLOR]
 
Ja, das ist eindeutig eine bessere Lösung: Kurz und incl. Auslesen!
Und wieder was gelernt :)


Gruß
 
Super Leute, vielen Dank!

Ich würde gerne den parametrischen Aufruf machen. Wie ich den aber umsetze weiß ich nicht.
Und als Ausrede warum ich das auch noch auf dem Silbertablett serviert haben möchte ist für spätere Leser, die das Thema dann am besten abgerundet hier vorfinden, falls sie ebenfalls nicht wissen wie man ein Script parametrisch aufruft :D


Das wäre richtig gut!


Desweiteren bleibt die Frage im Raum wie ich herausfinde in AppleScript die Programme anzusprechen. Beispielsweise möchte ich jetzt in Alfred einen Workflow einbauen, der mir mit dem simplen Keyword "refresh" den Knopf "Mails empfangen" drückt (ich hoffe dadurch eine Notification zu bekommen, was wegfällt, wenn ich das Programm wirklich offen habe)

Gehört 0 zum Thema hier und deswegen möchte ich auch keine Lösung (muss ja üben) - ich möchte nur wissen wo ich herausfinde was nach 'tell application "Mail"' möglich ist. Der UIElementInspector hilft MIR da leider nicht groß, weil alles auf Deutsch ist und die Scripts englisch sein müssen- mehr als

Code:
tell application "Mail" to click "Empfangen" end tell

kommt nich rum.. wobei der AS-Editor alles lila schreibt bei mir und kein Highlighting entsteht?!!
Eine humane Einführung ohne dicken Welzer in den Editor wäre also auch nicht schlecht :)



Danke! Freu mich :)
 
Hallo,
noch mal kurz zu der Lösung von kermitd:
dass die Radio Buttons einen Value-Attribut haben, hätte ich eigentlich auch sehen können, wenn ich nicht so blind und von meinem Lösungsweg mental eingeengt vor dem Mac gesessen hätte...

... die Formel unter Verwendung des Modulo .... das ist einfach brillant!
Das hätte ich selbst unter Strapazieren sämtlichen Hirnschmalzes nie nie nie zustande gebracht :)
Chapeau!

Dabei ist es so einfach und klar, wenn man es liest ...
 
Danke Varuna. Ich muss dazu zu meiner “Schande” gestehen, dass auch ich vor einiger Zeit eine irrsinnig umständliche UI-Scripting-Logik für iTunes benutzt habe, um dort zwischen den Ansichten zu wechseln, was stattdessen genau entsprechend des Problems hier gelöst werden kann. Naja, wie Du sagst, man lernt dazu… :p Und, was Deine Lösung angeht, funktioniert die ja auch, und ist finde ich auch sehr anschaulich. Das mit dem "blind und mental eingeengt" kenne ich allerdings. :d

Dabei ist es so einfach und klar, wenn man es liest ...

Wobei das ja auch eine oft bemängelte Eigenschaft von Applescript im Allgemeinen ist. Einfach zu lesen aber nicht immer ganz so einfach zu schreiben... :)

Ich würde gerne den parametrischen Aufruf machen. Wie ich den aber umsetze weiß ich nicht.
Einfach den Inhalt des zweiten Codeblocks aus meinem letzten Post vom Applescript Editor in eine Datei speichern lassen, meinetwegen in "iCalView.scpt" im Script-Unterordner Deiner Benutzer-Library, und dann in BTT "execute Terminal command" auswählen, und dort (nach Belieben mit 0 oder 2 als Parameter für die Richtung)
Code:
osascript ~/Library/Scripts/iCalView.scpt 0
eingeben.

AS-Editor alles lila schreibt bei mir und kein Highlighting entsteht?!!
Das Highlighting der Syntax erfordert die Kompilierbarkeit Deines Codes (und erfolgt auch erst durch das Kompilieren), das heißt er muss mindestens bereits syntaktisch korrekt sein.

bleibt die Frage im Raum wie ich herausfinde in AppleScript die Programme anzusprechen.

Varuna ja bereits darauf hingewiesen, dass wir hier die UI Scripting Funktionalität nutzen, was zunächst einmal ein recht spezieller Fall im Vergleich zu gewöhnlichen Applescripts ist. Da dein Skript programmatisch auf die Benutzeroberfläche der Anwendung zugreift, ist solch ein Skript in der Regel wenig robust gegenüber irgendwelchen Änderungen in der UI. Wenn Du Pech hast, nicht aufpasst, und sagen wir mal davon ausgehst, dass der Index eines bestimmten Knopfes in der Symbolleiste konstant bleibt, zerschießt es Dir das Skript bereits, wenn der Benutzer nur die Position des Knopfes änderst. Schlimmstenfalls kann dann bspw. statt des “Empfangen”-Knopfes mal eben der Knopf zum Löschen einer Mail gedrückt werden. Es ist somit in der Regel ratsam, die Elemente möglichst präzise anzusprechen um unvorhergesehene Verwechslungen zu vermeiden, so dass eine geänderte UI in einer Fehlermeldung resultiert, statt in einem geänderten Verhalten des Skripts. Dieses Vorhaben wird leider dadurch erschwert, dass die UI-Elemente mit lokalisierten Namen angesprochen werden, was dazu verführt, den Index von Elementen zu nutzen um das Skript universell benutzen zu können.

Nun, jedenfalls ist das UI Scripting immer eine Notlösung gegenüber gewöhnlichen AppleScripts, die auf von einer Anwendung speziell zur Verfügung gestellten Befehlen aufbauen, welche direkt auf das Modell der Anwendung zugreifen können. Dazu kommt es darauf an, dass das vorliegende Programm ein eigenes Scripting Dictionary (bzw. die darin aufgeführte Scripting-Funktionalität) anbietet. Wie schon von Varuna erwähnt, kannst du im Applescript-Editor im Fenster-Menü die Bibliothek aktivieren, um dort für beliebige Programm zu überprüfen, ob ein Scripting Dictionary existiert, bzw. wie sein Inhalt aussieht.

Konkret suchst Du nun einen Befehl, um neue E-Mails zu empfangen. Leider scheint diese Funktionalität per Applescript nicht zur Verfügung gestellt zu werden, und wir sind damit direkt schon wieder an der Stelle , auf UI Scripting ausweichen zu müssen, statt die Anwendung direkt ansprechen zu können… :(


EDIT: Falsch! Siehe 2 Posts weiter...



Da UI Scripting das Accessibility Framework des Systems benutzt, und auf dieses in Applescript mit der “System Events” Anwendung zugegriffen wird, ist also nicht das Mail-Programm unser direkter Ansprechpartner, wie Du es in Deinem Code schreibst, sondern die “System Events”-Anwendung. D.h.


Code:
tell application “System Events” 
...
end tell
 
Zuletzt bearbeitet:
Nächster Schritt ist im UI Element Inspector herauszufinden, wie unser konkretes Element denn angesprochen wird. Die Eigenschaften unseres Zielobjekts sehen in diesem Fall (auf Deutsch) folgendermaßen aus:

<AXApplication: “Mail”>
<AXWindow: “Papierkorb (41 E-Mails)”>
<AXToolbar>
<AXButton>


Attributes:
AXRole: “AXButton”
AXRoleDescription: “Taste”
AXHelp: “(null)”
AXFocused (W): “0”
AXParent: “<AXToolbar>”
AXWindow: “<AXWindow: “Papierkorb (41 E-Mails)”>”
AXTopLevelUIElement: “<AXWindow: “Papierkorb (41 E-Mails)”>”
AXPosition: “x=156 y=110”
AXSize: “w=49 h=30”
AXEnabled: “1”
AXDescription: “Empfangen”


Actions:
AXPress - drücken


Zuoberst wird Dir die containment hierarchy angezeigt, das heißt Du siehst die hierarchische Zugehörigkeit des Elements. Wenn Du das UIElement lock einstellst, kannst Du dich auch in der Hierarchie durchhangeln, bis zum obersten Element, der über das Accessibility Framework angesprochenen Mail-Anwendung. Im vorliegenden Fall gehört der Knopf zu einer Symbolleiste in einem Fenster einer Applikation.

In Applescript wird die Zugehörigkeit entweder durch das Apostroph oder durch die Verwendung des “of” keywords ausgedrückt, d.h. button 1 of toolbar 1 bzw. (toolbar 1)’s button 1. Wir wissen allerdings noch nicht, welchem Fenster und welcher Toolbar der Knopf angehört. Um das rauszufinden, könntest Du bspw. erstmal eine Anfrage every window of process "Mail" absetzen. Oder allgemeiner kannst Du auch nach every UI element of process "Mail" fragen. Da Du vermutlich das vorderste Fenster ansprechen möchtest, ist hier window 1 of process "Mail" der richtige Ansprechpartner. Bei der Symbolleiste gibt es in unserem Fall keine große Auswahl, also toolbar 1 of window 1 of process "Mail". Damit bleibt nur noch die Frage, um welchen Knopf es geht. Die Antwort gibt uns im Prinzip bereits die Übersicht des UI Element Inspectors. Wir wollen den Knopf mit der Beschreibung “Empfangen”. Applescript bietet eine ganz schöne Möglichkeit ein Objekt abhängig von einem Attribut, in diesem Fall also der “description” zu bestimmen. Wenn Du weißt, dass es sowieso nur ein einziges Objekt mit genau dieser Beschreibung gibt, kannst Du Dir auch ein Zufälliges geben lassen. Hier also “irgendein” Knopf für den gilt, dass die Beschreibung “Empfangen” lautet. In Applescripts Syntax wird daraus: some button where description is "Empfangen". Auf diesem soll die Aktion “click” ausgeführt werden. Das heißt wir richten den Befehl “click” an diesen speziellen Knopf”, was etwa über “tell <object> to click” oder “click <theObject>” realisiert werden kann.

Schlussendlich musst Du nur noch alles zusammensetzen, also
1 - Alle Befehle an die Anwendung System Events richten
2 - irgendeinen Knopf der ersten Symbolleiste des ersten Fensters vom Mailprozess ansprechen, für den gilt, dass die Beschreibung “Empfangen” lautet
3 - An dieses Objekt den “click” Befehl richten
 
Kommando zurück, muss mich korrigieren. UI Scripting ist gar nicht erforderlich hier...

Such' mal im Applescript Editor im Dictionary der Mail.app nach "check for new mail"...

Code:
[COLOR=#000000][FONT=Times][B]check for new mail[/B][/FONT][/COLOR][COLOR=#000000][FONT=Times] [/FONT][/COLOR][COLOR=#000000][FONT=Times][I]v[/I][/FONT][/COLOR][COLOR=#000000][FONT=Times] : [/FONT][/COLOR][COLOR=#000000][FONT=Times]Triggers a check for email.
[/FONT][/COLOR][COLOR=#000000][FONT=Times][B]
check for new mail[/B]
[/FONT][/COLOR]
[COLOR=#000000][FONT=Times][[/FONT][/COLOR][COLOR=#000000][FONT=Times][B]for [/B][/FONT][/COLOR][URL="http://applewebdata://3A672066-18A0-4AB1-9066-25B0343214EA#Mail-Framework.account"]account[/URL][COLOR=#000000][FONT=Times]] : [/FONT][/COLOR][COLOR=#000000][FONT=Times]Specify the account that you wish to check for mail[/FONT][/COLOR]

Soviel zum "blind und mental eingeengt".... :D
 
Sorry für die vielen und langen Posts (aber die Ausgangsfrage ist ja eigentlich geklärt). :eek:

... die Formel unter Verwendung des Modulo .... das ist einfach brillant!
Das hätte ich selbst unter Strapazieren sämtlichen Hirnschmalzes nie nie nie zustande gebracht :)
Chapeau!

Jetzt komm' ich doch noch mal kurz darauf zurück, weil es vielleicht helfen könnte, den Prozess des schrittweisen Erstellens und Verbesserns von Applescripts im Allgemeinen, jedenfalls aus meiner Sicht, etwas zu verdeutlichen. In Matt Neuburgs fantastischem Buch "Applescript - The Definitive Guide" ist zum Beispiel ein Kapitel "The AppleScript Experience" in dem er anhand eines Beispiels durch seinen Prozess beim Erstellen eines Scripts führt (dort anhand eines natürlich anspruchsvolleren Beispiels von Framemaker-Scripting demonstriert). Und für mich jedenfalls war es durchaus motivierend dort zu lesen, dass selbst jemand wie er sich letztlich langsam und mit viel Ausprobieren und teilweise auch Raten an eine Lösung herantastet, die dann nach und nach verfeinert wird, und bei der man vorher manchmal in einer Sackgasse gelandet ist.

Um beim Beispiel des Threads hier zu bleiben war z.B. meine erste Frage wie der Index eines Elements abzufragen wäre. Eigentlich würde man ja gerne irgendwas in der Art get the index of some radio button whose value is 1 schreiben können. Da mir keine entsprechende Möglichkeit bekannt ist (?), habe ich mir erstmal die properties eines Radio Buttons ausgeben lassen, in der Hoffnung dort etwas zu finden:

Code:
[B]tell [/B][COLOR=#0433FF][FONT=Verdana][I]application[/I][/FONT][/COLOR][FONT=Verdana] "System Events" [/FONT][B]to [/B][B]tell [/B][COLOR=#0433FF][FONT=Verdana][I]process[/I][/FONT][/COLOR][FONT=Verdana] "Calendar"[/FONT][FONT=Verdana]    
[COLOR=#812fdc]properties[/COLOR] [B]of[/B] [B]some[/B] [COLOR=#0433ff][I]radio button[/I][/COLOR] [B]of[/B] [B]the[/B] [B]first[/B] [COLOR=#0433ff][I]radio group[/I][/COLOR] [B]of[/B] [B]the[/B] [B]first[/B] [COLOR=#0433ff][I]group[/I][/COLOR] [B]of[/B] [B]the[/B] [B]first[/B] [COLOR=#0433ff][I]toolbar[/I][/COLOR] [B]of[/B] [B]the[/B] [B]first[/B] [COLOR=#0433ff][I]window[/I][/COLOR] [B]whose[/B] [COLOR=#812fdc]value[/COLOR] [B]is[/B] 1[/FONT]
[B]end [/B][B]tell[/B]

=>
{minimum value:missing value, orientation:missing value, position:{621, 77}, class:radio button, role description:"radio button", accessibility description:missing value, focused:false, title:"Month", size:{61, 25}, value:1, help:"", enabled:true, maximum value:missing value, role:"AXRadioButton", entire contents:{}, subrole:missing value, selected:missing value, name:"Month", description:"radio button"}

Offensichtlich führt das nicht weiter. Möglicherweise gibt es eine andere direkte Möglichkeit, aber mir ist keine bekannt.

Die (indirekte) Alternative war dann über die Radio Buttons zu iterieren, und den Counter auszugeben, wenn man beim aktiven Radio Button angekommen ist, also

Code:
[COLOR=#812FDC][FONT=Verdana][B]tell [/B][COLOR=#0433FF][I]application[/I][/COLOR][COLOR=#222222] "System Events" [/COLOR][B]to [/B][B]tell [/B][COLOR=#0433FF][I]process[/I][/COLOR][COLOR=#222222] "Calendar"[/COLOR][/FONT][/COLOR]
[FONT=Verdana]   [B]repeat[/B] [B]with[/B] [COLOR=#4f8f00]i[/COLOR] [B]from[/B] 1 [B]to[/B] 4[/FONT]
[FONT=Verdana]       [B]if[/B] [B]the[/B] [COLOR=#812fdc]value[/COLOR] [B]of[/B] [COLOR=#0433ff][I]radio button[/I][/COLOR] [COLOR=#4f8f00]i[/COLOR] [B]of[/B] [B]the[/B] [B]first[/B] [COLOR=#0433ff][I]radio group[/I][/COLOR] [B]of[/B] [B]the[/B] [B]first[/B] [COLOR=#0433ff][I]group[/I][/COLOR] [B]of[/B] [B]the[/B] [B]first[/B] [COLOR=#0433ff][I]toolbar[/I][/COLOR] [B]of[/B] [B]the[/B] [B]first[/B] [COLOR=#0433ff][I]window[/I][/COLOR] [B]is[/B] 1 [B]then[/B] [B]exit[/B] [B]repeat[/B][/FONT]
[FONT=Verdana]   [B]end[/B] [B]repeat[/B][/FONT]
[FONT=Verdana]   [B]get[/B] [COLOR=#4f8f00]i[/COLOR][/FONT]
[COLOR=#812FDC][FONT=Verdana][B]end [/B][B]tell[/B][/FONT][/COLOR]


Das ist aus mehreren Gründen aber unschön. Erstens ist es nicht schön zu lesen, und zweitens führt es im ungünstigsten Fall zum Senden von gleich 4 Apple Events (mit osascript im Terminal ausgeführt bspw. zu beobachten, durch die vorherige Eingabe von:
export AEDebugSends=1; export AEDebugReceives=1.
 
Also könnte man stattdessen, erst einmal alle Values in eine Liste auslesen, damit nur noch ein einziges Apple Event resultiert:

Code:
[COLOR=#812FDC][FONT=Verdana][B]tell [/B][COLOR=#0433FF][I]application[/I][/COLOR][COLOR=#222222] "System Events" [/COLOR][B]to [/B][B]tell [/B][COLOR=#0433FF][I]process[/I][/COLOR][COLOR=#222222] "Calendar"[/COLOR][/FONT][/COLOR]
[FONT=Verdana]    [B]set[/B] [COLOR=#4f8f00]theList[/COLOR] [B]to[/B] [B]the[/B] [COLOR=#812fdc]value[/COLOR] [B]of[/B] [B]every[/B] [COLOR=#0433ff][I]radio button[/I][/COLOR] [B]of[/B] [B]the[/B] [B]first[/B] [COLOR=#0433ff][I]radio group[/I][/COLOR] [B]of[/B] [B]the[/B] [B]first[/B] [COLOR=#0433ff][I]group[/I][/COLOR] [B]of[/B] [B]the[/B] [B]first[/B] [COLOR=#0433ff][I]toolbar[/I][/COLOR] [B]of[/B] [B]the[/B] [B]first[/B] [COLOR=#0433ff][I]window[/I][/COLOR][/FONT]
[FONT=Verdana]    [B]repeat[/B] [B]with[/B] [COLOR=#4f8f00]i[/COLOR] [B]from[/B] 1 [B]to[/B] [B]the[/B] [COLOR=#812fdc]length[/COLOR] [B]of[/B] [COLOR=#4f8f00]theList[/COLOR][/FONT]
[FONT=Verdana]        [B]if[/B] [COLOR=#0433ff][I]item[/I][/COLOR] [COLOR=#4f8f00]i[/COLOR] [B]of[/B] [COLOR=#4f8f00]theList[/COLOR] [B]is[/B] 1 [B]then[/B] [B]exit[/B] [B]repeat[/B][/FONT]
[FONT=Verdana]    [B]end[/B] [B]repeat[/B][/FONT]
[FONT=Verdana]    [B]get[/B] [COLOR=#4f8f00]i[/COLOR][/FONT]
[COLOR=#812FDC][FONT=Verdana][B]end [/B][B]tell[/B][/FONT][/COLOR]


Schöner wäre es jetzt natürlich, direkt den Index der einzigen 1 in der Liste herauszufinden. Der geradlienige Ansatz wäre hier wieder get some item of theList whose value is 1 zu versuchen. Das schlägt aber fehl. Auch hier ist mir keine Möglichkeit bekannt, bei Listen den Index eines Elements das bestimmte Voraussetzungen erfüllt, abzufragen. Was aber geht, ist, Listen in Strings zu wandeln. Und in Strings lässt sich über das in den Standard Additions definierte offset-Verb der Index eines bestimmten Textbestandteils herausfinden. Damit lässt sich die Schleife entfernen:

Code:
[COLOR=#812FDC][FONT=Verdana][B]tell [/B][COLOR=#0433FF][I]application[/I][/COLOR][COLOR=#222222] "System Events" [/COLOR][B]to [/B][B]tell [/B][COLOR=#0433FF][I]process[/I][/COLOR][COLOR=#222222] "Calendar"[/COLOR][/FONT][/COLOR]
[FONT=Verdana]    [B]set[/B] [COLOR=#4f8f00]activeIndex[/COLOR] [B]to[/B] [B]the[/B] [COLOR=#012fbe][B]offset[/B][/COLOR] [COLOR=#012fbe]of[/COLOR] 1 [COLOR=#012fbe]in[/COLOR] ([B]the[/B] [COLOR=#812fdc]value[/COLOR] [B]of[/B] [B]every[/B] [COLOR=#0433ff][I]radio button[/I][/COLOR] [B]of[/B] [B]the[/B] [B]first[/B] [COLOR=#0433ff][I]radio group[/I][/COLOR] [B]of[/B] [B]the[/B] [B]first[/B] [COLOR=#0433ff][I]group[/I][/COLOR] [B]of[/B] [B]the[/B] [B]first[/B] [COLOR=#0433ff][I]toolbar[/I][/COLOR] [B]of[/B] [B]the[/B] [B]first[/B] [COLOR=#0433ff][I]window[/I][/COLOR]) [B]as[/B] [COLOR=#0433ff][I]string[/I][/COLOR][/FONT]
[COLOR=#812FDC][FONT=Verdana][B]end [/B][B]tell[/B][/FONT][/COLOR]



Da wir nach rechts vom vierten immer zum ersten Element zurückwollen, können wir auf den activeIndex einfach eins draufaddieren, aber wenn der activeIndex 4 ist, ihn auf 0 zurücksetzen. Genau das macht (activeIndex mod 4) + 1.
Und da wir nun auch mehr als ein Element nach rechts gehen können, gehen wir für die linke Richtung einfach um drei Elemente nach "rechts", indem wir zu activeIndex die Zahl 2 addieren

Code:
[COLOR=#000000][FONT=Verdana][B]property[/B] [/FONT][/COLOR][COLOR=#4F8F00][FONT=Verdana]directionOffset[/FONT][/COLOR][COLOR=#000000][FONT=Verdana] : 0[/FONT][/COLOR]
[FONT=Verdana][B]tell[/B] [COLOR=#0433ff][I]application[/I][/COLOR] "System Events" [B]to[/B] [B]tell[/B] [COLOR=#0433ff][I]process[/I][/COLOR] "Calendar"[/FONT]
[FONT=Verdana]    [B]set[/B] [COLOR=#4f8f00]activeIndex[/COLOR] [B]to[/B] [B]the[/B] [COLOR=#012fbe][B]offset[/B][/COLOR] [COLOR=#012fbe]of[/COLOR] 1 [COLOR=#012fbe]in[/COLOR] ([B]the[/B] [COLOR=#812fdc]value[/COLOR] [B]of[/B] [B]every[/B] [COLOR=#0433ff][I]radio button[/I][/COLOR] [B]of[/B] [B]the[/B] [B]first[/B] [COLOR=#0433ff][I]radio group[/I][/COLOR] [B]of[/B] [B]the[/B] [B]first[/B] [COLOR=#0433ff][I]group[/I][/COLOR] [B]of[/B] [B]the[/B] [B]first[/B] [COLOR=#0433ff][I]toolbar[/I][/COLOR] [B]of[/B] [B]the[/B] [B]first[/B] [COLOR=#0433ff][I]window[/I][/COLOR]) [B]as[/B] [COLOR=#0433ff][I]string[/I][/COLOR][/FONT]
[FONT=Verdana]    [COLOR=#0433ff][B]click[/B][/COLOR] [COLOR=#0433ff][I]radio button[/I][/COLOR] ((([COLOR=#4f8f00]activeIndex[/COLOR] + [COLOR=#4f8f00]directionOffset[/COLOR]) [B]mod[/B] 4) + 1) [B]of[/B] [B]the[/B] [B]first[/B] [COLOR=#0433ff][I]radio group[/I][/COLOR] [B]of[/B] [B]the[/B] [B]first[/B] [COLOR=#0433ff][I]group[/I][/COLOR] [B]of[/B] [B]the[/B] [B]first[/B] [COLOR=#0433ff][I]toolbar[/I][/COLOR] [B]of[/B] [B]the[/B] [B]first[/B] [COLOR=#0433ff][I]window[/I][/COLOR][/FONT]
[B]end [/B][B]tell[/B]

Jetzt sprechen wir aber in beiden Zeilen letztendlich die radio group an, deswegen können wir das direkt dem ersten tell-Befehl hinzufügen

Code:
[COLOR=#000000][FONT=Verdana][B]property[/B] [/FONT][/COLOR][COLOR=#4F8F00][FONT=Verdana]directionOffset[/FONT][/COLOR][COLOR=#000000][FONT=Verdana] : 2[/FONT][/COLOR]
[FONT=Verdana][B]tell[/B] [COLOR=#0433ff][I]application[/I][/COLOR] "System Events" [B]to[/B] [B]tell[/B] [B]the[/B] [B]first[/B] [COLOR=#0433ff][I]radio group[/I][/COLOR] [B]of[/B] [B]the[/B] [B]first[/B] [COLOR=#0433ff][I]group[/I][/COLOR] [B]of[/B] [B]the[/B] [B]first[/B] [COLOR=#0433ff][I]toolbar[/I][/COLOR] [B]of[/B] [B]the[/B] [B]first[/B] [COLOR=#0433ff][I]window[/I][/COLOR] [B]of[/B] [COLOR=#0433ff][I]process[/I][/COLOR] "Calendar"[/FONT]
[FONT=Verdana]    [B]set[/B] [COLOR=#4f8f00]activeIndex[/COLOR] [B]to[/B] [B]the[/B] [COLOR=#012fbe][B]offset[/B][/COLOR] [COLOR=#012fbe]of[/COLOR] 1 [COLOR=#012fbe]in[/COLOR] ([B]the[/B] [COLOR=#812fdc]value[/COLOR] [B]of[/B] [B]every[/B] [COLOR=#0433ff][I]radio button[/I][/COLOR]) [B]as[/B] [COLOR=#0433ff][I]string[/I][/COLOR][/FONT]
[COLOR=#4F8F00][FONT=Verdana][COLOR=#0433ff][B]click [/B][/COLOR][COLOR=#0433ff][I]radio button[/I][/COLOR][COLOR=#000000] ((([/COLOR]activeIndex[COLOR=#000000] + [/COLOR]directionOffset[COLOR=#000000]) [B]mod[/B] 4) + 1)[/COLOR][/FONT][/COLOR]
[B]end [/B][B]tell[/B]

Und schließlich lässt sich das Ganze im Prinzip ohne Einbußen der Leserlichkeit in einer Zeile zusammenfassen. Resultat ist das Ergebnis auf der ersten Seite.
 
So- viel zu tun gehabt- jetzt wieder was Leerlauf.
Vielen Dank für die Hilfe und es funktioniert jetzt auch soweit. Aber ich bin jetzt noch so perfektionistisch und würde gerne die Parameter Variante mit nur einem Script machen. Habe also die offset-Variable mit "" deklariert, wie in einem deiner Beispiele auf Seite 1.
HTML:
property directionOffset : ""
Doch leider funktioniert das nicht mit folgendem Aufruf in BTT
HTML:
"usr/bin/osascript /Users/reneeschke/Documents/AppleScripts/Calender_Switch_Tab_Right.scpt 0"
Das Script geht bei selbem Aufruf mit "2" auch nach rechts.
 
Wo wir grad alle so lustig dabei sind möchte ich mit Alfred 2 schnell Emails erstellen, bis jetzt bin ich so weit:
Code:
tell application "Mail"
	set newMSG to make new outgoing message
	set jimbo to "{query}"
	tell newMSG
		make new to recipient with properties {address:jimbo}
		set visible to true
	end tell
	activate
end tell

nicht wundern- meine Variablen haben in so kurzen Sachen meist einen für mich klar merkbaren Namen ;)
{query} bezieht sich hier auf den Parameter, der von Alfred kommt.

Gefällt mir auch ganz gut soweit- wenn man nur so "abnerded" um bei einer Email Zeit zu sparen, dann richtig!
Ich möchte jetzt also noch die Schreibmarke direkt im Betreffs bzw. direkt im Textfeld haben, finde aber auch mit dem UI-Inspector nicht heraus wie das ginge.

Ich weiß es entfernt sich weit vom Thread, aber vielleicht kennt sich ja auch jemand mit Alfred 2 genug aus um vielleicht kurz anzureissen was nötig wäre um im Dropdown Menu angezeigt zu bekommen von welchem Account man die neue Email senden möchte? Mit AppleScript bekomme ich das auch schon hin- nur wie das von Alfred kommen soll ist für mich weit zu hoch :D



Eschiii
 
Habe also die offset-Variable mit "" deklariert

Warum? Benutz' einfach den zweiten der beiden Codeblöcke, wenn Du den Aufruf mit Parameter ermöglichen möchtest. Der übergebene Wert ist dann das erste Element der argv-Liste. Der Code funktioniert bereits, so wie er da steht.

Ich möchte jetzt also noch die Schreibmarke direkt im Betreffs bzw. direkt im Textfeld haben
Du musst die "focused" property auf true setzen. Entweder für's text field "Betreff:" oder für some UI element of the first scroll area whose role is "AXWebArea". Jeweils zum ersten Fenster des Mail-Prozesses gehörend.

vielleicht kennt sich ja auch jemand mit Alfred 2 genug aus
Da gebe ich ab. Treuer Quicksilver-User hier…. ;)
 
Zurück
Oben Unten