1

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

I was hoping that when option autorun is "activated" it will:

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()  
4

1 回答 1

0

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

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

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

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

于 2012-12-30T02:01:50.393 回答