Python - 专注于终端窗口,只能通过循环第一次工作

时间:2015-07-03 22:44:17

标签: python python-2.7 win32gui

我编写了一个程序,使用Python 2.7查看.csv文件,其中包含与本地公共档案数据库相关的不同变量(因此,文档标题,年份发布,作者(如果适用)等)。程序识别数据中是否存在空白(例如,没有作者),然后使用原始文档的图像的相应URL来在浏览器窗口中打开图像。然后,如果用户可以在文档的某处找到它,则用户在终端窗口中输入缺失的信息。

为了节省手动制作所需的点击次数,我一直在尝试以编程方式让文件返回到终端窗口,以便在程序在浏览器中打开原始文档图像URL后输入缺少的信息。我当前的解决方案有效,但仅限于第一次观察到错过了一条信息。之后,它在线路上出现错误,告诉它重新聚焦到终端(下面的代码中的最后一行)。这是错误消息:

pywintypes.error: (0, 'SetForegroundWindow', 'No error message is available')

这是我的代码:

#Step 1: read the csv file into python
import csv
import webbrowser
import os
from bs4 import BeautifulSoup
import re
import urllib2
import win32gui
import time

#Function for refocusing on terminal screen --looks for Anaconda, since using Anaconda Python terminal
def enumHandler(hwnd, lParam):
    if win32gui.IsWindowVisible(hwnd):
        if 'Anaconda' in win32gui.GetWindowText(hwnd):
            win32gui.SetForegroundWindow(hwnd)


out = open("missing_info.csv", "rU")
data = csv.reader(out)
data = [row for row in data]
out.close()


#find the first observation that is EMPTY, and start there 
i = 0
for x in range(1, len(data)):
    if data[x][15]=="": 
        i = i + 1
    else: 
        i = i + 0

start = len(data) - i

#Now loop over the observations
for x in range(start, len(data)):
    print ""
    print "This is observation ID number", data[x][0]
    #missing author name only
    if data[x][12]=="1" and data[x][13]=="0" and data[x][14]=="0":
        print "Missing Author Name only"
        url = data[x][10]
        #now get the actual image
        html_content = urllib2.urlopen(url)
        soup = BeautifulSoup(html_content) 
        a = soup.find_all("script") 
        b = str(a) 
        c = re.findall(r"var record.*", b) 
        d = str(c)
        e = re.findall("imageURL.*", d) 
        f = (e[0].encode("utf-8")).replace("var record = ", " ") 
        g = f[11:]
        #now, need everything before the first quotation mark
        h = re.split('"', g)
        i = h[0]
        webbrowser.open_new(i)
        time.sleep(1) #included to give time for image to load before refocusing in the terminal screen
        win32gui.EnumWindows(enumHandler, None) #returns to terminal screen

由于我预计会有人问这个,我已经尝试过使用SetFocus了,但是当我这样做时,我收到一条错误,说访问被拒绝了。作为参考,我使用Anaconda的命令提示符和Anaconda安装的Python 2.7。

任何帮助,找出为什么这适用于第一次观察缺失数据,然后给我一个错误的任何后续观察,适合循环/ if语句的参数从图像输入信息将非常感谢!

1 个答案:

答案 0 :(得分:0)

我有一个类似的问题。我通过this answer中所述的方法解决了该问题(另请参见herehere

shell = win32com.client.Dispatch("WScript.Shell")
shell.SendKeys('%')

此魔术咒语将Alt键(发送到当前处于活动状态的任何窗口?)发送,并神奇地使目标窗口(即hwnd)接受SetForegroundWindow请求。这对SetFocus没有帮助。

您可以将这两行放在win32gui.SetForegroundWindow(hwnd)行上方。