Thanks Jacob - that is levering the power of the GUI - very helpful for a
beginner like me.
Alistair
On Thursday, 16 July 2015 20:04:48 UTC+1, Jacob Peck wrote:
>
> 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::
>
> def interactive_example(event=None):
> '''Prompts for a number.'''
> k = c.k
> state_name = 'enter-a-number'
> state = k.getState(state_name)
> if state == 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, so 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] <javascript:>.
> To post to this group, send email to [email protected]
> <javascript:>.
> 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.