如何在pygtk中打开第二个窗口后关闭第一个窗口

时间:2013-11-27 12:45:23

标签: python python-2.7 gtk subprocess pygtk

在我的pygtk应用程序中,我想打开下一个窗口后关闭当前窗口。

这是我写的代码

#!/usr/bin/env python

# example base.py

import pygtk
pygtk.require('2.0')
import gtk
import subprocess

class Base:
    def next(self,widget):
        subprocess.call('fabfile.py', shell=True)
        self.window.destroy()

    def __init__(self):
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.set_size_request(200,200)
        self.button = gtk.Button("Hello World")
        self.button.show()
        self.button.connect("clicked", self.next)
        self.window.add(self.button)
        self.window.show()

    def main(self):
        gtk.main()

print __name__
if __name__ == "__main__":
    base = Base()
    base.main()

当我点击next按钮时,它会打开下一个窗口,但它不会在后台关闭我当前的窗口,当前窗口打开下一个窗口后会在后台挂起。

def next(self,widget):
   subprocess.call("scan.py", shell=True)
   self.win.destroy()

当我在window machine中运行此代码时,它不会关闭现有窗口,当我在Linux machine中运行时,它会发出此错误。

/bin/sh: fabfile.py: command not found

任何人都让我知道如何做到这一点。 感谢...

2 个答案:

答案 0 :(得分:1)

试试这个,我希望它会起作用,

import subprocess
proc=subprocess.Popen(["fabfile.py"], bufsize=2048, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
proc.wait()
self.win.destroy()

        import subprocess
        proc=subprocess.Popen(["fabfile.py"], bufsize=2048, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
        completed = False
        while not completed:
            if process.poll() is not None:
                completed = True

        print "communicating"
        process.communicate("k")
        print "communicated"

subprocess.Popen将打开第二个窗口并在当前窗口后关闭。

<强>更新

对于linux,当您使用子进程调用

时,您必须在下面编写代码

该脚本包含CR字符。 shell将这些CR字符解释为参数。

解决方案:使用以下脚本从脚本中删除CR字符。

with open('beak', 'rb+') as f:
    content = f.read()
    f.seek(0)
    f.write(content.replace(b'\r', b''))
    f.truncate()

要获得更多说明,您可以看到 recorded link

答案 1 :(得分:0)

http://www.python.org/doc//current/library/subprocess.html#convenience-functions

  

使用参数运行命令。 等待命令完成,然后返回   returncode属性。

subprocess.call的调用是阻止,win.destroy也不会执行任何GTK功能,直到您的scan.py应用已退出。在C中,你使用GLib中的g_spawn_async,你应该能够找出Python的等价物。或者使用一个帖子。