在我的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
任何人都让我知道如何做到这一点。 感谢...
答案 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的等价物。或者使用一个帖子。