[Pythonmac-SIG] just one apple event

Bill Bedford billpy@mousa.demon.co.uk
Wed, 15 Dec 1999 13:56:38 +0000


At 11:06 am +0100 14/12/99, Jack Jansen wrote:

>>  A word of caution. Python only allocates/can use one transaction
>>  number per session. So if your script calls do_script more than once
>>  it will fail. So far I have only found this to be a problem scripting
>>  Hypercard, where there are lots of alternatives, but YMMV
>
>
>Bill,
>this message has a serious sound to it, but that may be because I don't
>understand it:-)

I know the feeling :-)

>
>Should Python allocate more transaction numbers? Can you give an Inside Mac
>(or other) reference for how this should be done?

I've had a look through Inside Mac: Interactive Communications and 
there are a number of passages like this. (page 3-29)

>  You can specify two other attributes with the AECreateAppleEvent 
>function: the
>  reply ID and the transaction ID. For the reply ID attribute, you 
>usually specify the
>' kAutoGenerateReturnID' constant to the AECreateAppleEvent function. This
>  constant ensures that the Apple Event Manager generates a unique 
>return ID for the
>  reply Apple event returned from the server. For the transaction ID 
>attribute, you usually
>  specify the 'kAnyTransactionID' constant, which indicates that this 
>Apple event is not
>  one of a series of interdependent Apple events.

And this is what Python does class TalkTo() has

	def newevent(self, code, subcode, parameters = {}, attributes = {}):
		"""Create a complete structure for an apple event"""

		event = AE.AECreateAppleEvent(code, subcode, self.target,
		      	  AppleEvents.kAutoGenerateReturnID, 
AppleEvents.kAnyTransactionID)
		packevent(event, parameters, attributes)
		return event

which looks OK. The problem is the actual appleevent. Capturing the 
same event from Applescript and Python with CaptureAE you get


with applescript:

Process("HyperCard").SendAE "WILD,GO  ,'----':obj {form:name, 
want:type(cSTK), seld:"Suppliers Invoices", from:'null'()}, 
&subj:'null'()"

And with Python

Process("HyperCard").SendAE "WILD,GO  ,'----':obj {form:name, 
want:type(cSTK), from:'null'(), seld:"Suppliers Invoices"}, 
&tran:18904"

Python should be passing a null pointer but isn't. My guess that 
there is a problem with the type of transactionID in the C code -- it 
should be a long int

Is this serious? I don't really think so -- most applications ignore 
the transactionID. It is just a few like Hypercard that seem to check 
it and throw errors when they don't like what they find.

-- 
Bill Bedford                            mailto://billb@mousa.demon.co.uk

SQUEAK.