2012-02-14 36 views
1

所以我正在制作一个GUI来获取推文。我制作了一个可以接收信号并更改文本视图的事件框。 我正在使用多处理来改变文本视图,但它不会改变。我甚至尝试改变窗口的大小。但没有任何变化。我可以获得textview的textbuffer,但无法更改它。如何修改不同进程的文本视图?

import pygtk 
pygtk.require('2.0') 
import gtk 
from multiprocessing import Process 

class multi: 
    def __init__(self): 
     self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) 
     self.window.set_size_request(800,400) 
     self.window.set_title("Twitter Box") 
     self.window.set_border_width(4) 
     self.window.connect("destroy", self.close_application) 

     self.vbox1 = gtk.EventBox() 
     self.vbox1.set_size_request(750,450) 
     self.vbox1.connect('leave_notify_event',self.go_multi) 
     self.window.add(self.vbox1) 
     self.vbox1.show() 

     self.tweetview = gtk.TextView() 
     self.tweetbuffer = self.tweetview.get_buffer() 
     self.tweetbuffer.set_text('Why not working?') 
     self.vbox1.add(self.tweetview) 
     self.tweetview.show() 

     self.window.show() 

    def close_application(self, widget): 
     gtk.main_quit() 

    def go_multi(self, widget, data=None): 
     p = Process(target = self.change_textview) 
     p.start() 
     p.join() 

    def change_textview(self): 
     print 'changing text' 
     startiter = self.tweetbuffer.get_start_iter() 
     enditer = self.tweetbuffer.get_end_iter() 
     text = self.tweetbuffer.get_text(startiter, enditer) 
     print text 
     if text: 
      self.tweetbuffer.set_text('Changed....') 
     else: 
      self.tweetbuffer.set_text('') 
     return 

def main(): 
    multi() 
    gtk.main() 

if __name__ == '__main__': 
    main() 

我正在制作GUI来获取推文。有时,由于连接速度较慢并且GUI冻结,检索时间轴需要很长时间。所以,我想这样做,它会创建一个进程,它将获取时间轴并设置tweetbuffer。但我无法在tweetbuffer中设置文本。

回答

2

我不完全inderstand你为什么这样做:

def go_multi(self, widget, data=None): 
    p = Process(target = self.change_textview) 
    p.start() 
    p.join() 

因为即使在它应该工作的远程可能性中,你基本上都会调用change_textview函数并等待该过程完成。

清除了这个,我认为你根本不需要多处理,而是让你的gui多线程。

首先制作一个Gtk多线程可能有点棘手,但这不是一件困难的事情。
你有这样做的方法有两种:

  1. 更新使用GLib.idle_add窗口小部件(或GObject.idle_add,我从来没有完全理解为什么有时他们是不一样的)
  2. 或者遵循什么解释[here]。它基本上说来:

    • 给你打电话之前,下面的方法调用Gtk.main()

      GObject.threads_init() 
      Gdk.threads_init() 
      
    • 在您的线索,围绕与更新GTK构件代码:

      Gdk.threads_enter() 
      # your code here 
      Gdk.threads_leave() 
      
+0

谢谢!它帮助了我很多。我曾尝试使用多线程,但效果不佳。所以,我尝试了mutliprocessing。 现在我要参加多线程 – Froyo 2012-02-14 09:17:16

+0

@Froyo:这是否意味着您要接受和/或上调我的回答? :D – 2012-02-14 09:27:01

+0

非常感谢!它现在运作良好! – Froyo 2012-02-14 09:49:49

0

如果你仍然想在所有的答案后继续那样:
免责声明:
我不知道这个答案是多么有用。
说明:
我试图用你的逻辑。我还导入Queue以在进程之间共享一些数据。我想这是需要的,因为我从documentation看到。您可以在下面的代码示例中找到其他信息。

import pygtk 
pygtk.require('2.0') 
import gtk 
from multiprocessing import Process, Queue 

class multi: 
    def __init__(self): 
     self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) 
     self.window.set_size_request(800,400) 
     self.window.set_title("Twitter Box") 
     self.window.set_border_width(4) 
     self.window.connect("destroy", self.close_application) 

     self.vbox1 = gtk.EventBox() 
     self.vbox1.set_size_request(750,450) 
     self.vbox1.connect('leave_notify_event',self.go_multi) 
     self.window.add(self.vbox1) 
     self.vbox1.show() 
     self.tweetview = gtk.TextView() 
     self.tweetbuffer = self.tweetview.get_buffer() 
     self.tweetbuffer.set_text('Why not working?') 
     self.vbox1.add(self.tweetview) 
     self.tweetview.show() 

     self.window.show() 

    def close_application(self, widget): 
     gtk.main_quit() 

    def go_multi(self, widget, data=None): 
     q = Queue() 
     p = Process(target = self.change_textview, args=(q,)) 
     p.start() 
     self.tweetbuffer.set_text(q.get()) 
     p.join() 

    def change_textview(self, q): 
     print 'changing text' 
     startiter = self.tweetbuffer.get_start_iter() 
     enditer = self.tweetbuffer.get_end_iter() 
     text = self.tweetbuffer.get_text(startiter, enditer) 
     print text 
     if text: 
      q.put(('Changed....')) 
     else: 
      q.put(('')) 
def main(): 
    multi() 
    gtk.main() 

if __name__ == '__main__': 
    main() 
+0

每次鼠标指针离开事件框时都会调用go_mulit()! – Froyo 2012-02-14 09:38:13

+0

是的,我发布答案后就看到了。我将编辑答案 – savruk 2012-02-14 09:44:46

相关问题