[EMAIL PROTECTED] wrote:

if I try to run blobedit.py in the IDLE ide ...
> the path is equal to "8833" for some
reason.

I believe that IDLE sets up some kind of debugging
connection to its child process. That number might
be a processs ID or port number or something related
to that.

I tried to hunt down where the problem occurs, but I was led
to the method "application_openFile_(self, ns_app, path)" in the
class _PyGui_NSApplication. I couldn't find out how this method
ever got called though.

It's called by the Cocoa framework to handle files
passed to the application from the Finder. It also
seems to get called when there are command-line
arguments. But it works on the C-level argv, which
means it can pick up stuff that doesn't normally
end up in sys.argv. The check for sys.argv[0]
is there to work around one of the side effects of
that. It appears that you've encountered another
one.

I'm using a different method of dealing with
this now, which will probably fix your problem as
well. I've attached a replacement for
GUI/Cocoa/Applications.py. Let me know if it
works for you.

--
Greg
#
#               Python GUI - Application class - PyObjC
#

import os, sys, traceback
import objc
#from ExceptionHandling import \
#       NSExceptionHandler, NSLogUncaughtExceptionMask, 
NSLogAndHandleEveryExceptionMask
from Foundation import NSObject, NSBundle, NSDefaultRunLoopMode
import AppKit
from AppKit import NSApplication, NSResponder, NSScreen, NSMenu, NSMenuItem, \
        NSKeyDown, NSKeyUp, NSMouseMoved, NSLeftMouseDown, NSSystemDefined, \
        NSCommandKeyMask, NSPasteboard, NSStringPboardType, 
NSModalPanelRunLoopMode, \
        NSAnyEventMask
import GApplications
from GApplications import application, Application as GApplication
from Events import Event
from Exceptions import Cancel, Quit
from Menus import _ns_standard_actions

#------------------------------------------------------------------------------

ns_application = None
ns_screen_height = None
ns_last_mouse_moved_event = None

#------------------------------------------------------------------------------

class Application(GApplication):
        #  _ns_app          _PyGui_NSApplication
        #  _ns_pasteboard   NSPasteboard
        #  _ns_key_window   Window
        
        _ns_menubar_update_pending = False

        def __init__(self, **kwds):
                #print "Application.__init__: argv =", sys.argv ###
                create_ns_application()
                self._ns_app = ns_application
                self._ns_app.pygui_app = self
                self._ns_init_standard_menu_items()
                self._ns_pasteboard = NSPasteboard.generalPasteboard()
                self._ns_key_window = None
                GApplication.__init__(self, **kwds)
                ns_application.init_application_name()
        
        def destroy(self):
                del self.menus[:]
                import Windows
                Windows._ns_zombie_window = None
                self._ns_app.pygui_app = None
                self._ns_app = None
                self._ns_pasteboard = None
                GApplication.destroy(self)
        
        def set_menus(self, menu_list):
                GApplication.set_menus(self, menu_list)
                self._update_menubar()
        
        def _update_menubar(self):
                ns_app = self._ns_app
                ns_menubar = NSMenu.alloc().initWithTitle_("")
                menu_list = self._effective_menus()
                for menu in menu_list:
                        ns_item = NSMenuItem.alloc()
                        ns_item.initWithTitle_action_keyEquivalent_(menu.title, 
'', "")
                        ns_menubar.addItem_(ns_item)
                        ns_menu = menu._ns_menu
                        #  An NSMenu can only be a submenu of one menu at a 
time, so
                        #  remove it from the old menubar if necessary.
                        old_supermenu = ns_menu.supermenu()
                        if old_supermenu:
                                i = 
old_supermenu.indexOfItemWithSubmenu_(ns_menu)
                                old_supermenu.removeItemAtIndex_(i)
                        ns_menubar.setSubmenu_forItem_(ns_menu, ns_item)
                ns_app.setMainMenu_(ns_menubar)
                # Apple's docs fail to explain that the menu you pass to 
setAppleMenu_
                # must *also* be a member of the menu bar.
                ns_app_menu = menu_list[0]._ns_menu
                self._ns_app.setAppleMenu_(ns_app_menu)

        def handle_events(self):
                #print "Application.handle_events: entering NS run loop" ###
                #try:
                        self._ns_app.run()
                #finally:
                        #print "Application.handle_events: exiting NS run loop" 
###

        def handle_next_event(self, modal_window = None):
                #print "Application.handle_next_event" ###
                ns_app = self._ns_app
                if modal_window:
                        ns_mode = NSModalPanelRunLoopMode
                        ns_modal_window = modal_window._ns_window
                else:
                        ns_mode = NSDefaultRunLoopMode
                        ns_modal_window = None
                ns_event = 
ns_app.nextEventMatchingMask_untilDate_inMode_dequeue_(
                        NSAnyEventMask, None, ns_mode, True)
                if ns_event:
                        ns_window = ns_event.window()
                        if not ns_window or not ns_modal_window or ns_window == 
ns_modal_window:
                                ns_app.sendEvent_(ns_event)
        
        def _find_target_window(self):
                #  NSApplication.keyWindow() isn't reliable enough. We keep 
track
                #  of the key window ourselves.
                return self._ns_key_window

        def zero_windows_allowed(self):
                return 1
        
        def query_clipboard(self):
                pb = self._ns_pasteboard
                pb_types = pb.types()
                return NSStringPboardType in pb_types
        
        def get_clipboard(self):
                raise NotImplementedError("TODO: Application.get_clipboard")
        
        def set_clipboard(self, data):
                raise NotImplementedError("TODO: Application.set_clipboard")
        
        def _quit(self):
                #print "Application._quit" ###
                self._ns_app.stop_(self)
        
        def _ns_init_standard_menu_items(self):
                self._ns_standard_menu_items = {}
                for (cmd_name, ns_selector) in _ns_standard_actions.iteritems():
                        self._ns_standard_menu_items[cmd_name] = 
NSMenuItem.alloc().\
                                        initWithTitle_action_keyEquivalent_("", 
ns_selector, "")
        
        def _dispatch_menu_setup(self, m):
                for (cmd_name, ns_menu_item) in 
self._ns_standard_menu_items.iteritems():
                        ns_selector = ns_menu_item.action()
                        target = self._ns_app.targetForAction_(ns_selector)
                        if target and 
target.respondsToSelector_('validateMenuItem:'):
                                valid = target.validateMenuItem_(ns_menu_item)
                                m[cmd_name].enabled = valid
                GApplication._dispatch_menu_setup(self, m)
        
        def setup_menus(self, m):
                if not self._ns_app.modalWindow():
                        GApplication.setup_menus(self, m)
        
        def process_args(self, args):
                #  Don't need to do anything, since args seem to get passed to
                #  us via application_openFile_ automatically when run with 
pythonw.
                #  Note: When using py2app, argv_emulation should be disabled.
                #pass
                if args and args[0].startswith("-psn"):
                        # Launched from MacOSX Finder -- wait for file open/app 
launch messages
                        pass
                else:
                        # Not launched from Finder or using argv emulation
                        self._ns_app.using_clargs = True
                        GApplication.process_args(self, args)

        def run(self):
                try:
                        GApplication.run(self)
                except (KeyboardInterrupt, SystemExit):
                        pass
                except:
                        traceback.print_exc()
                #  A py2app bundled application seems to crash on exit if we 
don't
                #  bail out really quickly here (Python 2.3, PyObjC 1.3.7, 
py2app 0.2.1,
                #  MacOSX 10.4.4)
                os._exit(0)

#------------------------------------------------------------------------------

_ns_key_event_mask = AppKit.NSKeyDownMask | AppKit.NSKeyUpMask

#------------------------------------------------------------------------------

class _PyGui_NSApplication(NSApplication):

        pygui_app = None
        files_opened = False
        using_clargs = False

        def sendEvent_(self, ns_event):
                #  Perform special processing of key events.
                #  Perform menu setup when menu bar is clicked.
                #  Remember the most recent mouse-moved event to use as the
                #  location of event types which do not have a location 
themselves.
                if pending_exception:
                        raise_pending_exception()
                ns_type = ns_event.type()
                #print "sendEvent_:", ns_event ###
                if (1 << ns_type) & _ns_key_event_mask:
                        self.process_key_event(ns_event)
                else:
                        if ns_type == NSMouseMoved:
                                global ns_last_mouse_moved_event
                                ns_last_mouse_moved_event = ns_event
                        elif ns_type == NSSystemDefined and ns_event.subtype() 
== 7 \
                                        and not ns_event.window():
                                # Mouse down in the menu bar. We detect it by 
means of this strange
                                # event because mouse-down events in the menu 
bar don't make it to
                                # sendEvent: until it's too late.
                                self.perform_menu_setup()
                        NSApplication.sendEvent_(self, ns_event)
        
        def process_key_event(self, ns_event):
                #  Perform menu setup before command-key events.
                #  Send non-command key events to associated window if any,
                #  otherwise pass them to the pygui application. This is 
necessary
                #  because otherwise there is no way of receiving key events 
when
                #  there are no windows.
                if ns_event.modifierFlags() & NSCommandKeyMask:
                        self.perform_menu_setup()
                        NSApplication.sendEvent_(self, ns_event)
                else:
                        ns_window = ns_event.window()
                        if ns_window:
                                ns_window.sendEvent_(ns_event)
                        else:
                                self.pass_event_to_application(ns_event)
        
        def perform_menu_setup(self):
                app = self.pygui_app
                if app:
                        app._perform_menu_setup()
        
        def pass_event_to_application(self, ns_event):
                app = self.pygui_app
                if app:
                        event = Event(ns_event)
                        app.handle(event.kind, event)

#       def sendAction_to_from_(self, action, target, sender):
#               print "_PyGui_NSApplication.sendAction_to_from_",  action, 
target, sender ###
#               return NSApplication.sendAction_to_from_(self, action, target, 
sender)

        def menuSelection_(self, ns_menu_item):
                command = ns_menu_item.representedObject()
                index = ns_menu_item.tag()
                if index >= 0:
                        self.dispatch_to_app(command, index)
                else:
                        self.dispatch_to_app(command)
        
        def dispatch_to_app(self, *args):
                app = self.pygui_app
                if app:
                        app.dispatch(*args)
        
        def validateMenuItem_(self, item):
                return False
        
        def undo_(self, sender):
                self.dispatch_to_app('undo_cmd')

        def redo_(self, sender):
                self.dispatch_to_app('redo_cmd')

        def cut_(self, sender):
                self.dispatch_to_app('cut_cmd')

        def copy_(self, sender):
                self.dispatch_to_app('copy_cmd')

        def paste_(self, sender):
                self.dispatch_to_app('paste_cmd')

        def clear_(self, sender):
                self.dispatch_to_app('clear_cmd')

        def select_all_(self, sender):
                self.dispatch_to_app('select_all_cmd')

        def init_application_name(self):
                #  Arrange for the application name to be used as the title
                #  of the application menu.
                ns_bundle = NSBundle.mainBundle()
                if ns_bundle:
                        ns_info = ns_bundle.localizedInfoDictionary()
                        if ns_info:
                                if ns_info['CFBundleName'] == "Python":
                                        ns_info['CFBundleName'] = 
GApplications.application_name
                                return
                #raise RuntimeError("No bundle information found. "
                #       "Perhaps the application was not run with pythonw?")
        
        def application_openFile_(self, ns_app, path):
                if self.using_clargs:
                        True
                #print "PyGUI_NSApplication.application_openFile_:", path ###
                # Bizarrely, argv[0] gets passed to application_openFile_ under
                # some circumstances. We don't want to try to open it!
                if path == sys.argv[0]:
                        return True
                self.files_opened = True
                try:
                        self.pygui_app.open_path(path)
                        return True
                except Exception, e:
                        self.pygui_app.report_error()
                        return False
        
        def applicationDidFinishLaunching_(self, notification):
                if self.using_clargs:
                        return
                #print "PyGUI_NSApplication.applicationDidFinishLaunching_"
                try:
                        if not self.files_opened:
                                self.pygui_app.open_app()
                except Exception, e:
                        self.pygui_app.report_error()
                        return False

#------------------------------------------------------------------------------

pending_exception = None

def raise_pending_exception():
        global pending_exception
        exc_type, exc_value, exc_tb = pending_exception
        pending_exception = None
        raise exc_type, exc_value, exc_tb

def create_ns_application():
        global ns_application
        ns_application = _PyGui_NSApplication.sharedApplication()
        ns_application.setDelegate_(ns_application)

ns_screen_height = NSScreen.mainScreen().frame().size.height

#------------------------------------------------------------------------------

# Disable this for now, since MachSignals.signal segfaults. :-(
#
#def _install_sigint_handler():
#               print "_install_sigint_handler" ###
#               from Foundation import NSRunLoop
#               run_loop = NSRunLoop.currentRunLoop()
#               if not run_loop:
#                       print "...No current run loop" ###
#                       sys.exit(1) ###
#               MachSignals.signal(signal.SIGINT, _sigint_handler)
#               #from PyObjCTools.AppHelper import installMachInterrupt
#               #installMachInterrupt()
#               print "...done" ###
#
#def _sigint_handler(signum):
#       print "_sigint_handler" ###
#       raise KeyboardInterrupt

#def _install_sigint_handler():
#       import signal
#       signal.signal(signal.SIGINT, _raise_keyboard_interrupt)
#
#def _raise_keyboard_interrupt(signum, frame):
#       raise KeyboardInterrupt

#_install_sigint_handler()
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to