def fix_tk86(): import tkinter tkinter._Tk = tkinter.Tk def wrapper(func, name): Tcl_Obj = tkinter._tkinter.Tcl_Obj def f(*args, **kwargs): print(name, 'wrapped', args, kwargs) t = [i for i in args if isinstance(i, Tcl_Obj)] for i in t: print(name, 'FOUND arg:', repr(i), type(i), str(i)) args = [i if not isinstance(i, Tcl_Obj) else str(i) for i in args] for key, value in kwargs.items(): if isinstance(value, Tcl_Obj): print(name, 'FOUND kwarg:', key, value) kwargs[key] = str(value) return func(*args, **kwargs) return f class TkReflector(object): def __init__(self, tk): self.tk = tk def __getattribute__(self, name): a = getattr(object.__getattribute__(self, 'tk'), name) if hasattr(a, '__call__'): return wrapper(a, name) else: return a class TkFix(tkinter.Tk): def __init__(self, *args, **kwargs): tkinter._Tk.__init__(self, *args, **kwargs) self.__tk = self.tk version = self.tk.call('info', 'patchlevel') if version.startswith('8.6'): self.tk = TkReflector(self.__tk) tkinter.Tk = TkFix fix_tk86() from tkinter import * print(TkVersion) root = Tk() label = Label(root, text='test') label.pack() label.pack_info() root.mainloop()