pygtk textview getbuffer并同时写入

时间:2012-12-29 00:46:53

标签: python multithreading textview pygtk

我正在尝试创建一个程序(在python中),当我写它时写入文件并打开到我已经创建的某个窗口。我已经看到了allarund的可用性,但它似乎是多个线程可能是唯一的选择。

我希望当选项自动运行“激活”时它会:

while 1:
    wbuffer = textview.get_buffer()
    text = wbuffer.get_text(wbuffer.get_start_iter(), wbuffer.get_end_iter())
    openfile = open(filename,"w")
    openfile.write(text)
    openfile.close() 

我正在使用pygtk并且有一个textview窗口,但是当我得到缓冲区时它会永远存在。 我想我需要多线程并对其进行排队,这样一个线程就会在排队时编写缓冲区。

我的来源是here。 (我认为声明在第177行。)

非常感谢任何帮助。 :)

这是函数:

def autorun(save):
    filename = None
    chooser = gtk.FileChooserDialog("Save File...", None,
                                    gtk.FILE_CHOOSER_ACTION_SAVE,
                                    (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
                                     gtk.STOCK_SAVE, gtk.RESPONSE_OK))

    response = chooser.run()
    if response == gtk.RESPONSE_OK: filename = chooser.get_filename()
    filen = filename
    addr = (filename)
    addressbar.set_text("file://" + filename)
    web.open(addr)
    chooser.destroy()
    wbuffer = textview.get_buffer()
    while 1:
      text = wbuffer.get_text(wbuffer.get_start_iter(), wbuffer.get_end_iter())
      time.sleep(1)
      openfile = open(filename,"w")
      openfile.write(text)
      openfile.close()  

1 个答案:

答案 0 :(得分:0)

虽然不太容易确切地看到这里没有包含你的GTK内容,但主要问题是控件需要返回到gtk主循环。否则该程序将挂起。

所以如果你有一个漫长的过程(就像这里的永恒过程),那么你需要线程化它。问题是当主程序退出时你需要线程很好地退出,所以你必须重新设计一下。此外,需要正确初始化使用gtk的线程(看here)。

但是,我认为您不需要线程,而是可以将changed的{​​{1}}信号连接到将缓冲区写入目标文件的函数(如果用户已放置) TextBuffer - 模式中的程序。这样做的一个问题是如果缓冲区变大或程序运行缓慢,在这种情况下,您应该考虑线程化autorun信号的回调。因此,此解决方案需要确保您不会遇到保存请求堆叠在一起的情况,因为用户输入的速度比计算机保存的速度快。采取一些设计思路。

所以,最后,更简单的解决方案:您可能不希望缓冲区为每次按下按钮保存。在这种情况下,您可以在timeout上使用保存功能(可能看起来像没有循环的第一个代码块)。只是不要把时间太短。