我编写了一个程序,使用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语句的参数从图像输入信息将非常感谢!
答案 0 :(得分:0)
我有一个类似的问题。我通过this answer中所述的方法解决了该问题(另请参见here和here)
shell = win32com.client.Dispatch("WScript.Shell")
shell.SendKeys('%')
此魔术咒语将Alt键(发送到当前处于活动状态的任何窗口?)发送,并神奇地使目标窗口(即hwnd)接受SetForegroundWindow
请求。这对SetFocus
没有帮助。
您可以将这两行放在win32gui.SetForegroundWindow(hwnd)
行上方。