Hello,

I have a problem with the GIOSource wrapper. In the attached test
program I'm using either

    a) gobject.io_add_watch() or

    b) gobject.iosource.add_poll_fd() and gobject.iosource.attach()

to listen on a pipe in the glib main context with the following result:

    a) works like a charm (see the dialog being updated every second).

    b) just produces the endlessly repeated error output

        AttributeError: prepare
        AttributeError: check

Use "use_poll_fd={False/True}" to switch between a) and b).
Can someone guess what's going wrong?

Best Regards,

  Martin


P.S.: Background: version b) helps me to port the program to win32. I
have already implemented an overlapping i/o version of
_multiprocessing.PipeConnection (in python using pywin32). I just need
to hook the win32 event handle into the glib main context like in
version b) of attached code ...

#! /usr/bin/env python

import time

import multiprocessing

import gtk
import glib
import gobject



# -----------------------------------------------
# background process
# -----------------------------------------------

def client (conn_client):
    while True:
        if conn_client.poll(1):
            break
        t = time.localtime()
        msg = str(t.tm_year) + '-' + str(t.tm_mon) + '-' + str(t.tm_mday) + ', ' + str(t.tm_hour) + ':' + str(t.tm_min) + ':' + str(t.tm_sec)
        conn_client.send_bytes(msg)



# -----------------------------------------------
# dialog
# -----------------------------------------------

class ServerDialog (gtk.Dialog):
    
    def __init__(self, conn_server):
        gtk.Dialog.__init__(self, title="Hello World", buttons=(gtk.STOCK_CLOSE,gtk.RESPONSE_ACCEPT))
        self.label  = gtk.Label("Last Messages:\nN/A")
        self.get_content_area().pack_start(self.label)
        self.conn_server = conn_server
    
    def destroy(self):
        self.label = None
        self.conn_server = None
        gtk.Dialog.destroy(self)
    
    def process_message(self, source, condition):
        msg = self.conn_server.recv_bytes()
        self.label.set_text("Last Messages:\n" + msg)
        return True



# -----------------------------------------------
# main program
# -----------------------------------------------

if __name__ == '__main__':
    
    use_poll_fd = True   # set to True to stimulate bug
    
    # prepare pipe
    conn_server, conn_client = multiprocessing.Pipe()
    
    # create dialog
    dialog = ServerDialog(conn_server)
    
    # attach a new io source to the main context
    dialog.conn_server = conn_server
    if not use_poll_fd:
        io_source_server = gobject.io_add_watch(conn_server.fileno(), gobject.IO_IN, dialog.process_message)
    else:
        poll_fd_server = gobject.PollFD(conn_server.fileno(), gobject.IO_IN)
        io_source_server = gobject.Source()
        io_source_server.set_callback(dialog.process_message)
        io_source_server.add_poll(poll_fd_server)
        io_source_server.attach(glib.main_context_default())
    
    # start background process
    client = multiprocessing.Process(target=client, args=(conn_client,))
    client.start()
    del conn_client
    
    # run the gtk main event loop
    dialog.show_all()
    dialog.run()
    print "finished"
    
    # cleanup
    if not use_poll_fd:
        gobject.source_remove(io_source_server)
        del io_source_server
    else:
        io_source_server.destroy()
        del io_source_server
        del poll_fd_server
    conn_server.send_bytes("quit")
    client.join(1)
    del client
    del conn_server
    dialog.destroy()
    del dialog

_______________________________________________
pygtk mailing list   pygtk@daa.com.au
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://faq.pygtk.org/

Reply via email to