python - 如何从不同的进程修改 TextView ?

标签 python twitter gtk pygtk multiprocessing

所以我正在制作一个 GUI 来获取推文。我制作了一个事件框,它可以接收信号并更改 TextView 。 我正在使用多处理来更改 TextView ,但它并没有改变。我什至尝试更改窗口的大小。但是什么都没有改变。我可以获得 TextView 的文本缓冲区,但无法更改它。

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 中设置文本。

最佳答案

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

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,我一直不明白为什么有时它们不一样)更新你的widget
  2. 或按照说明进行操作 [here] .它基本上是这样说的:

    • 在调用 Gtk.main() 之前调用以下方法:

       GObject.threads_init()
       Gdk.threads_init()
      
    • 在您的线程中,将更新 Gtk 小部件的代码括起来:

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

关于python - 如何从不同的进程修改 TextView ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9273476/

相关文章:

Python Pandas "Error: Could not install packages due to an OSError: No such file or directory:"

iphone - iPhone 的共享 API 按钮

php - 推特 API 问题

javascript - 在隐藏的 div 中加载 Twitter 关注按钮

c - 为什么要使用 GLib 函数?

python - 有没有办法使用 Django 为 SQL 表概念指定列的创建顺序?

python - 从字典列表创建字典子集

python - GTK+ : Resize widget with mouse

macos - lablgtk 在 Mac 上找不到 gtk+ 2.0

python - 在 Python 中使用 API 创建 Google Cloud Function