Title: tkFont may reuse font names
Type: behavior Stage: resolved
Components: Tkinter Versions: Python 3.3
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: asvetlov Nosy List: BreamoreBoy, asvetlov, effbot, gpolo, lpd, python-dev
Priority: low Keywords: patch

Created on 2003-09-08 07:52 by effbot, last changed 2012-04-03 06:51 by asvetlov. This issue is now closed.

File name Uploaded Description Edit effbot, 2003-09-08 07:52
nonamerepeat.diff gpolo, 2009-06-21 20:49 review
Messages (7)
msg18102 - (view) Author: Fredrik Lundh (effbot) * (Python committer) Date: 2003-09-08 07:52
(sent to me instead of to the bug manager; note that 
the tkFont naming approach is also used for widgets and 
callbacks /F)

The class tkFont has a problem name it chooses if no 
name is
given. The choosen method 'name = "font" + str(id
(self))' isn't safe
because the name may exists longer than the Font 
object and so another
Font object may be created with a different font but the 
id() and so the same name. id() says

    Return the identity of an object.  This is guaranteed 
to be unique
    among simultaneously existing objects.

Note that this bug doesn't strike if you hold a reference 
to the Font
object and so the GC can't reclaim the space.

To reproduce run the attached program. It produces 
something like:

previously: ('Times', 15, 'bold')
now: ('Times', 18, 'bold')
iterations: 8
mapping: {'font136494612': ('Times', 
14, 'bold'), 'font136499772': ('Times', 
15, 'bold'), 'font136545468': ('Times', 
17, 'bold'), 'font136483156': ('Times', 
11, 'bold'), 'font136502700': ('Times', 
12, 'bold'), 'font136510460': ('Times', 
13, 'bold'), 'font136515228': ('Times', 
16, 'bold'), 'font136365348': ('Times', 10, 'bold')}
Traceback (most recent call last):
  File "", line 20, in ?
    assert 0

msg18103 - (view) Author: L. Peter Deutsch (lpd) Date: 2007-06-03 05:16
This bug has bitten me too, in a real program.
msg64948 - (view) Author: Guilherme Polo (gpolo) * (Python committer) Date: 2008-04-04 20:17
This still happens, but around 2000 iterations here on newer Python
versions (trunk, 3alpha, 2.5.x, 2.4.x). Using Python 1.6 I've got it at
2 iterations (min), but.. is this going to be fixed or given the amount
of iterations needed nowadays this is no longer a problem ? If it should
be fixed, are there any suggestions on how to proceed ?
msg89581 - (view) Author: Guilherme Polo (gpolo) * (Python committer) Date: 2009-06-21 20:49
Uhm, now I'm getting it at around 3 iterations with python-trunk. So,
can't we just use a simple generator for this ? Patch attached.

The same could be done for widget and callback naming.
msg114268 - (view) Author: Mark Lawrence (BreamoreBoy) * Date: 2010-08-18 19:26
Patch is really simple and looks ok to me, can we get this committed please.
msg157394 - (view) Author: Roundup Robot (python-dev) Date: 2012-04-03 06:48
New changeset a77e23135675 by Andrew Svetlov in branch 'default':
Issue #802310: Generate always unique tkinter font names if not directly passed
msg157395 - (view) Author: Andrew Svetlov (asvetlov) * (Python committer) Date: 2012-04-03 06:51
I've pushed fix inspired by Guilherme's suggestion.

Fix has been applied to 3.3 only because:
1. It changes font name generation schema
2. It's definitelly minor issue as exists starting from 2003.

Date User Action Args
2012-04-03 06:51:05asvetlovsetstatus: open -> closed
versions: - Python 2.7, Python 3.2
messages: + msg157395

resolution: fixed
stage: patch review -> resolved
2012-04-03 06:48:13python-devsetnosy: + python-dev
messages: + msg157394
2012-04-03 05:42:28asvetlovsetassignee: asvetlov
2012-03-21 17:27:30asvetlovsetnosy: + asvetlov

versions: + Python 3.3, - Python 3.1
2010-08-18 19:26:28BreamoreBoysetversions: + Python 3.1, Python 2.7, Python 3.2
nosy: + BreamoreBoy

messages: + msg114268

type: behavior
stage: patch review
2009-06-21 20:49:11gpolosetfiles: + nonamerepeat.diff
keywords: + patch
messages: + msg89581
2008-04-04 20:17:01gpolosetnosy: + gpolo
messages: + msg64948
2003-09-08 07:52:56effbotcreate