5

我在 python 3 上运行一个脚本,它使用 webbrowser.open() 打开一个 URL,并立即需要用户的输入。问题是活动窗口现在是浏览器的窗口而不是 python shell,并且总是需要 Alt-Tab 或单击来提供答案。您可以想象成千上万张图像会令人沮丧。代码很简单:

 for rP in images:
     webbrowser.open(rP)
     decision = str(input('Is image '+str(rP)+' ok?')

我想有三种方法可以解决这个问题,但我似乎无法为其中任何一种找到实现。我尝试了 webbrowser.open() 命令中的 'autoraise' 选项,但无济于事。我猜这两种解决方案都会非常简单,以至于我之后会大吃一惊。

所以:
解决方案#1:在输入行之前有一个命令,使shell窗口而不是浏览器处于活动状态。
解决方案#2:在后台打开网页,因此永远不会离开外壳。
解决方案#3:给 shell 窗口一个“总是在最前面”的属性。

有任何想法吗?

4

2 回答 2

1

视窗

这是使用 Python 2.7.8 测试的,使用了partybuddha 发布的双重 AppActivate 技巧和eryksun发布的睡眠技巧

from webbrowser import open as browse
from win32com.client import Dispatch
from win32gui import GetForegroundWindow
from win32process import GetWindowThreadProcessId
from time import sleep

images=['http://serverfault.com', 'http://stackoverflow.com']

for rP in images:
    _, pid = GetWindowThreadProcessId(GetForegroundWindow())
    browse(rP)
    sleep(1)
    shell = Dispatch("WScript.Shell")
    shell.AppActivate(pid)
    shell.AppActivate(pid)
    decision = raw_input('Is image ' + str(rP) + ' ok? ')

没有 1 秒的睡眠,浏览器保持焦点,好像 AppActivate 发生得太快了。

操作系统

#!/usr/bin/env python
from webbrowser import open as browse
from subprocess import check_output

images=['http://serverfault.com', 'http://stackoverflow.com']

for rP in images:
     term = check_output(['/usr/bin/osascript', '-e',
         'copy path to frontmost application as text to stdout']).strip()
     browse(rP)
     check_output(['/usr/bin/osascript', '-e',
         'tell application "%s" to activate' % term])
     decision = raw_input('Is image ' + str(rP) + ' ok? ')

这段代码是用 Python 2.7.5 测试的,所以它可能需要调整才能与 Python 3 一起工作,但核心思想是使用 osascript 获取最前面的应用程序,然后在浏览器窗口中打开 URL 后激活它。

于 2014-10-06T18:51:32.753 回答
0

如果使用Selenium,焦点自动返回到浏览器后.get()

于 2016-06-16T13:54:03.863 回答