Or, much simpler, leverage the power of the GUI:
----
s = g.app.gui.runAskOkCancelStringDialog(c,'Input','Please input a value:')
if s is not None:
g.es('user supplied', s)
else:
g.es('user cancelled dialog')
----
Simple! :)
There's also a runAskOkCancelNumberDialog, if you need a float. Others
exist as well, here:
leoPy.leo#Code-->Qt gui-->@file ../plugins/qt_gui.py-->class
LeoQtGui(leoGui.LeoGui)-->LeoQtGui.Dialogs & panels
Hope this helps,
-->Jake
On 7/16/2015 2:28 PM, Edward K. Ream wrote:
On Thursday, July 16, 2015 at 2:44:32 AM UTC-5, Israel Hands wrote:
Hi, I'm writing a very simple script and need to get interactive
input from the user. I have read the information in the docs and
it seems a complicated, can anyone point me to the simplest
working example of a script that uses interactivity?
Good question. There should at least be a section in the scripting
miscellany chapter <http://leoeditor.com/scripting-miscellany.html>,
but at present there isn't.
Here is a relatively simple example. I sniffed around Leo's sources
for a template. I picked @cmd('shell-command') pretty much at random,
and then pared it down to this::
|
definteractive_example(event=None):
'''Prompts for a number.'''
k =c.k
state_name ='enter-a-number'
state =k.getState(state_name)
ifstate ==0:
k.setLabelBlue('Enter a number: ')
k.getArg(event,state_name,1,interactive_example)
else:
n =k.arg
k.clearState()
k.showStateAndMode()
c.frame.putStatusLine(n,bg='blue',fg='white')
c.bodyWantsFocus()
interactive_example()
|
You can see this in action by executing the code above with Ctrl-B.
The challenge in any interaction is to coordinate keystrokes. /All/
keystrokes always go through k.masterKeyHandler. So interactive code
must do the correct incantations to make this work. Let's look at
this example line by line.
1. There must be a function (typically a method) to handle the
interactions. Usually the method implements a Leo command, which is
why the event arg is supplied, but in this case the code actually
doesn't ever use the event arg.
2. The first step in the code is to give your interaction a *unique
name*, in this case, the string |'enter-a-number'.
3. Next, the code does:|
||
|
state =k.getState(state_name)
|
|
Initially, state will be zero, because we aren't in the state. So the
code does:
|
|
|
k.setLabelBlue('Enter a number: ')
k.getArg(event,state_name,1,interactive_example)
|
||The first line puts a prompt into the minibuffer, the second calls
the k.getArg to accumulate the desired value.
k.getArg is a thin wrapper around the k.GetArg /class/, which has a
gazillion options. k.getArg will coordinate with k.masterKeyHandler
to get the argument "interactively", that is, character by character.
k.getArg sets the state and state number using the second and third
arguments. k.getArg supports Ctrl-G and Backspace by default, and can
also handle tab completion as well as other esoterica.
When the user hits <Return> k.getArg will call the handler, the last
arg in the call to k.getArg, with state == 1. The handler is
interactive_example, s||o control reenters interactive_example, but
this time with state == 1. So now the following is executed:
|
||
|
n =k.arg
k.clearState()
k.showStateAndMode()
c.frame.putStatusLine(n,bg='blue',fg='white')
c.bodyWantsFocus()
|
|
k.getArg sets the k.arg value to the accumulated result. g.getArg
does no checking of the value of k.arg: that would be up to the handler.
The handler could call k.getArg again, with another state number if
more interaction were desired. When the interaction is finished, the
handler must call k.clearState()
.
Leo's interaction mechanism is arguably too complex, but I think we're
stuck with it.
Please feel free to ask more questions.
Edward|||
--
You received this message because you are subscribed to the Google
Groups "leo-editor" group.
To unsubscribe from this group and stop receiving emails from it, send
an email to [email protected]
<mailto:[email protected]>.
To post to this group, send email to [email protected]
<mailto:[email protected]>.
Visit this group at http://groups.google.com/group/leo-editor.
For more options, visit https://groups.google.com/d/optout.
--
You received this message because you are subscribed to the Google Groups
"leo-editor" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/leo-editor.
For more options, visit https://groups.google.com/d/optout.