classification
Title: Tk 8.6.0 introduces TypeError. (Tk 8.5.13 works)
Type: behavior Stage: resolved
Components: Tkinter Versions: Python 3.4, Python 3.3, Python 2.7
process
Status: closed Resolution: fixed
Dependencies: 18101 Superseder:
Assigned To: serhiy.storchaka Nosy List: Arfrever, alejandroautalan, floppymaster, gpolo, martin.panter, python-dev, roger.serwy, serhiy.storchaka
Priority: critical Keywords: patch

Created on 2012-12-29 06:38 by roger.serwy, last changed 2013-10-27 10:46 by serhiy.storchaka. This issue is now closed.

Files
File name Uploaded Description Edit
tk_86_error.py roger.serwy, 2012-12-29 06:38
tk_86_workaround.py roger.serwy, 2013-05-30 04:57
tkinter_no_tcl_obj.patch serhiy.storchaka, 2013-05-30 14:50 Switch off Tcl_Obj review
tkinter_split.patch serhiy.storchaka, 2013-05-30 14:53 Tk.splitline() and Tk.split() work with Tcl_Obj review
Messages (16)
msg178475 - (view) Author: Roger Serwy (roger.serwy) * (Python committer) Date: 2012-12-29 06:38
I am running Arch Linux with the latest Tcl/Tk 8.6.0 build with Python 2.7.3 and 3.3.0, and the latest 3.4.0a0 build from the repository.

Running the attached script fails when calling pack_info(). Here's is the script's output:

8.6
Traceback (most recent call last):
  File "tk_86_error.py", line 6, in <module>
    label.pack_info()
  File "/usr/lib/python3.3/tkinter/__init__.py", line 1884, in pack_info
    self.tk.call('pack', 'info', self._w))
TypeError: Can't convert '_tkinter.Tcl_Obj' object to str implicitly


This error did not occur when using Tk 8.5.13.
msg178720 - (view) Author: Roger Serwy (roger.serwy) * (Python committer) Date: 2012-12-31 23:58
In Objects/unicodeobject.c in PyUnicode_FromObject, the call to PyUnicode_CheckExact fails when using 8.6.0 but works with 8.5.13.
msg178729 - (view) Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) Date: 2013-01-01 10:10
I don't install Tcl/Tk 8.6 yet, but looks as "pack info" call returns a new type of Tcl data (perhaps DictType) which doesn't detected in FromObj().
msg178757 - (view) Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) Date: 2013-01-01 21:25
The simplest fix probably is just wrap self.tk.call() with str() (I have not tested it yet). However the problem is more serious (tkinter doesn't support fully even 8.5 and subtle bugs are possible) and I'll spend some more time on its research.
msg184624 - (view) Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) Date: 2013-03-19 10:05
Here is a patch which add support of Tcl_Obj to tkinter's splitlist(). This not only fixes some incompatibility with Tk 8.6, but can fix some issues with older Tk versions (see for example issue17397).
msg184840 - (view) Author: Roger Serwy (roger.serwy) * (Python committer) Date: 2013-03-21 03:45
Serhiy, I applied your patch but I still get the same error. 

From what I have found so far, the FromObj function in Modules/_tkinter.c relies on cached values for different Tcl_ObjType, as given in the TkappObject struct. From the comment:

    /* We cannot include tclInt.h, as this is internal.
       So we cache interesting types here. */

I haven't traced down the exact difference between 8.5 and 8.6 that causes the existing cached types to not match. The correct behavior from 8.5 is a match to "StringType". I've noticed a lot more macros in the 8.6 headers than in 8.5 which may be the culprit.
msg190336 - (view) Author: Roger Serwy (roger.serwy) * (Python committer) Date: 2013-05-30 04:57
The problem I'm encountering is that tk.splitlist() is now being given a Tcl_Obj instead of a "str" type. Since everything is Tcl is a string, explicitly casting a Tcl_Obj to a string seems reasonable. Attached is some proof-of-concept code to work around the issue.


Serhiy's patch against 3.4 gives this traceback:

[python@saturn 3.4]$ ./python tk_86_error.py 
8.6
Traceback (most recent call last):
  File "tk_86_error.py", line 6, in <module>
    label.pack_info()
  File "/home/python/python/3.4/Lib/tkinter/__init__.py", line 1924, in pack_info
    if value[:1] == '.':
TypeError: '_tkinter.Tcl_Obj' object is not subscriptable
msg190360 - (view) Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) Date: 2013-05-30 14:45
Yes, I considered this option. A sure way to get rid of this and future changes in Tcl types, is get rid of Tcl_Obj at all and always return strings (if it is not a number or list). The drawback of this method is that occurs unnecessary conversion between Tcl and Python types and that information about types is lost. Also it is possible to hamper support for new Tcl types (dict, StateSpec, etc) in  future.

Another way is much more difficult. We need to allow all Tkinter functions to accept Tcl_Obj. Unfortunately this doesn't solve the problem fully because other code might expect a string instead of Tcl_Obj. We don't have enough test coverage to verify that the changes are sufficient. In any case, there are third-party code, which will also have to change to support the new Tcl versions.
msg190362 - (view) Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) Date: 2013-05-30 14:50
Here are a patch which quickly switch off Tcl_Obj.
msg190363 - (view) Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) Date: 2013-05-30 14:53
And here is a patch which allows Tk.splitline() and Tk.split() to work with Tcl_Obj. It also includes some other minor fixes to support Tcl 8.6. The patch includes a fix for issue18101.
msg192062 - (view) Author: Arfrever Frehtes Taifersar Arahesis (Arfrever) * Date: 2013-06-30 06:37
Please commit the full patch in all active branches.
msg193586 - (view) Author: alejandro autalan (alejandroautalan) Date: 2013-07-23 06:15
Hello.
I tried 'tkinter_split.patch' patch against 3.3.2, but a fix for grid_info function is also needed.

#test.py
import tkinter as tk

root = tk.Tk()
b = tk.Button(root, text='Button')
b.grid()
print(b.grid_info())
root.mainloop()


Here's is the script's output:

alejandro@vostro1:~/tmp$ cpython3.3 test.py 
Traceback (most recent call last):
  File "test.py", line 10, in <module>
    print(b.grid_info())
  File "/home/alejandro/apps/cpython3.3.2/lib/python3.3/tkinter/__init__.py", line 2024, in grid_info
    if value[:1] == '.':
TypeError: '_tkinter.Tcl_Obj' object is not subscriptable
msg195899 - (view) Author: Roundup Robot (python-dev) Date: 2013-08-22 14:45
New changeset 6b841e1ee3b8 by Serhiy Storchaka in branch '3.3':
Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
http://hg.python.org/cpython/rev/6b841e1ee3b8

New changeset 85285e6e28f4 by Serhiy Storchaka in branch 'default':
Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
http://hg.python.org/cpython/rev/85285e6e28f4

New changeset 2d96764a66fa by Serhiy Storchaka in branch '2.7':
Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
http://hg.python.org/cpython/rev/2d96764a66fa
msg195901 - (view) Author: Roundup Robot (python-dev) Date: 2013-08-22 14:56
New changeset 516b0cd87a90 by Serhiy Storchaka in branch '3.3':
Issue #16809: Fixed some tkinter incompabilities with Tcl/Tk 8.6.
http://hg.python.org/cpython/rev/516b0cd87a90

New changeset 5b5ef012cd4e by Serhiy Storchaka in branch 'default':
Issue #16809: Fixed some tkinter incompabilities with Tcl/Tk 8.6.
http://hg.python.org/cpython/rev/5b5ef012cd4e

New changeset 06244031b608 by Serhiy Storchaka in branch '2.7':
Issue #16809: Fixed some tkinter incompabilities with Tcl/Tk 8.6.
http://hg.python.org/cpython/rev/06244031b608
msg195902 - (view) Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) Date: 2013-08-22 15:05
Thank you alejandro. Fixed.

I'm afraid this is not all problems with 8.6 and so left this issue open.
msg201445 - (view) Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) Date: 2013-10-27 10:46
Since there are no other reports about 8.6 I close this issue.
History
Date User Action Args
2013-10-27 10:46:32serhiy.storchakasetstatus: open -> closed
resolution: fixed
messages: + msg201445

stage: commit review -> resolved
2013-08-22 15:05:30serhiy.storchakasetpriority: high -> critical

stage: needs patch -> commit review
messages: + msg195902
versions: - Python 3.2
2013-08-22 14:56:01python-devsetmessages: + msg195901
2013-08-22 14:45:47python-devsetnosy: + python-dev
messages: + msg195899
2013-07-23 06:15:04alejandroautalansetnosy: + alejandroautalan
messages: + msg193586
2013-06-30 06:37:14Arfreversetmessages: + msg192062
2013-06-30 05:44:17floppymastersetnosy: + floppymaster
2013-05-30 14:54:15serhiy.storchakasetfiles: - tkinter_splitlist.patch
2013-05-30 14:53:55serhiy.storchakasetfiles: + tkinter_split.patch

messages: + msg190363
2013-05-30 14:50:02serhiy.storchakasetfiles: + tkinter_no_tcl_obj.patch

messages: + msg190362
2013-05-30 14:45:33serhiy.storchakasetdependencies: + Tk.split() doesn't work with nested Unicode strings
messages: + msg190360
2013-05-30 04:57:31roger.serwysetfiles: + tk_86_workaround.py

messages: + msg190336
stage: patch review -> needs patch
2013-03-21 03:45:44roger.serwysetmessages: + msg184840
2013-03-19 10:05:03serhiy.storchakasetfiles: + tkinter_splitlist.patch

versions: + Python 3.2
keywords: + patch
nosy: + gpolo

messages: + msg184624
stage: patch review
2013-02-21 11:51:03serhiy.storchakalinkissue17266 superseder
2013-02-01 02:23:48martin.pantersetnosy: + martin.panter
2013-01-01 21:25:32serhiy.storchakasetassignee: serhiy.storchaka
messages: + msg178757
2013-01-01 10:10:02serhiy.storchakasetmessages: + msg178729
2012-12-31 23:58:25roger.serwysetmessages: + msg178720
2012-12-29 16:39:28serhiy.storchakasetnosy: + serhiy.storchaka
2012-12-29 07:52:42Arfreversetnosy: + Arfrever
2012-12-29 06:38:27roger.serwycreate