我使用Bokeh包生成地图以显示模拟结果.输出是具有交互性的html格式的单独地图.各个地图需要交互性.
请参阅此链接以获取示例:
http://bokeh.pydata.org/en/0.10.0/docs/gallery/texas.html
模拟可以自动设置为运行多次,并为每次运行生成一个映射.这可能是100的地图.我希望能够将地图拼接在一起以创建电影 - 这不需要交互性.Bokeh具有通过浏览器创建PNG文件的功能,因此可以手动将每个地图保存为文件,并使用ffmpeg创建电影.但是,如果你需要为100个文件做这个,那么这不是一个真正的选择.目前没有办法通过Bokeh自动生成PNG文件,但我相信它会在某些时候添加.
所以我需要一个解决方法.我的想法是从他们存储在本地驱动器上的位置打开每个html文件,拍摄屏幕截图,裁剪图像以保留所需的部分并保存.但我还没有找到一个有效的解决方案.
裁剪图像很简单:
from PIL import Image
img = Image.open(file_name)
box = (1, 1, 1000, 1000)
area = img.crop(box)
area.save('saved_image', 'jpeg')
Run Code Online (Sandbox Code Playgroud)
我的问题是打开html文件并首先拍摄屏幕截图以提供上述代码.
为此我尝试了以下内容,但都需要URL而不是html文件.另外两个都使用Firefox不适合我,但我已经安装了chrome并适当地修改了代码.
如何在python中使用Selenium WebDriver进行部分截图?
http://www.idiotinside.com/2015/10/20/take-screenshot-selenium-python/
我的代码是:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('file_name')
driver.save_screenshot('image.png')
driver.quit()
Run Code Online (Sandbox Code Playgroud)
哪个回报:
{"code":-32603,"message":"Cannot navigate to invalid URL"}
Run Code Online (Sandbox Code Playgroud)
显然,文件名不是网址,因此很清楚.如果你把它传递给一个网站,它的工作正常.获取html加载和拍照的任何帮助将不胜感激!它不必涉及Selenium.
我正在关注本教程,该教程与屏幕交互但是为Windows操作系统完成,因为在Google中没有ImageGrab
import numpy as np
from PIL import ImageGrab
import cv2
import time
def screen_record():
last_time = time.time()
while(True):
# 800x600 windowed mode
printscreen = np.array(ImageGrab.grab(bbox=(0,40,800,640)))
print('loop took {} seconds'.format(time.time()-last_time))
last_time = time.time()
cv2.imshow('window',cv2.cvtColor(printscreen, cv2.COLOR_BGR2RGB))
if cv2.waitKey(25) & 0xFF == ord('q'):
cv2.destroyAllWindows()
break
Run Code Online (Sandbox Code Playgroud)
是否有ImageGrab的替代方案或更好的切换操作系统?
我有一个脚本不断通过 PIL ImageGrab 截取屏幕截图。代码如下所示:
def updateScreenshot(self):
self.screen = ImageGrab.grab()
Run Code Online (Sandbox Code Playgroud)
该updateScreenshot()函数被调用的频率很高,比如每秒 2-3 次。该脚本运行良好,直到我重构该类并将所有屏幕截图相关代码移至封装所有屏幕截图逻辑的外部模型类。现在我的主类有:
self.screenshotService = ScreenshotService()
Run Code Online (Sandbox Code Playgroud)
在它的__init__ 函数中。然后 ScreenshotService 会被触发updateScreenshot()。前几次尝试updateScreenshot()仍然有效,之后出现以下错误:
File "...\screenshotService.py", line 15, in updateScreenshot
self.screen = ImageGrab.grab()
File "C:\Python34\lib\site-packages\PIL\ImageGrab.py", line 31, in grab
size, data = grabber()
Run Code Online (Sandbox Code Playgroud)
我发现:
但这些并没有真正为我指明正确的方向。
有任何想法吗?谢谢。
Python 3.4,PIL:5.4.1
我正在使用PyQt(作为Python初学者).我需要能够在无头系统上截取网站的屏幕截图.我之前使用的是PhantomJS用于另一个项目,但他们在1.5中删除了Flash支持,我不想依赖于我的新项目弃用的1.4版本.
所以我正在使用PyQt自己做我的东西.我可以用一个给定的网址截取一个网站的截图,没问题.
但我一直在Flash占位符上有"蓝色骰子"flash插件图标(是的,javascript和插件被激活)
self.settings.setAttribute(QtWebKit.QWebSettings.PluginsEnabled,True)
self.settings.setAttribute(QtWebKit.QWebSettings.JavascriptEnabled,True)
Run Code Online (Sandbox Code Playgroud)
我正在Youtube视频页面上进行一些测试,这是我的问题的一个例子:

第二部分,可能与第一部分有关:如何告诉PyQt在拍摄截图之前等待几秒钟?正如您在示例中看到的那样,右侧的图像仍然被卸载,因为它们是使用javascript和data属性加载的,在我的脚本中,我在loadFinished信号(onLoad()等效的javascript)上截取屏幕截图.
我的第一个猜测就是
time.sleep(2)
Run Code Online (Sandbox Code Playgroud)
在调用我的捕获方法之前,它不起作用.我假设在这个休眠时间内Webkit加载也处于睡眠状态,防止在页面上加载任何内容.
我试图创建一个自定义信号,但后来我仍然不知道如何在不睡觉的情况下触发它.
我的最后一个猜测是我需要线程化我的应用程序.我对吗?
如果您有任何提示/脚本来帮助我显示Flash内容和/或添加类似信号的setTimeout,我将非常感激!
在此先感谢您的帮助.
编辑: 只需快速编辑即可添加我的解决方案:
timeoutTimer = QTimer()
timeoutTimer.setInterval(3000) # wait for 3secs
timeoutTimer.setSingleShot(True)
timeoutTimer.timeout.connect(theMethodToCallOnTimeout)
Run Code Online (Sandbox Code Playgroud)
关于flash事物:看起来像OSX上的flash播放器坏了(可能与32/64位问题有关).
我花了3天时间在谷歌搜索,如何使用PyGTK + 3创建屏幕截图?有关pyqt,pygtk + 2,wx和PIL的gallizion教程.
顺便说一下,我不需要像scrot,imlib2,imagemagick等外部程序.
有各种方法可以在Windows中截取正在运行的应用程序的屏幕截图.但是,我听说可以定制一个应用程序,以便通过某些Windows事件处理程序可以注意到截取屏幕截图的时间吗?是否有任何方法可以截取屏幕截图,使应用程序无法注意到?(甚至可能在VM中运行应用程序,并从主机获取屏幕截图?)我更喜欢Python中的解决方案,但任何事情都可以.