Open .gif or image in Safari?
Try this, it should open Safari, after having started your web server:
from objc_util import nsurl,UIApplication from socket import gethostname app = UIApplication.sharedApplication() URL = 'http://%s.local:8080' % gethostname()+'/Backup.zip' # or other file name of course app.openURL_(nsurl(URL))
This functions in Python2 but you can use tool for converting to python3 because SimpleHTTPServer does no more exist in Python3
#!python2 # coding: utf-8 from SimpleHTTPServer import SimpleHTTPRequestHandler import os import shutil import tempfile import shutil import webbrowser import urllib import time from objc_util import nsurl,UIApplication from socket import gethostname PORT = 8080 if __name__ == '__main__': doc_path = os.path.expanduser('~/Documents') os.chdir(doc_path) from BaseHTTPServer import HTTPServer server = HTTPServer(('', PORT), SimpleHTTPRequestHandler) app = UIApplication.sharedApplication() URL = 'http://%s.local:8080' % gethostname()+'/IMG_5126.JPG' app.openURL_(nsurl(URL)) try: server.serve_forever() except KeyboardInterrupt: server.shutdown() print('Server stopped')
dgelessus last edited by dgelessus
@cvp I think the
SimpleHTTPServermodules were moved into a single
http.servermodule in Python 3.
Out of curiosity, is there any reason to use
UIApplication.sharedApplication().openURL_(nsurl(...))instead of just
webbrowser.open(...)? If you want to open the URL in the real Safari browser instead of Pythonista's built-in browser, you can use the fake
safari-httpsURL schemes. No need for
Oh, and you can use
localhostas the host name if you want to access the current device.
localhostis always guaranteed to work, but the name returned by
gethostname()sometimes doesn't, for example when you have no network connection.
donnieh last edited by donnieh
The goal is just to load a local .gif into Safari, nothing fancy. I have seen other apps do it using Openin (I think). I am trying to add the feature to my Pythonista script. I am not picky on how it is done. The shared application idea seems interesting...
If it is not likely to do this, I will just have to use a ui.webview() within the script.
It's more than interesting, it exactly does what you asked 😀
@dgelessus You're right but if I ask Pythonista to convert it into Python3, it uses http.server and the script has an execution error...
I am staying in Python 2. I have come so far in my learning and Python 3 seems to throw a wrench in it. :)
My error, conversion 2 to 3 is ok but I had left the #!python2 line, shame on me 😢
JonB last edited by
@donnieh another option might be encoding as a data: url.
@JonB Is there a code example doing something similar?
JonB last edited by
stupid question... but what are you trying to achieve? Why not use the internal browser for this?
@JonB I have an app almost ready to go on the AppStore. It is full of animated electronic circuit diagrams. If I added a feature for the gif diagram to be opened up in Safari, without much work I could have the save to camera roll, pinch to zoom, Workflows, and other share/extension functionality etc that safari has.
I do understand Pythonista can do all this, but I was going to do the Safari way for now to save time. Otherwise, I will suck it up and do all the in app code.
I will try the Objectice-C method. I very well could try the built in web browser, I can't argue that.
P.S. I also just realized imageview now animates gifs as where I don't think it worked a few years ago ( I think...).
dgelessus last edited by
If you want the user to be able to view, save and share the file, you could also use
console.quicklookis very similar to what you would also achieve with Safari, with the advantage that you don't have to leave the app.
And you have also webview
import ui import os class MyView(ui.View): def __init__(self,w,h): self.width = w self.height = h wv = ui.WebView(frame=(0,0,w,h)) doc_path = os.path.expanduser('~/Documents') file_path = os.path.join(doc_path,'IMG_5126.JPG') # your file name of course wv.load_url('file://'+file_path) self.add_subview(wv) #w, h = ui.get_screen_size() w, h = (540,620) back = MyView(w, h) back.present('sheet')
Ok! That's sound legit. Thank you!