【问题标题】:Open URL and return to shell打开 URL 并返回 shell
【发布时间】:2014-09-18 11:57:51
【问题描述】:

我正在 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:在后台打开网页,因此永远不会离开 shell。
解决方案#3:给 shell 窗口一个“总是在最前面”的属性。

有什么想法吗?

【问题讨论】:

  • 要在屏幕上同时显示提示和图像,您可以创建一个简单的 GUI:答案的文本字段和嵌入的 pywebgtk 或 qt 的 webkit 小部件与页面。或者使用 selenium webdriver 在浏览器中显示一个带有问题的 javascript 消息框。
  • 这将在什么操作系统上运行?
  • 致 J.F.:我已经通过拆分窗口将它们都显示在屏幕上,这不是问题。问题是如果不执行诸如单击或 alt-tab 之类的中间操作,我就无法为 shell 提供输入。致 Staven:操作系统通常是 Windows 7。
  • @dinos66:我建议的两种解决方案都可以解决焦点问题,例如,look at my answers for the related question:开始输入不需要额外的操作。
  • 你试过ipython吗?它允许您内联显示图像(QtConsoleweb browser)。

标签: python shell openurl always-on-top


【解决方案1】:

窗口

这是使用 Python 2.7.8 测试的,带有 double AppActivate trick posted by partybuddhasleep trick posted by 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后激活。

【讨论】:

  • 我能找到的唯一解决方案是使用 tkinter 和一系列始终位于顶部的输入按钮。这不应该那么难,对吧? @Nick Russo:所以您实际上可以通过 OS X 中的脚本获得对窗口的关注?我没有 mac,所以我实际上无法验证它是否是一个解决方案。
  • 是的,Applescript 提供了一种处理特定应用程序并告诉它们执行操作的方法。在这种情况下,代码最终会告诉终端激活。
  • 对不起尼克,但我似乎无法让它工作。它对于第一个 url 运行良好,但在第二个之后仍然不会将焦点返回到 shell。尝试增加延迟无济于事。此外,它仅适用于 python 的命令行,不适用于 Idle IDE。但是,我正在运行 python 3.3;也许这就是问题所在。感谢您的宝贵时间!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    相关资源
    最近更新 更多