pygtk textview getbuffer and write at the same time



我正在尝试制作一个程序(在python中),当我写它时,它会写入文件并打开到我已经创建的某个窗口。我四处寻找一个可行的解决方案,但似乎多线程可能是唯一的选择。

我希望当选项自动运行被"激活"时,它将:

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窗口,但当我得到缓冲区,它永远坐着。我认为我需要多线程它和队列,所以一个线程将写入缓冲区,而它正在排队。

我的来源在这里。(我想语句应该在第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()  

虽然不太容易看到这里没有包含的gtk内容在做什么,但主要问题是需要将控件返回到gtk主循环。否则程序将挂起。

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

然而,我不认为你需要线程,相反,你可以将TextBufferchanged信号连接到一个将缓冲区写入目标文件的函数(如果用户已将程序置于autorun模式)。这样做的一个问题是,如果缓冲区变大或程序变慢,在这种情况下,您应该考虑线程化changed信号的回调。所以这个解决方案需要确保你不会因为用户打字的速度比计算机保存的速度快而导致保存请求堆叠在一起。需要一些设计思想

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

相关内容

最新更新