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.
Wish list for post 3.3...
-
It's awesome to have official 3.3! Best iOS app ever.
Things I would love to see in the future...
#1 A dark mode for the built-in documentation so I don't turn to dust when I open it every time.
#2 Ability to do a split-screen view showing the Console REPL and a documentation viewer at the same time to allow little experimental doodles while reading the manual.
#3 Python 3.8.x of course. But having only 3.6 is hardly a big limitation at the moment.Things like Pandas and scikit-learn (or even TensorFlow/PyTorch as long as we're dreaming) would be cool, but honestly, I'm pretty happy with the libraries and functionality that's there today. I use Pythonista mostly as a portable testbed for standard Python stuff that ends up on another platform rather than either for iOS app development or trying to do on-device-data-science. I find it the perfect companion for reading Python documentation or books.
Also, I would not be bothered in the least if Python 2.x were dropped completely.
-
Automated formatting and linting (that I can turn on or off). If there is no new user input for x (3?) seconds then isort —> black —> flake8 is run to format and lint the code in the editor. There is a button in the UI (top of the keyboard?) to perform the same steps on demand.
-
Hope can add:
- Comment/uncomment [ cmd+\ ] shortcut;
- [ctrl+up/ctrl+down] for Page up/down;
-
Up to date pre-installed modules
-
I'm pretty new to using Pythonista, so this may be possible and I just haven't discovered the key to it:
- Compiler to export my scripts to a stand alone iOS app. (big wish, but a wish none the less).
I'm using Pythonista to automate processes so the code I build for iOS will typically be used by someone in their work. Getting to a single icon to start the apps would be a huge boon.
-
@KipCarter https://github.com/omz/PythonistaAppTemplate was that capability but it has not been updated in years.
-
@ccc , Thanks, would be nice if it were updated to handle 3x code.
-
@Zoot said:
Ability to do a split-screen view showing the Console REPL and a documentation viewer at the same time to allow little experimental doodles while reading the manual.
Not exactly what you want, but as workaround, you can, on an iPad, use split view with Safari on Pythonista doc and Pythonista console
-
@cvp Yeah, that might be good enough as a general solution these days. Just doesn't work on my crusty old iPad Air. Oh well.
-
@Zoot (not so) quick and (as usual) dirty script to allow a split screen with local documentation and console REPL mode, thus without needing split view of Pythonista and Safari.
top right buttons = navigation in doc
main view is presented as sheet to allow transparency
as console command and output area is overriden by main view,
their buttons are actionned by user buttons at bottom left- edit button to put cursor in command textfield
- previous and next history
y-position of user buttons change when keyboard (dis)appears
program automatically sets console in partial screenPlease, try and give me some feedback.
ThanksAnd, one more time, this app is marvelous, you can (almost) do anything
import console import editor from objc_util import * import ui @on_main_thread def setConsolePartialScreen(): global next_OMTextView_is_console win = ObjCClass('UIApplication').sharedApplication().keyWindow() main_view = win.rootViewController().view() ret = '' next_OMTextView_is_console = False def analyze(v,indent): global next_OMTextView_is_console, console_width,console_view, b_prev, b_next ret = None for sv in v.subviews(): #print(indent,sv._get_objc_classname()) if 'UILabel' in str(sv._get_objc_classname()): next_OMTextView_is_console = str(sv.text()) == '>' elif 'OMTextView' in str(sv._get_objc_classname()): if next_OMTextView_is_console: # this sv is the console TextView console_view = sv console_width = sv.size().width elif 'UIImageView' in str(sv._get_objc_classname()): # <UIImage:0x281108240 named(main: DockAccessoryPanel) {28, 28}> #print(sv.image()) if 'DockAccessoryPanel' in str(sv.image()): b = sv.superview() # button of ImageView if console_width >= (ui.get_screen_size()[0]/3): # simulate tap the partial/full console button UIControlEventTouchUpInside = 255 b.sendActionsForControlEvents_(UIControlEventTouchUpInside) return True elif 'HistoryPrev' in str(sv.image()): b_prev = sv.superview() # button of ImageView elif 'HistoryNext' in str(sv.image()): b_next = sv.superview() # button of ImageView ret = analyze(sv,indent+' ') if ret: return ret ret = analyze(main_view,'') return ret class my_View(ui.View): global console_view, b_prev, b_next def __init__(self): # set Console in mode partial screen setConsolePartialScreen() #print(dir(console_view)) # build a transparent view self.border_color = 'red' self.border_width = 2 w,h = ui.get_screen_size() self.background_color = (1,1,1,0) self.frame = (0,0,w,h) self.name = 'split-screen: Console REPL and doc viewer' # webview with local doc in left part of screen evw = editor._get_editor_tab().editorView().size().width self.b_y = h-130 wv = ui.WebView(name='wv') wv.frame =(0,0,evw,self.b_y) wv.load_url('zip:///private/var/containers/Bundle/Application/34BAEE1A-BC33-4D6F-A0C1-B733E4991F31/Pythonista3.app/Documentation.zip/py3/index.html') self.add_subview(wv) bi_back = ui.ButtonItem(image=ui.Image.named('iob:ios7_arrow_back_32')) bi_back.action = self.go_back bi_forward = ui.ButtonItem(image=ui.Image.named('iob:ios7_arrow_forward_32')) bi_forward.action = self.go_forward self.right_button_items = [bi_forward, bi_back] # I don't know why but console history buttons are not accessible, thus I create user buttons with action = tapping real buttons b_bg = ui.View() b_bg.frame = (0,self.b_y,evw,h-self.b_y) b_bg.background_color = 'white' self.add_subview(b_bg) b_command = ui.Button(name='b_command') b_command.frame = (evw-150,self.b_y,24,24) b_command.image = ui.Image.named('iob:compose_32') b_command.action = self.b_command_action self.add_subview(b_command) b_prev_hist = ui.Button(name='b_prev_hist') b_prev_hist.frame = (evw-70,self.b_y,24,24) b_prev_hist.image = ui.Image.named('iob:chevron_down_32') b_prev_hist.action = self.b_prev_hist_action self.add_subview(b_prev_hist) b_next_hist = ui.Button(name='b_next_hist') b_next_hist.frame = (evw-30,self.b_y,24,24) b_next_hist.image = ui.Image.named('iob:chevron_up_32') b_next_hist.action = self.b_next_hist_action self.add_subview(b_next_hist) # advance one line because first is hidden print('') def go_back(self,sender): self['wv'].go_back() def go_forward(self,sender): self['wv'].go_forward() def b_command_action(self,sender): # edit command textfield console_view.becomeFirstResponder() def b_prev_hist_action(self,sender): # simulate tap the previous console history button UIControlEventTouchUpInside = 255 b_prev.sendActionsForControlEvents_(UIControlEventTouchUpInside) def b_next_hist_action(self,sender): # simulate tap the next console history button UIControlEventTouchUpInside = 255 b_next.sendActionsForControlEvents_(UIControlEventTouchUpInside) def keyboard_frame_did_change(self, frame): # Called when the on-screen keyboard appears/disappears # Note: The frame is in screen coordinates. kbd_height = frame[3] self['b_command'].y = self.b_y - kbd_height self['b_prev_hist'].y = self.b_y - kbd_height self['b_next_hist'].y = self.b_y - kbd_height #print('keyboard_frame_did_change',frame) def main(): global console_view, b_prev, b_next v = my_View() v.present('sheet') if __name__ == "__main__": main()
-
@KipCarter said:
Getting to a single icon to start the apps would be a huge boon.
Possible without creating a standalone app, via standard Apple Shortcuts app, if you agree that the user buys Pythonista and you share your source code.
-
@cvp, wow! You are the hacking wizard.
How did you find the path to the doc bundle?
-
@mikael After opening the doc tab (with ?), Î've analyzed the tree and I found this
b'RoundedShadowContainerView' b'UIView' b'UIView' b'UIView' b'UIView' b'UIView' b'UIWebView' b'_UIWebViewScrollView' b'UIWebBrowserView' Pythonista Documentation Welcome! This is the documentation for Pythonista. It is based on the official Python 3.6.1 documentation and includes information about additional modules that were developed specifically for Pythonista.
Then, I made a dir of the UIWebBrowserView, and one of its properties (I don't remember which one) gave me this url.
'zip:///private/var/containers/Bundle/Application/34BAEE1A-BC33-4D6F-A0C1-B733E4991F31/Pythonista3.app/Documentation.zip/py3/index.html'
-
@cvp, so, no big deal, easy to find, well documented. :-)
-
@mikael Sure 😅
My only hard/long (for me) work was to try to- open the console in partial screen (already solved in a previous topic)
- present a view without hiding the console, even if you can't really access it
- simulate tapping the command TextField
- simulate tapping the previous/next history buttons
- move my own buttons up/down when the keyboard (dis)appears
If I didn't' find the url, I would set the web doc url
-
Be careful, my script has a bug if the standard doc tab is open when you start the script.
-
@cvp I'm quite impressed by your reverse engineering skills. Very clever! 👍
-
@omz Thanks, only patience and enough free time 😀
Only clever thing is your marvelous app which allows to realize such process. -
@mikael Property to find url was
if 'UIWebBrowserView' in str(sv._get_objc_classname()): #print(dir(sv.webView())) print(sv.webView().mainFrameURL())
-
This is quite a good hack @cvp. Every problem looks simple once you solve them so this is not as easy as you make it look. My Pythonista wish list is for the app to reveal the secret of the afterlife because we only live twice. This means that to me Pythonista is already a dream come true that allowed me to achieve many important goals using an iPad. It is good as it is and whatever comes next is welcomed. However, please do not remove Python 2.xx.