我正在尝试创建一个程序(在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()
答案 0 :(得分:0)
虽然不太容易确切地看到这里没有包含你的GTK内容,但主要问题是控件需要返回到gtk主循环。否则该程序将挂起。
所以如果你有一个漫长的过程(就像这里的永恒过程),那么你需要线程化它。问题是当主程序退出时你需要线程很好地退出,所以你必须重新设计一下。此外,需要正确初始化使用gtk的线程(看here)。
但是,我认为您不需要线程,而是可以将changed
的{{1}}信号连接到将缓冲区写入目标文件的函数(如果用户已放置) TextBuffer
- 模式中的程序。这样做的一个问题是如果缓冲区变大或程序运行缓慢,在这种情况下,您应该考虑线程化autorun
信号的回调。因此,此解决方案需要确保您不会遇到保存请求堆叠在一起的情况,因为用户输入的速度比计算机保存的速度快。采取一些设计思路。
所以,最后,更简单的解决方案:您可能不希望缓冲区为每次按下按钮保存。在这种情况下,您可以在timeout上使用保存功能(可能看起来像没有循环的第一个代码块)。只是不要把时间太短。