Reply
Thread Tools
BrentDC's Avatar
Posts: 903 | Thanked: 632 times | Joined on Apr 2008
#1
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.
__________________
-Brent

Author of TouchSearch -- web searching software for Maemo 5.

Mobile Device lineage: Palm Z22 -> Palm TX -> Nokia N800 -> Nokia N900
 
Posts: 3,319 | Thanked: 5,610 times | Joined on Aug 2008 @ Finland
#2
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()
 

The Following User Says Thank You to attila77 For This Useful Post:
BrentDC's Avatar
Posts: 903 | Thanked: 632 times | Joined on Apr 2008
#3
Hi Attila,

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

Author of TouchSearch -- web searching software for Maemo 5.

Mobile Device lineage: Palm Z22 -> Palm TX -> Nokia N800 -> Nokia N900
 
daperl's Avatar
Posts: 2,427 | Thanked: 2,986 times | Joined on Dec 2007
#4
Try calling this first:

gtk.gdk.threads_init()
__________________
N9: Go white or go home
 

The Following User Says Thank You to daperl For This Useful Post:
BrentDC's Avatar
Posts: 903 | Thanked: 632 times | Joined on Apr 2008
#5
Where would that go? In __init__ or outside the class or inside a specific function? Sorry, I've never used threading before (which is probably painfully obvious).
__________________
-Brent

Author of TouchSearch -- web searching software for Maemo 5.

Mobile Device lineage: Palm Z22 -> Palm TX -> Nokia N800 -> Nokia N900
 
daperl's Avatar
Posts: 2,427 | Thanked: 2,986 times | Joined on Dec 2007
#6
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.
__________________
N9: Go white or go home

Last edited by daperl; 2009-05-20 at 01:51.
 

The Following 2 Users Say Thank You to daperl For This Useful Post:
Posts: 432 | Thanked: 645 times | Joined on Mar 2009
#7
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
 

The Following 5 Users Say Thank You to danielwilms For This Useful Post:
Posts: 3,319 | Thanked: 5,610 times | Joined on Aug 2008 @ Finland
#8
Originally Posted by BrentDC View Post
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.
 

The Following User Says Thank You to attila77 For This Useful Post:
BrentDC's Avatar
Posts: 903 | Thanked: 632 times | Joined on Apr 2008
#9
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().
__________________
-Brent

Author of TouchSearch -- web searching software for Maemo 5.

Mobile Device lineage: Palm Z22 -> Palm TX -> Nokia N800 -> Nokia N900

Last edited by BrentDC; 2009-05-20 at 19:53.
 
BrentDC's Avatar
Posts: 903 | Thanked: 632 times | Joined on Apr 2008
#10
@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.
__________________
-Brent

Author of TouchSearch -- web searching software for Maemo 5.

Mobile Device lineage: Palm Z22 -> Palm TX -> Nokia N800 -> Nokia N900
 
Reply

Tags
clipboard, python, threading


 
Forum Jump


All times are GMT. The time now is 10:58.