Welcome!
This is the community forum for my apps Pythonista and Editorial.
For individual support questions, you can also send an email. If you have a very short question or just want to say hello — I'm @olemoritz on Twitter.
pip install gestures, WKWebView, UI animations and more
-
@bennr01, a big thank you! for all you do to keep us stashed & pipped.
-
-
@mikael Just a tiny correction, please correct me if I’m wrong. In the multipeer readme it says one should use <pip install multipeer> to install your module, which doesn’t work. You probably meant <pip install pythonista-multipeer>.
-
@Drizzel, thank you, fixed. Multipeer was my first PyPi exercise, and my naming convention was still evolving – meaning, I did not yet know how to give a module a different name in site-packages and PyPi. :-)
-
Hi, I tested one demo code in readme of pythonista-wkwebview
class MagicWebView(WKWebView): def on_magic(self, message): print('WKWebView magic ' + message) html = ''' <body> <button onclick="window.webkit.messageHandlers.magic.postMessage(\'spell\')"> Cast a spell </button> </body> ''' v = MagicWebView() v.load_html(html)
Well it works good, but when I try to load html file, the 'on_magic' doesn't work, here's my code in py file
class MagicWebView(WKWebView): def on_magic(self, message): print('WKWebView magic ' + message) v = MagicWebView() v.present() # v.load_html(html) v.load_url('test.html', no_cache=False, timeout=5) v.clear_cache()
I don't know how to fix it
-
@Anxietier try
import os w = WKWebView() f = os.path.abspath('test.html') print(f) w.load_url(f) w.present()
-
@Anxietier, I see the online documentation covers this poorly. Here’s the method docstring:
Loads the contents of the given url asynchronously.
If the url starts with
file://
, loads a local file. If the remaining url starts with/
, path starts from Pythonista root.For remote (non-file) requests, there are two additional options:
- Set
no_cache
toTrue
to skip the local cache, default isFalse
- Set
timeout
to a specific timeout value, default is 10 (seconds)
- Set
-
@Anxietier, you can get this and similar documentation on other methods using the
help
function, e.g. in Pythonista console:>>> import wkwebview >>> help(wkwebview.WKWebView.load_url)
-
@cvp
thanks, but it seems doesn’t work, here’s my test codefile_name = 'test.copy(2).html' file_abs_path = os.path.abspath(file_name) url_file_name = 'file://' + file_name url_file_abs_path = 'file://' + file_abs_path with open(file_name, 'r', encoding='utf8') as f: html = ''.join(f.readlines()) v = MagicWebView() v.present() # v.load_html(html) # can load but button doesn't work # v.load_url(file_name, no_cache=False, timeout=5) # can load but button doesn't work # v.load_url(file_abs_path, no_cache=False, timeout=5) # can load but button doesn't work # v.load_url(url_file_name, no_cache=False, timeout=5) # would let ista crash or load faild # v.load_url(url_file_abs_path, no_cache=False, timeout=5) # doesn't load v.clear_cache()
-
@mikael
I’m not sure if I described my issue clearly, and here’s my another test code, perhaps that would be clearlyfile_name = 'test.copy(2).html' file_abs_path = os.path.abspath(file_name) url_file_name = 'file://' + file_name url_file_abs_path = 'file://' + file_abs_path with open(file_name, 'r', encoding='utf8') as f: html = ''.join(f.readlines()) v = MagicWebView() v.present() # v.load_html(html) # can load but button doesn't work # v.load_url(file_name, no_cache=False, timeout=5) # can load but button doesn't work # v.load_url(file_abs_path, no_cache=False, timeout=5) # can load but button doesn't work # v.load_url(url_file_name, no_cache=False, timeout=5) # would let ista crash or load faild # v.load_url(url_file_abs_path, no_cache=False, timeout=5) # doesn't load v.clear_cache()
-
@Anxietier, I will have to look at this, maybe something has changed in recent iOS versions.
Meanwhile, this:
html = ''.join(f.readlines())
... looks funny, breaking and joining with no change. Just
html = f.read()
should work fine. -
@Anxietier, I placed this script:
import wkwebview class MyWebView(wkwebview.WKWebView): def on_magic(self, message): print('WKWebView magic ' + message) wv = MyWebView() wv.present('fullscreen') wv.load_url('load_url.html')
... and this HTML as the file
load_url.html
in the same directory:<body> <button onclick="window.webkit.messageHandlers.magic.postMessage('spell')"> Cast a spell </button> </body>
And the button works fine. Note that I removed the backlashes in the
onclick
handler as escaping not necessary in a file.I suspect you might have some kind of non-printing character issue.
-
@mikael said:
@Anxietier, have to look at this, maybe something has changed in recent iOS versions.
Meanwhile, this:
html = ''.join(f.readlines())
... looks funny, breaking and joining with no change. Just
html = f.read()
should work fine.much cleaner than i would of. lol
html = ''.join([line for line in f])
-
@mikael
oh I see, I usually use r_string in py, so I didn't notice \' in doc_string
now it works fine
thanks for help -
hi, im back again :D
we know that some browser has non-pic mode (i dont know right name,just like that mean), is it possible to add that feature to wkwebview? for some reason, i just need the full html content (dom-tree maybe?) -
@Anxietier, if you mean ”Reader Mode”, WKWebView does not include it. But you can use a SafariViewController, see @cvp’s code around the middle of this thread.
-
If you just want to parse the HTML, use
requests
. Unless you need JavaScript to run I guess.@mikael isn't there a delegate that would let you filter by uri? I forget if the should_load_uri or whatever gets called for <img>'s -- in which case he could just return false for non-html urls.
-
@JonB, no it does not. Would be good to understand the need a bit more before trying to bend WKWebView to it. For the most part, just fetching the page with requests, then filtering imgs and javascript before giving it to WKwebView might work just as well.
-
@JonB
yeah i need js in script tag to run. some requests is not easy to fake them you know, so i was wandering if i can let webview run in 'read mode' to simulate 'selenium', cause some imgs spend many data traffic, and i dont wanna take double traffic for one img -
@mikael
thanks, it is helpful, i would try to understand them.