471,357 Members | 1,122 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 471,357 software developers and data experts.

Question for loading images in a class/canvas

I have been attempting to utilize a draw command script that loads a canvas, and through certain mouse events, draws rectangles. The original code is from http://www.java2s.com/Code/Python/Ev...peoncanvas.htm .

The code itself is:
Expand|Select|Wrap|Line Numbers
  1. from Tkinter import *
  2. trace = 0 
  3.  
  4. class CanvasEventsDemo: 
  5.     def __init__(self, parent=None):
  6.         canvas = Canvas(width=300, height=300, bg='beige') 
  7.         canvas.pack()
  8.         canvas.bind('<ButtonPress-1>', self.onStart)   
  9.         canvas.bind('<B1-Motion>',     self.onGrow)     
  10.         canvas.bind('<Double-1>',      self.onClear)     
  11.         canvas.bind('<ButtonPress-3>', self.onMove)     
  12.         self.canvas = canvas
  13.         self.drawn  = None
  14.         self.kinds = [canvas.create_oval, canvas.create_rectangle]
  15.     def onStart(self, event):
  16.         self.shape = self.kinds[0]
  17.         self.kinds = self.kinds[1:] + self.kinds[:1]      
  18.         self.start = event
  19.         self.drawn = None
  20.     def onGrow(self, event):                           
  21.         canvas = event.widget
  22.         if self.drawn: canvas.delete(self.drawn)
  23.         objectId = self.shape(self.start.x, self.start.y, event.x, event.y)
  24.         if trace: print objectId
  25.         self.drawn = objectId
  26.     def onClear(self, event):
  27.         event.widget.delete('all')                     
  28.     def onMove(self, event):
  29.         if self.drawn:                                   
  30.             if trace: print self.drawn
  31.             canvas = event.widget
  32.             diffX, diffY = (event.x - self.start.x), (event.y - self.start.y)
  33.             canvas.move(self.drawn, diffX, diffY)
  34.             self.start = event
  35.  
  36. if __name__ == '__main__':
  37.     CanvasEventsDemo()
  38.     mainloop()
Essentially I am looking at setting the background image as a photo using the create_image function. I have gotten it to work in a structure that is not utilizing classes such as this example code:
Expand|Select|Wrap|Line Numbers
  1. # Putting a gif image on a canvas with Tkinter
  2. # tested with Python24 by  vegaseat  25jun2005
  3.  
  4. from Tkinter import *
  5.  
  6. # create the canvas, size in pixels
  7. canvas = Canvas(width = 300, height = 200, bg = 'yellow')
  8.  
  9. # pack the canvas into a frame/form
  10. canvas.pack(expand = YES, fill = BOTH)
  11.  
  12. # load the .gif image file
  13. # put in your own gif file here, may need to add full path
  14. # like 'C:/WINDOWS/Help/Tours/WindowsMediaPlayer/Img/mplogo.gif'
  15. gif1 = PhotoImage(file = 'DrBunsen.gif')
  16.  
  17. # put gif image on canvas
  18. # pic's upper left corner (NW) on the canvas is at x=50 y=10
  19. canvas.create_image(50, 10, image = gif1, anchor = NW)
  20.  
  21. # run it ...
  22. mainloop()
I've gotten it to work with a different file of course, however, when I try to implement my image background in the first code all I get is a grey canvas. So without further ado here is my code:

Expand|Select|Wrap|Line Numbers
  1. from Tkinter import *
  2. import Image            #PIL
  3. import ImageTk          #PIL
  4. import sys
  5. import getopt
  6. trace = 0 
  7.  
  8. class CanvasEventsDemo: 
  9.     def __init__(self, parent=NONE):
  10.         canvas = Canvas(width=400,height=400) 
  11.         canvas.pack()
  12.         im = Image.open("C:/Documents and Settings/John Perry/Desktop/GradSchool/Summer 07 python goshen/cd with CT's/patient10/se002.jpg")
  13.         photo = ImageTk.PhotoImage(im)
  14.         item=canvas.create_image(10, 10, image = photo)
  15.         canvas.bind('<ButtonPress-1>', self.onStart)   
  16.         canvas.bind('<B1-Motion>',     self.onGrow)     
  17.         canvas.bind('<Double-1>',      self.onClear)     
  18.         canvas.bind('<ButtonPress-3>', self.onMove)     
  19.         self.canvas = canvas
  20.         self.drawn  = None
  21.         self.kinds = [canvas.create_oval, canvas.create_rectangle]
  22.     def onStart(self, event):
  23.         self.shape = self.kinds[0]
  24.         self.kinds = self.kinds[1:] + self.kinds[:1]      
  25.         self.start = event
  26.         self.drawn = None
  27.     def onGrow(self, event):                           
  28.         canvas = event.widget
  29.         if self.drawn: canvas.delete(self.drawn)
  30.         objectId = self.shape(self.start.x, self.start.y, event.x, event.y)
  31.         if trace: print objectId
  32.         self.drawn = objectId
  33.     def onClear(self, event):
  34.         event.widget.delete('all')                     
  35.     def onMove(self, event):
  36.         if self.drawn:                                   
  37.             if trace: print self.drawn
  38.             canvas = event.widget
  39.             diffX, diffY = (event.x - self.start.x), (event.y - self.start.y)
  40.             canvas.move(self.drawn, diffX, diffY)
  41.             self.start = event
  42.  
  43. if __name__ == '__main__':
  44.     CanvasEventsDemo()
  45.     mainloop()
  46.  
Thanks for any help on getting this little issue fixed! Note that the section I'm referring to is around line 12. I just need my jpg or gif loaded as the background.

Thanks,
JP
Jun 22 '07 #1
6 3236
bartonc
6,596 Expert 4TB
To fix line 12, use raw strings for Windows path names (because the "\" has a special purpose in python strings) and use the "\" in literal path names:
Expand|Select|Wrap|Line Numbers
  1. #
  2. # Use raw strings #
  3.         im = Image.open(r"C:\Documents and Settings\John Perry\Desktop\GradSchool\Summer 07 python goshen\cd with CT's\patient10\se002.jpg")
or
Expand|Select|Wrap|Line Numbers
  1. #
  2. # escape the backslash #
  3.         im = Image.open("C:\\Documents and Settings\\John Perry\\Desktop\\GradSchool\\Summer 07 python goshen\\cd with CT's\\patient10\\se002.jpg")
Jun 23 '07 #2
Hey all,

I implemented the raw string, however, the image will still not display on the canvas at all. It still remains as a white canvas bg with the mouse event functions. Any ideas, or can you try and get it to display an actual jpg, gif, etc image in the canvas to draw shapes over?

Thanks,
JP
Jun 23 '07 #3
bartonc
6,596 Expert 4TB
Hey all,

I implemented the raw string, however, the image will still not display on the canvas at all. It still remains as a white canvas bg with the mouse event functions. Any ideas, or can you try and get it to display an actual jpg, gif, etc image in the canvas to draw shapes over?

Thanks,
JP
I'll try to get some time to work on this for you. I'm swamped at the moment.
Jun 23 '07 #4
bartonc
6,596 Expert 4TB
I'll try to get some time to work on this for you. I'm swamped at the moment.
In the mean time, have you seen
An Introduction to Tkinter
?
Jun 23 '07 #5
I solved the issue. I had to reference my class correctly.

here is the fix:

Expand|Select|Wrap|Line Numbers
  1. from Tkinter import *
  2. import Tkinter
  3. import Image            #PIL
  4. import ImageTk          #PIL
  5. import sys
  6. import getopt
  7. trace = 0 
  8.  
  9. class CanvasEventsDemo: 
  10.     def __init__(self, parent=NONE):
  11.         canvas = Canvas(win)
  12.         canvas.pack(fill=BOTH)
  13.         self.img = PhotoImage(file="C:/Documents and Settings/John Perry/Desktop/GradSchool/Summer 07 python goshen/cd with CT's/patient10/se002.gif")
  14.         canvas.config(width=self.img.width(), height=self.img.height())
  15.         canvas.create_image(0,0, image=self.img, anchor=NW)
  16.         canvas.bind('<ButtonPress-1>', self.onStart)   
  17.         canvas.bind('<B1-Motion>',     self.onGrow)     
  18.         canvas.bind('<Double-1>',      self.onClear)     
  19.         canvas.bind('<ButtonPress-3>', self.onMove)     
  20.         self.canvas = canvas
  21.         self.drawn  = None
  22.         self.kinds = [canvas.create_rectangle]
  23.     def onStart(self, event):
  24.         event.widget.delete('all')
  25.         self.canvas.create_image(0,0, image=self.img, anchor=NW)
  26.         self.shape = self.kinds[0]
  27.         self.kinds = self.kinds[1:] + self.kinds[:1]      
  28.         self.start = event
  29.         self.drawn = None
  30.     def onGrow(self, event):                           
  31.         canvas = event.widget
  32.         if self.drawn: canvas.delete(self.drawn)
  33.         objectId = self.shape(self.start.x, self.start.y, event.x, event.y)
  34.         if trace: print objectId
  35.         self.drawn = objectId
  36.         self.xorig=self.start.x
  37.         self.yorig=self.start.y
  38.         self.xfinal=event.x
  39.         self.yfinal=event.y
  40.     def onClear(self, event):
  41.         event.widget.delete('all')
  42.         self.canvas.create_image(0,0, image=self.img, anchor=NW)
  43.     def onMove(self, event):
  44.         if self.drawn:                                   
  45.             if trace: print self.drawn
  46.             canvas = event.widget
  47.             diffX, diffY = (event.x - self.start.x), (event.y - self.start.y)
  48.             canvas.move(self.drawn, diffX, diffY)
  49.             self.start = event
  50.  
  51. if __name__ == '__main__':
  52.     win=Tk()
  53.     jop=CanvasEventsDemo()
  54.     mainloop()
JP
Jun 23 '07 #6
bartonc
6,596 Expert 4TB
Awesome! Thanks for keeping us up-to-date with you progress.
Jun 23 '07 #7

Post your reply

Sign in to post your reply or Sign up for a free account.

Similar topics

2 posts views Thread by Tim Flynn | last post: by
17 posts views Thread by Aguilar, James | last post: by
2 posts views Thread by Kamran | last post: by
reply views Thread by Eric_Dexter | last post: by
3 posts views Thread by joshdw4 | last post: by
reply views Thread by XIAOLAOHU | last post: by

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.