Peter Billam wrote: >> Peter Billam wrote: >> window = MainWindow(application) >> if (len(sys.argv) > 1) and os.path.exists(sys.argv[1]): >> window.loadFile(sys.argv[1]) >> application.mainloop() >> File "./midimix", line 465, in loadFile >> space0.grid(row=grid_row, >> pady=round(0.5*(ymid[track_num]-ymid[track_num-1]))-50) >> ... >> _tkinter.TclError: bad pad value "-50": must be positive screen >> distance >> presumably because the window doesn't have dimensions before mainloop >> is entered. Can I force the window to be laid out before entering >> mainloop? Or can I invoke loadFile() after mainloop has started ? > > On 2009-03-14, Peter Otten <__pete...@web.de> wrote: >> The latter. Try >> application.after_idle(window.loadFile, sys.argv[1]) > > Thank you! That almost worked :-) It opened a window (which it didn't > do last time), and it laid out the frames and so on apparently OK, > and even posted a "Loaded v.mid" message on the StatusBar, but then > just drew a couple of zero-thickness lines right at the top of the > canvas, and failed with the same message: > File "./midimix", line 465, in loadFile > space0.grid(row=grid_row, > pady=round(0.5*(ymid[track_num]-ymid[track_num-1]))-50) > File "/usr/local/lib/python3.0/tkinter/__init__.py", > line 1845, in grid_configure > + self._options(cnf, kw)) > _tkinter.TclError: bad pad value "-50": must be positive screen distance > > but I say "almost" because I googled after_idle, and the very similar: > application.after(500, window.loadFile, sys.argv[1]) > does work, exactly as intended :-) except of course that it's a > race condition, and will fail for very impatient people or on very > slow machines. On my machine it still works with 20ms, but fails > with 10ms. Is there one extra magic trick I need to know? > > I also tried invoking after_idle on the canvas widget: > window.canvas.after_idle(window.loadFile, sys.argv[1]) > but that fails with the same message. > (I am using python 3.0.1 in case that's, er, relevant.) > > Thanks for your help, Regards, Peter >
Well, I don't know where the ymid[...] values come from. If you can guarantee that ymid[track_num] - ymit[track_num-1] > 50 at some point you could reschedule loadFile() from within loadFile() and return immediately as long as that condition is not met. Peter -- http://mail.python.org/mailman/listinfo/python-list