在Python GTK中创建新子进程

0 投票
2 回答
1264 浏览
提问于 2025-04-16 09:29

我正在创建一个Python GTK程序,用于在Ubuntu 10.10上上传视频到YouTube。这个程序是通过Googlecl这个包来实现的,想了解更多信息可以自己去查一下。我已经实现了通过以下语法来调用这个程序。

os.system('google youtube post --category %s --title \'%s\' --summary \'%s\' --tags %s %s' % ("Education",title,description,tags,filename)) 

现在这个程序运行得很好,视频可以正常上传到YouTube。不过,上传的时间会根据视频的大小和网络速度有所不同。在上传过程中,我的Python GTK程序会变成灰色(在Ubuntu中会“卡住”,无法响应),用户只能在视频上传完成后才能再次与程序互动。

有没有办法把上传的部分放到一个子进程中,这样用户在视频上传时仍然可以与程序互动?我想显示一个进度条窗口,让用户知道程序还在运行并且工作正常。

为此,我创建了一个进度条窗口,并输入了以下代码。

progress_bar.show()
os.system('google youtube post --category %s --title \'%s\' --summary \'%s\' --tags %s %s' % ("Education",title,description,tags,filename)) 
progressbar.set_fraction(0.5)

但是当我执行程序时,进度条窗口并没有显示,视频正在上传,这导致我的程序在上传完成之前无法响应。

更新:有没有办法像进度条未更新那样来实现?这样我只需要对我的代码做一个小改动,但我不知道在那个方法中提到的while循环while heavy_work_needed的条件是什么。

2 个回答

1

你可以把耗时的操作放在一个单独的线程里去做。PyGTK的常见问题解答里有一个例子,教你怎么把线程和用户界面的更新结合起来(要注意,所有的用户界面更新都应该在Gtk+线程中进行)。

1

在这种情况下,使用os.system是行不通的:当你运行os.system时,它会等到你启动的进程完成后才会继续执行你的代码。也就是说,set_fraction这个方法在视频上传之前是不会被调用的。而且,因为你的应用在上传时“卡在”os.system里,所以进度条也不会显示,Gtk也无法处理像绘图这样的事件。

你可以看看subprocess模块。这个模块可以让你在后台运行上传过程,并且可以知道它什么时候完成。

撰写回答