maemo.org - Talk

maemo.org - Talk (https://talk.maemo.org/index.php)
-   Development (https://talk.maemo.org/forumdisplay.php?f=13)
-   -   Python: Why doesn't this work? (https://talk.maemo.org/showthread.php?t=29069)

BrentDC 2009-05-19 21:43

Python: Why doesn't this work?
 
It seems like I've spent hours today trying to get something seemingly very simple to work, but have been unable to *bangs head on table*.

I'm trying to create a class, that when called, spawns into a new thread (as to allow the calling code to keep running) and prints out the current contents of the clipboard every 2 seconds. In reality, I'll create gtk.MenuItems from the polled history, so this is more or less just a test to see if I can get the basics of the code to work.

Here it is:
Code:

import threading
import gtk
import time

class Clipboard(threading.Thread):
  def __init__(self):
      threading.Thread.__init__(self)
      while(True): # Forever loop
        self.clip = self.get_clipboard()
        time.sleep(2)
     
  def get_clipboard(self):
      clip = gtk.clipboard_get(gtk.gdk.SELECTION_CLIPBOARD)
      print 1
      text = clip.request_text(self.get_text)
     
  def get_text(self, clipboard, text):
      print 2
      print text
     
Clipboard().start()

This code doesn't work at all. self.get_text is never called (that is why the print 1 and print 2 statements are there). I'm wondering, why?

Is it because I'm not actually using the gtk mainloop? Or is the threading messing with something?

This is mostly a backend class, and I didn't want to involve gtk in the first place, but there doesn't seem to be a way to access the clipboard otherwise.

Any help, and suggestions on a more elegant solution, is very much needed!

Thanks.

attila77 2009-05-19 21:46

Re: Python: Why doesn't this work?
 
Code:

import threading
import gtk
import time

class Clipboard(threading.Thread):
  def __init__(self):
      threading.Thread.__init__(self)

  def run(self):
      while(True): # Forever loop
        self.clip = self.get_clipboard()
        time.sleep(2)
     
  def get_clipboard(self):
      clip = gtk.clipboard_get(gtk.gdk.SELECTION_CLIPBOARD)
      print 1
      text = clip.request_text(self.get_text)
     
  def get_text(self, clipboard, text):
      print 2
      print text
     
Clipboard().start()


BrentDC 2009-05-19 23:21

Re: Python: Why doesn't this work?
 
Hi Attila,

As far as I can tell, that still doesn't work. 2 still isn't printed (nor is the clipboard contents).

daperl 2009-05-20 00:34

Re: Python: Why doesn't this work?
 
Try calling this first:

gtk.gdk.threads_init()

BrentDC 2009-05-20 01:13

Re: Python: Why doesn't this work?
 
Where would that go? In __init__ or outside the class or inside a specific function? Sorry, I've never used threading before :o (which is probably painfully obvious).

daperl 2009-05-20 01:48

Re: Python: Why doesn't this work?
 
I put it here:

Code:

if __name__ == "__main__":
    gtk.gdk.threads_init()

    ...

    gtk.main()

Do you have a main section like the one above? If not, I would put it above this line:

Clipboard().start()

EDIT:

I think it's only suppose to be called once per main loop.

danielwilms 2009-05-20 06:46

Re: Python: Why doesn't this work?
 
hey,

daperl is right, you have to initialise the thread in the main loop otherwise it would not work. BTW, where is your main loop?!? ;) To get a better understanding try this and some help tutorial how to implement it you will find here, even though I do not agree with the title of the blog entry ;) It might be easier to blog than to put it into a wiki, but it is definitely easier to find in a properly organised wiki. Actually there were so many questions related to Qt and GTK in the last couple of days which could be interesting for everyone, that I think it would be worth it to create a Qt and GTK Q&A section in the wiki as the first starting point with small issues (mostly related to maemo) or like this here...what do you think?

Cheers Daniel

attila77 2009-05-20 08:27

Re: Python: Why doesn't this work?
 
Quote:

Originally Posted by BrentDC (Post 288681)
Hi Attila,

As far as I can tell, that still doesn't work. 2 still isn't printed (nor is the clipboard contents).

That's related to gtk, I just added the run so the threading works. I thought this was just a snippet, as people say here, you need to start a main loop somewhere.

BrentDC 2009-05-20 19:37

Re: Python: Why doesn't this work?
 
Thanks for all the replies! I followed everyones advice -- no seriously, I used Attila's run() function, daperl's gtk.gdk.threads_init() code, and daniel's threading and mainloop tips -- and now it actually works.

The only problem now, is I'm getting the strangest xlib crashes occasionally, I think my threading is "not quite right". I'll look into it.

A round of Thanks in me! :)

Edit: I (think) I fixed the crashing by wrapping all gtk calls in my clipboard class with gtk.gdk.threads_enter() and *_leave(). :)

BrentDC 2009-05-20 19:58

Re: Python: Why doesn't this work?
 
@Daniel:

If you think that there are some frequently asked questions about GTK/QT programming, that specifically relates to Maemo, then I think putting that in the Wiki would be great. :)


All times are GMT. The time now is 22:59.

vBulletin® Version 3.8.8