This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: tkinter test_font fails on OS X with Aqua Tk
Type: behavior Stage: resolved
Components: Tests, Tkinter Versions: Python 3.2
process
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: Nosy List: amaury.forgeotdarc, donmez, gpolo, ned.deily, pitrou
Priority: normal Keywords: patch

Created on 2010-09-19 20:42 by donmez, last changed 2022-04-11 14:57 by admin. This issue is now closed.

Files
File name Uploaded Description Edit
issue9899-py3k.patch ned.deily, 2010-09-20 02:25
issue9899-fix1-py3k.patch ned.deily, 2010-10-05 05:04
Messages (10)
msg116883 - (view) Author: Ismail Donmez (donmez) * Date: 2010-09-19 20:42
py3k branch, revision 84907

======================================================================
ERROR: test_font_eq (tkinter.test.test_tkinter.test_font.FontTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/cartman/Sources/py3k/Lib/tkinter/test/test_tkinter/test_font.py", line 10, in test_font_eq
    font1 = font.nametofont("system")
  File "/Users/cartman/Sources/py3k/Lib/tkinter/font.py", line 22, in nametofont
    return Font(name=name, exists=True)
  File "/Users/cartman/Sources/py3k/Lib/tkinter/font.py", line 83, in __init__
    "named font %s does not already exist" % (self.name,))
_tkinter.TclError: named font system does not already exist
msg116906 - (view) Author: Ned Deily (ned.deily) * (Python committer) Date: 2010-09-20 02:25
r84865 for Issue1730136 introduced a new tkinter test, test_font.  As it stands, the test fails on OS X 10.6 when Python is built with Aqua Tk, at least with either the Apple-supplied 8.5 or the ActiveState 8.5 (I haven't tried with any of the Aqua 8.4 version).  The main problem is that font "system" is not a font name returned by the interface used by tkinter/font.py:

$ /usr/bin/wish8.5
% font names
systemPushButtonFont systemMenuItemFont systemApplicationFont systemSystemFont systemMenuItemMarkFont TkMenuFont TkDefaultFont systemSmallEmphasizedSystemFont systemDetailEmphasizedSystemFont systemMiniSystemFont TkHeadingFont TkTooltipFont systemUtilityWindowTitleFont systemViewsFont systemSmallSystemFont systemMenuTitleFont systemEmphasizedSystemFont TkTextFont systemDetailSystemFont TkCaptionFont systemLabelFont systemAlertHeaderFont systemMenuItemCmdKeyFont TkSmallCaptionFont TkFixedFont systemWindowTitleFont systemToolbarFont TkIconFont
% font actual system
-family {Lucida Grande} -size 13 -weight normal -slant roman -underline 0 -overstrike 0

Based on the man page here (http://www.tcl.tk/man/tcl8.5/TkCmd/font.htm#M31) it appears any of the "standard" font names would be a better choice, like TkDefaultFont.

Also, test_font should include the standard tkinter.test setUp and setDown functions so that the test can be run by itself.

The attached patch should fix both issues.
msg116933 - (view) Author: Antoine Pitrou (pitrou) * (Python committer) Date: 2010-09-20 13:37
Patch works here (Mandriva Linux).
msg117023 - (view) Author: Ned Deily (ned.deily) * (Python committer) Date: 2010-09-21 03:21
Somebody want to commit it?
msg117080 - (view) Author: Antoine Pitrou (pitrou) * (Python committer) Date: 2010-09-21 16:26
Patch committed in r84952. Thanks!
msg117414 - (view) Author: Antoine Pitrou (pitrou) * (Python committer) Date: 2010-09-26 12:31
Actually, most buildbots were fixed but a couple of them still show a problem:

test_font_eq (tkinter.test.test_tkinter.test_font.FontTest) ... ERROR
testLoadTk (tkinter.test.test_tkinter.test_loadtk.TkLoadTest) ... skipped 'No $DISPLAY set.'
testLoadTkFailure (tkinter.test.test_tkinter.test_loadtk.TkLoadTest) ... ok
test_search (tkinter.test.test_tkinter.test_text.TextTest) ... ok

======================================================================
ERROR: test_font_eq (tkinter.test.test_tkinter.test_font.FontTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/db3l/buildarea/3.x.bolen-tiger/build/Lib/tkinter/test/test_tkinter/test_font.py", line 18, in test_font_eq
    font1 = font.nametofont("TkDefaultFont")
  File "/Users/db3l/buildarea/3.x.bolen-tiger/build/Lib/tkinter/font.py", line 22, in nametofont
    return Font(name=name, exists=True)
  File "/Users/db3l/buildarea/3.x.bolen-tiger/build/Lib/tkinter/font.py", line 83, in __init__
    "named font %s does not already exist" % (self.name,))
_tkinter.TclError: named font TkDefaultFont does not already exist


Intriguingly, when the test gets re-run at the end of the test suite, the test succeeds.
Does it depend on another initialization that is done in another test file?
msg117420 - (view) Author: Ned Deily (ned.deily) * (Python committer) Date: 2010-09-26 16:28
Could be, particularly if the user name under which the test is running is not logged in (to the window manager) on the buildbot.  I'll investigate.
msg117990 - (view) Author: Ned Deily (ned.deily) * (Python committer) Date: 2010-10-05 05:04
After further investigation, on OS X at least, there is a difference in behavior between Tk 8.4 (the system default on OS X 10.4 and 10.5) and Tk 8.5 (the default on 10.6).  Lib/tkinter/font.py calls the Tk "font names" commands to check whether a font is already defined.  At the point where test_font.py is initially run, there has not been any real Tk activity yet.  For some reason, with 8.5 the system font names are returned; with 8.4 they are not:

$ /usr/bin/wish8.4
% font names
$ /usr/bin/wish8.5
% font names
systemPushButtonFont systemMenuItemFont systemApplicationFont systemSystemFont systemMenuItemMarkFont TkMenuFont TkDefaultFont systemSmallEmphasizedSystemFont systemDetailEmphasizedSystemFont systemMiniSystemFont TkHeadingFont TkTooltipFont systemUtilityWindowTitleFont systemViewsFont systemSmallSystemFont systemMenuTitleFont systemEmphasizedSystemFont TkTextFont systemDetailSystemFont TkCaptionFont systemLabelFont systemAlertHeaderFont systemMenuItemCmdKeyFont TkSmallCaptionFont TkFixedFont systemWindowTitleFont systemToolbarFont TkIconFont

So, a solution for that is to add a try block in test_font.py to create a font definition for TkDefaultFont if it does not already exist.  (Presumably, after the test failed and before it was re-run, other tests ran which caused the fonts to be defined so it passes.)  This time I have tested it with both Tk 8.4 and 8.5 on OS X 10.5 and 10.6.  Additional patch file attached (to be applied on top of the already applied first patch).
msg118003 - (view) Author: Antoine Pitrou (pitrou) * (Python committer) Date: 2010-10-05 11:25
I've committed the patch in r85229. Let's see if this makes the buildbots happy.
msg118007 - (view) Author: Antoine Pitrou (pitrou) * (Python committer) Date: 2010-10-05 12:43
Looks alright, thank you!
History
Date User Action Args
2022-04-11 14:57:06adminsetgithub: 54108
2010-10-05 12:43:16pitrousetstatus: open -> closed
resolution: accepted -> fixed
messages: + msg118007

stage: patch review -> resolved
2010-10-05 11:25:25pitrousetmessages: + msg118003
2010-10-05 05:04:41ned.deilysetfiles: + issue9899-fix1-py3k.patch
messages: + msg117990

assignee: ned.deily ->
resolution: fixed -> accepted
stage: resolved -> patch review
2010-09-26 16:28:07ned.deilysetassignee: ned.deily
messages: + msg117420
2010-09-26 12:31:46pitrousetstatus: closed -> open

messages: + msg117414
2010-09-21 19:22:33pitrousetstatus: pending -> closed
2010-09-21 16:26:37pitrousetstatus: open -> pending
resolution: fixed
messages: + msg117080

stage: commit review -> resolved
2010-09-21 03:21:43ned.deilysetmessages: + msg117023
stage: patch review -> commit review
2010-09-20 13:37:01pitrousetnosy: + pitrou
messages: + msg116933
2010-09-20 02:25:41ned.deilysetfiles: + issue9899-py3k.patch

components: + Tkinter
title: [REGRESSION] test_tk broken on MacOSX 10.6 -> tkinter test_font fails on OS X with Aqua Tk
keywords: + patch
nosy: + amaury.forgeotdarc, gpolo, ned.deily

messages: + msg116906
stage: patch review
2010-09-19 20:42:57donmezcreate