[Python-bugs-list] [Bug #114424] Tkinter/Canvas drawing causes interpreter to crash.

noreply@sourceforge.net noreply@sourceforge.net
Fri, 15 Sep 2000 00:09:09 -0700

Bug #114424, was updated on 2000-Sep-14 06:32
Here is a current snapshot of the bug.

Project: Python
Category: Tkinter
Status: Closed
Resolution: Fixed
Bug Group: None
Priority: 9
Summary: Tkinter/Canvas drawing causes interpreter to crash.

 14 September 2000

 Please find my original query below with regard to Tkinter and Python2.0beta1.
 Also find the Python help desk response.

 I had not mentioned in my original query that I am running on a 
 Sun Ultra 10 with the Solaris 5.5.1 operating system. 



 13 September 2000

 HI Python Folks,

 I am trying to evaluate the new "flatten" functionality written for 
 Tkinter to determine if it generates a scientific plot with many data
 points in a reasonable time. I am using the Python2.0beta1.  I should
 admit to being a bit of a newbie with Python.

 For this test, I am using some very simple code that is from the "Python 
 and Tkinter Programming" book by John Grayson.  I will append the simple 
 program to the bottom of this note.  I will mention I did modify the 
 code in the following manner:
   1) scaled.append(x,y) to scaled.append((x,y)).
   2) commented out some stuff I did not care about
   3) added code to be able to generate as many data points as I want for

 If I run the very code attached to this note, I get:

enkidu> /usr/local/bin/python2.0 simpleplot2.py
Traceback (most recent call last):
  File "simpleplot2.py", line 39, in ?
    canvas.create_line(scaled, fill='royalblue')
  File "/usr/local/Python-2.0b1/lib/python2.0/lib-tk/Tkinter.py", line 1955, in create_line
    return self._create('line', args, kw)
  File "/usr/local/Python-2.0b1/lib/python2.0/lib-tk/Tkinter.py", line 1942, in _create
    (self._w, 'create', itemType)
TypeError: can only concatenate tuple (not "dictionary") to tuple
Bus error (core dumped)

 I changed the scaled.append((x,y)) to two lines where I append x and y
 separately; this got rid of the TypeError, but I still got the core dump.
 I have done many experiments where I can sometimes get the code to work in
 interactive mode, but if I decide to draw the line in color, I get a bus 
 error.  I can sometimes draw lines with only a few data points, but I
 bomb on lines with many points.

 I tell you all of this to find out if Tkinter has been tested for drawing
 lines and such on a canvas under Python2.0?  I am suspicious of either 
 memory problems or newbie problems.  I have tried some demos of Tkinter, as 
 well as some GUIs I have made using Tkinter which employ lots of widgets 
 (i.e., scrollbars, text, label, entry) and these seem to work just fine.
 I am not very experienced with drawing stuff on the canvas.

 I do not expect you to debug this code for me, but rather to tell me how
 well Tkinter has been tested under Python2.0.  I know you probably have 
 lots o'stuff to do.


 Michele D. De La Pena                        email: delapena@stsci.edu
 Senior Scientific Programmer                 phone: 410-338-4713
 Space Telescope Science Institute            fax:   410-338-4767
 3700 San Martin Drive
 Baltimore, MD  21218

 "The nice thing about standards is there are so many to choose from."


from Tkinter import *

root = Tk()
root.title('Simple Plot - Version 2')
canvas = Canvas(root, width=450, height=300, bg = 'white')
Button(root, text='Quit', command=root.quit).pack()

canvas.create_line(100,250,400,250, width=2)
canvas.create_line(100,250,100,50,  width=2)

for i in range(11):
    x = 100 + (i * 30)
    canvas.create_line(x,250,x,245, width=2)
    canvas.create_text(x,254, text='%d'% (10*i), anchor=N)

for i in range(6):
    y = 250 - (i * 40)
    canvas.create_line(100,y,105,y, width=2)
    canvas.create_text(96,y, text='%5.1f'% (50.*i), anchor=E)

scaled = []

# MDD Added this code to generate potentially lots of data points
for i in range(10):
    x, y = i, i
    x = x + 100
    y = 50 + y

"""  I am not interested in this.
scaled = []
for x,y in [(12, 56), (20, 94), (33, 98), (45, 120), (61, 180),
            (75, 160), (98, 223)]:
    scaled.append((100 + 3*x, 250 - (4*y)/5))

canvas.create_line(scaled, fill='royalblue')

"""  I am not interested in this.
for x,y in scaled:
    canvas.create_oval(x-6,y-6,x+6,y+6, width=1,
                       outline='black', fill='SkyBlue2')