MathGroup Archive 2007

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Button[label, action] - InputString[]?

  • To: mathgroup at smc.vnet.net
  • Subject: [mg83624] Re: Button[label, action] - InputString[]?
  • From: Albert <awnl at arcor.net>
  • Date: Sun, 25 Nov 2007 04:35:21 -0500 (EST)
  • References: <fi8pp9$h2g$1@smc.vnet.net>

Joe Sneed wrote:
> I run V6.01 under Windows XP
> 
> I want to construct a button that reads a string input and writes 
> something determined by the input to a notebook. When I click on "close" 
> of "X" in the input dialog box, I want nothing to appear in the notebook.
> 
> I have two questions: one dealing with evaluation method; another 
> dealing with the use of If[ _, _, _] in the button function.
> 
> As a test, I try to read the input and write it to a selected notebook using
> 
> Button[Style["LABEL", Black, 10, FontFamily -> "Arial Black"],
> tag=InputString[];
> nb=SelectedNotebook[];
> If[tag ? $Canceled,
> NotebookWrite[nb,Cell[tag,"Text"]]]]
> 
> to construct the button.
> 
> This yields a button whose underlying expression is
> 
> Cell[BoxData[
> 
> ButtonBox[
> StyleBox["\<\"LABEL\"\>",
> StripOnInput->False,
> FrontFaceColor->GrayLevel[0],
> BackFaceColor->GrayLevel[0],
> GraphicsColor->GrayLevel[0],
> FontFamily->"Arial Black",
> FontSize->10,
> FontColor->GrayLevel[0]],
> Appearance->Automatic,
> ButtonFrame->"DialogBox",
> ButtonFunction:>($CellContext`tag =
> InputString[]; $CellContext`nb =
> SelectedNotebook[];
> If[$CellContext`tag != $Canceled,
> NotebookWrite[$CellContext`nb,
> Cell[$CellContext`tag, "Text"]]]),
> Evaluator->Automatic,
> Method->"Preemptive"]], "Output",
> CellChangeTimes->{3.40483095753125*^9},
> CellLabel->"Out[1]="]
> 
> This produces an input dialog box that times out without accepting 
> input. if I change the default
> 
> Method->"Preemptive" -- to---> Method->"Queued"
> 
> My first question is , "Why must I change the method?".

Because Preemptive means that the kernel is interrupted in doing what it 
does for a quick calculation so that these buttons are reactive even 
when the kernel is busy doing something else. To make sense these 
actions are limited to a default of 5 or 6 seconds. Using Queued, the 
evaluation is done in the usual way like when evaluating cells, that is 
it is queued, and of course then the need for a timeout does not apply. 
To learn more about this, read the tutorials for Dynamic.

> Having made the method change, I can enter input and without the If[ ] 
> write the input to the selected notebook.
> But the conditional does not work. If I enter input and click OK, 
> nothing is entered into the selected notebook.
> 
> The purpose of the conditional If[ ] is to avoid the appearance of 
> "$Canceled" in the selected notebook when one clicks on "Cancel" or "X" 
> in the input dialog box.
> 
> My second question has two parts: 1) "Why doesn't the If[ ] work; 2) 
> what will work to accomplish my purpose?".

This is a very common pitfall when using == which is in mathematica used 
for mathematical equivalence and usualy is returned unevaluated when 
either the right or lefthand side contain a symbol, which you can check 
by evaluating this:

"input string" == $Canceled

Usually if you are not handling mathematical expression SameQ (===) is a 
better choice, like:

"input string" === $Canceled

which will be evaluated to False. So the following should cure your 
problems:

Button[
  Style["LABEL", Black, 10, FontFamily -> "Arial Black"],
  tag=InputString[];
  nb=SelectedNotebook[];
  If[tag === $Canceled, NotebookWrite[nb,Cell[tag,"Text"]]],
  Method->"Queued"
]

hth,

albert



  • Prev by Date: Re: Database like "left join" or SAS like Merge function
  • Next by Date: FindInstance puzzler
  • Previous by thread: Button[label, action] - InputString[]?
  • Next by thread: Mathematica 6 Automated Compatibility Tools