所以我正在制作一个 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多线程一开始可能有点棘手,但这不是一件难事。
您有两种方法可以这样做:
- 使用
GLib.idle_add
(或GObject.idle_add
,我一直不明白为什么有时它们不一样)更新你的widget 或按照说明进行操作 [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/