eb303 wrote:
On Apr 23, 1:58 pm, Rotwang <sg...@hotmail.co.uk> wrote:

[...]

I didn't. How do I get Python to display the draw window, other than by
using mainloop()?

Well, mainloop doesn't actually display anything. It's just the event
loop for tk. So since you run your program within IDLE, there is
already one running. What does it do if you delete the mainloop()
line? Doesn't your window appear at all?

No.


[...]

Here's another problem I've run into today: I've just added a bit of
code so that it's possible to resize the draw window and the contents
will be resized automatically. The method now looks something like this:

out = Tkinter.Tk()
slave = Tkinter.Canvas(out, width = wh[0], height = wh[1])
slave.grid()
        # I put the canvas widget inside a tk widget instead of just
        # using the former because I want keypresses to do things, and
        # it doesn't seem to be possible to bind keyboard events to a
        # canvas
# draw something
slave.pack()

(Hope this line is a mistake: gridding *and* packing slave will
probably result in tk thinking for ages how it should display it in
its parent…)

Not a mistake so much as a symptom of my inept, cargo-cult approach to programming. Needless to say you're correct that it shouldn't be there, though taking it out doesn't give a noticeable improvement in performance (perhaps because the canvas is the only thing there so there's no conflict).


def resize(b):
        wh[:] = [b.width, b.height]
        slave.config(width = wh[0], height = wh[1])
        # resize the contents of slave


You don't need at all to resize the slave explicitely. You should do
the following:
- Tell 'out' that its first row and first column should resize
themselves when the window is resized by doing:
out.grid_rowconfigure(1, weight=1)
out.grid_columnconfigure(1, weight=1)
- Make sure slave is actually put in the cell in first row and column,
and that all its sides will stick to the cell borders:
slave.grid(row=1, column=1, sticky='nswe')

If you do that, the slave.config in the resize function shouldn't be
needed anymore.

Indeed! That works great.


out.bind('<Configure>', resize)

If using the grid options, better do a slave.bind(…) here, which will
call the binding when the canvas is resized, which is obvioulsy when
you want to update its contents.

Right, though before you suggested making the sides of the canvas sticky, resizing the window didn't reconfigure slave.


[...]
You get the size for the outer window and apply it to the canvas
inside it. Since the canvas has a border which is 2 pixels wide by
default, this resizes the window containing it to take this border
into account. So your binding is called again, and so on… But using
the options to grid described above, there should never be any need to
resize the canvas explicitely.

Thanks very much for your help.
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to