我有一个python脚本,它使用selenium来自动化网页,将焦点从需要用户输入的终端上拉开。
在python中有没有以编程方式将焦点切换回终端?
如果重要的话,我将在Windows 7的Windows命令提示符下运行我的程序,但跨平台的答案最有用。
查看win32 API的pywin32
包绑定,我有以下内容:
import win32console
import win32gui
from selenium import webdriver as wd
d = wd.Firefox()
win32gui.SetFocus(win32console.GetConsoleWindow())
win32gui.FlashWindow(win32console.GetConsoleWindow(), False)
input('Should have focus: ')
由于Microsoft无法从其他应用程序获取焦点, SetFocus
会导致错误pywintypes.error: (5, 'SetFocus', 'Access is denied.')
。
FlashWindow
似乎无能为力。
答案 0 :(得分:5)
这是我想出来的,似乎正在发挥作用。
class WindowManager:
def __init__(self):
self._handle = None
def _window_enum_callback( self, hwnd, wildcard ):
if re.match(wildcard, str(win32gui.GetWindowText(hwnd))) != None:
self._handle = hwnd
#CASE SENSITIVE
def find_window_wildcard(self, wildcard):
self._handle = None
win32gui.EnumWindows(self._window_enum_callback, wildcard)
def set_foreground(self):
win32gui.ShowWindow(self._handle, win32con.SW_RESTORE)
win32gui.SetWindowPos(self._handle,win32con.HWND_NOTOPMOST, 0, 0, 0, 0, win32con.SWP_NOMOVE + win32con.SWP_NOSIZE)
win32gui.SetWindowPos(self._handle,win32con.HWND_TOPMOST, 0, 0, 0, 0, win32con.SWP_NOMOVE + win32con.SWP_NOSIZE)
win32gui.SetWindowPos(self._handle,win32con.HWND_NOTOPMOST, 0, 0, 0, 0, win32con.SWP_SHOWWINDOW + win32con.SWP_NOMOVE + win32con.SWP_NOSIZE)
shell = win32com.client.Dispatch("WScript.Shell")
shell.SendKeys('%')
win32gui.SetForegroundWindow(self._handle)
def find_and_set(self, search):
self.find_window_wildcard(search)
self.set_foreground()
然后找到一个窗口并让它激活,你可以......
w = WindowManager()
w.find_and_set(".*cmd.exe*")
这是在python 2.7中,这里也是我发现的一些链接,解释了为什么你必须经历这么多麻烦来切换活动窗口。
win32gui.SetActiveWindow() ERROR : The specified procedure could not be found
Windows 7: how to bring a window to the front no matter what other window has focus?
答案 1 :(得分:0)
这并没有真正回答你的问题,但简单的解决方案是不要把焦点放在首位:
driver = webdriver.PhantomJS()
# ...
PhantomJS
webdriver没有任何UI,因此不会窃取焦点。
答案 2 :(得分:0)
要获得焦点,请查看评论this answer。
跨平台方法可以将Tkinter用于用户GUI,因为它具有抓取和设置窗口焦点的方法。
答案 3 :(得分:0)
如果您不希望清除matplotlib框架中显示的任何数字(我相信通常情况下是希望将焦点重新放回控制台以供用户输入),请简单地使用以下方法:
plt.close("all")