Re: Problems with ChoiceDialog inside a Dynamic: Bug or not (well)
- To: mathgroup at smc.vnet.net
- Subject: [mg107779] Re: Problems with ChoiceDialog inside a Dynamic: Bug or not (well)
- From: Albert Retey <awnl at gmx-topmail.de>
- Date: Thu, 25 Feb 2010 17:37:53 -0500 (EST)
- References: <hm573n$kge$1@smc.vnet.net>
Hi, > suppose you wanna to display an alert to the user before to continue the > execution of your code when some conditions occur : probably you'll use > ChoiceDialog[], the useful function that "puts up a standard choice > dialog that displays expr together with OK and Cancel buttons, and > returns True if OK is clicked, and False if Cancel is clicked.". > > But if you use this function inside some Dynamic[] object, it hangs the > kernel. I've tried to find in the documentation some references to this > bad combination without any luck, so I don't understand if this is a bug > or there is something missing in the code. > > To better explain the problem here is a very basic example: > > (* just a silly example *) > Grid[{ > {"Choose a dividend: ", > PopupMenu[Dynamic[dividend], Table[i, {i, 0, 10}]]}, > {"Choose a divisor : ", PopupMenu[Dynamic[divisor], Table[i, {i, 0, 10}]]}, > {"Quotient: ", Dynamic[dividend / divisor]} > }, Frame -> All] > Dynamic[ > If[divisor == 0, > ChoiceDialog["Uh-oh, you are going to do a division by zero! Please select a different divisor.", {"Ok"}]; > ]]; It's a deficiency of how the modal dialogs behave. I have encountered this about a year ago or more and reported here, but have not yet received any answers. You have the same problem when you try to nest modal dialogs. In the meantime I just try to avoid modal dialogs where I can, which is often possible, but of course not always. > Instead, if you use the MessageDialog[] function to show a message window, all works well, but of course the execution will continue without waiting for the user action (that is not what I want). > > Same situation if you try to use ChoiceDialog[] inside a TabView, or other kind of Views: > > (* another silly example *) > TabView[{ > "Tab1" -> Button["Show ChoiceDialog", result = ChoiceDialog["This hangs.. :-(."];], > "Tab2" -> Button["Show MessageDialog", MessageDialog["This works!"];] > }] In some cases like your second example, where a modal dialog is started by a button, the Method->"Queued" trick helps: TabView[{ "Tab1" -> Button["Show ChoiceDialog", result = ChoiceDialog["This is ok:-)."], Method->"Queued" ], "Tab2" -> Button["Show MessageDialog", MessageDialog["This works!"]; ] }] hth, albert
- Follow-Ups:
- Re: Re: Problems with ChoiceDialog inside a Dynamic: Bug or not (well)
- From: Guido Tripaldi <guido@gtripaldi.it>
- Re: Re: Problems with ChoiceDialog inside a Dynamic: Bug or not (well)