Tkinter Problem?

Discussion in 'Python' started by Davy, Nov 20, 2007.

  1. Davy

    Davy Guest

    Hi all,

    I have written a simple Tkinter program, that is draw a rectangle in a
    canvas, when I press Up key, the rectangle move up. But the program
    seems work not properly? My environment is Python2.5+PythonWin.

    ##----------------------
    from Tkinter import *

    class MyApp:
    def __init__(self,parent):
    self.myContainer1 = Frame(parent)
    self.myContainer1.pack()
    self.canv = Canvas(relief=SUNKEN)
    self.canv.config(width = 300,height=300)
    self.canv.pack()
    self.canv.create_rectangle(100,100,150,150,tags="rect")
    self.canv.bind('<Up>',self._onUpKey)
    self.canv.bind('<Return>', self._onReturnKey)
    def _onUpKey(self,event):
    self.canv.move(tagOrId,xAmount=0,yAmount=10)
    def _onReturnKey(self,event):
    print 'Hello world'


    root = Tk()
    myapp = MyApp(root)
    root.mainloop()

    ##----------------------

    Best regards,
    Davy
    Davy, Nov 20, 2007
    #1
    1. Advertising

  2. Davy

    Guest

    On Nov 19, 8:13 pm, Davy <> wrote:
    > Hi all,
    >
    > I have written a simple Tkinter program, that is draw a rectangle in a
    > canvas, when I press Up key, the rectangle move up. But the program
    > seems work not properly? My environment is Python2.5+PythonWin.
    >
    > ##----------------------
    > from Tkinter import *
    >
    > class MyApp:
    > def __init__(self,parent):
    > self.myContainer1 = Frame(parent)
    > self.myContainer1.pack()
    > self.canv = Canvas(relief=SUNKEN)
    > self.canv.config(width = 300,height=300)
    > self.canv.pack()
    > self.canv.create_rectangle(100,100,150,150,tags="rect")
    > self.canv.bind('<Up>',self._onUpKey)
    > self.canv.bind('<Return>', self._onReturnKey)
    > def _onUpKey(self,event):
    > self.canv.move(tagOrId,xAmount=0,yAmount=10)
    > def _onReturnKey(self,event):
    > print 'Hello world'
    >
    > root = Tk()
    > myapp = MyApp(root)
    > root.mainloop()
    >
    > ##----------------------
    >
    > Best regards,
    > Davy


    I'm not sure, but I don't think you can bind the a key to a
    canvas...you'd want to bind to the rectangle itself somehow.

    Some articles on binding:

    http://effbot.org/pyfaq/i-can-t-get-key-bindings-to-work-in-tkinter-why.htm
    http://www.pythonware.com/library/tkinter/introduction/events-and-bindings.htm
    http://docs.huihoo.com/tkinter/an-introduction-to-tkinter-1997/intro06.htm

    Info on the Canvas object:

    # this one talks about setting the focus on an item within the canvas
    so that it has key bindings...maybe that will work.
    http://effbot.org/tkinterbook/canvas.htm
    http://www.pythonware.com/library/tkinter/introduction/canvas.htm

    I am not a Tkinter expert. I am much better with wxPython, but I am
    only starting to be able to answer questions on that topic.

    Hopefully someone with more knowledge will show up shortly.

    Mike
    , Nov 20, 2007
    #2
    1. Advertising

  3. On Mon, 19 Nov 2007 18:13:03 -0800, Davy wrote:

    > ##----------------------
    > from Tkinter import *
    >
    > class MyApp:
    > def __init__(self,parent):
    > self.myContainer1 = Frame(parent)
    > self.myContainer1.pack()
    > self.canv = Canvas(relief=SUNKEN)
    > self.canv.config(width = 300,height=300)
    > self.canv.pack()
    > self.canv.create_rectangle(100,100,150,150,tags="rect")
    > self.canv.bind('<Up>',self._onUpKey)
    > self.canv.bind('<Return>', self._onReturnKey)
    > def _onUpKey(self,event):
    > self.canv.move(tagOrId,xAmount=0,yAmount=10)


    Where's `tagOrId` coming from? That's a `NameError` here.

    Ciao,
    Marc 'BlackJack' Rintsch
    Marc 'BlackJack' Rintsch, Nov 20, 2007
    #3
  4. Davy

    Peter Otten Guest

    Marc 'BlackJack' Rintsch wrote:

    > On Mon, 19 Nov 2007 18:13:03 -0800, Davy wrote:
    >
    >> ##----------------------
    >> from Tkinter import *
    >>
    >> class MyApp:
    >> def __init__(self,parent):
    >> self.myContainer1 = Frame(parent)
    >> self.myContainer1.pack()
    >> self.canv = Canvas(relief=SUNKEN)
    >> self.canv.config(width = 300,height=300)
    >> self.canv.pack()
    >> self.canv.create_rectangle(100,100,150,150,tags="rect")
    >> self.canv.bind('<Up>',self._onUpKey)
    >> self.canv.bind('<Return>', self._onReturnKey)
    >> def _onUpKey(self,event):
    >> self.canv.move(tagOrId,xAmount=0,yAmount=10)

    >
    > Where's `tagOrId` coming from? That's a `NameError` here.


    Also, the arguments of Canvas.move() are positional.

    self.canv.move("rect", 0, 10)

    should work though the direction of the move might surprise you.

    Peter
    Peter Otten, Nov 20, 2007
    #4
  5. Davy

    Davy Guest

    Hi all,

    I have solved the problem after read some code. Because Tk.Canvas do
    not have a focus, it does not receive a key input. The solution is
    bind key input to the highest level 'root'

    root.bind('<Up>',self._onUpKey)

    Davy

    On Nov 20, 10:13 am, Davy <> wrote:
    > Hi all,
    >
    > I have written a simple Tkinter program, that is draw a rectangle in a
    > canvas, when I press Up key, the rectangle move up. But the program
    > seems work not properly? My environment is Python2.5+PythonWin.
    >
    > ##----------------------
    > from Tkinter import *
    >
    > class MyApp:
    > def __init__(self,parent):
    > self.myContainer1 = Frame(parent)
    > self.myContainer1.pack()
    > self.canv = Canvas(relief=SUNKEN)
    > self.canv.config(width = 300,height=300)
    > self.canv.pack()
    > self.canv.create_rectangle(100,100,150,150,tags="rect")
    > self.canv.bind('<Up>',self._onUpKey)
    > self.canv.bind('<Return>', self._onReturnKey)
    > def _onUpKey(self,event):
    > self.canv.move(tagOrId,xAmount=0,yAmount=10)
    > def _onReturnKey(self,event):
    > print 'Hello world'
    >
    > root = Tk()
    > myapp = MyApp(root)
    > root.mainloop()
    >
    > ##----------------------
    >
    > Best regards,
    > Davy
    Davy, Nov 21, 2007
    #5
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Jeff Epler
    Replies:
    0
    Views:
    494
    Jeff Epler
    Aug 20, 2004
  2. Jeff Epler
    Replies:
    0
    Views:
    442
    Jeff Epler
    Aug 23, 2004
  3. Pierre Dagenais
    Replies:
    0
    Views:
    297
    Pierre Dagenais
    Aug 3, 2008
  4. Hidekazu IWAKI
    Replies:
    1
    Views:
    365
    Peter Otten
    Dec 14, 2009
  5. Hidekazu IWAKI
    Replies:
    0
    Views:
    515
    Hidekazu IWAKI
    Dec 15, 2009
Loading...

Share This Page