Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
MacOS homebrew python 3.7.4 with tcl-tk (properly)
class Python < Formula
desc "Interpreted, interactive, object-oriented programming language"
homepage "https://www.python.org/"
url "https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tar.xz"
sha256 "fb799134b868199930b75f26678f18932214042639cd52b16da7fd134cd9b13f"
head "https://github.com/python/cpython.git"
bottle do
sha256 "25e0099852136c4ef1efd221247d0f67aa71f7b624211b98898f8b46c612f40d" => :mojave
sha256 "b65fecb4bb8350359488d6ca4c0a5a343f658f424d101a45e28d5a72de7f455c" => :high_sierra
sha256 "b07ec3a40f58fa317e1bb937992dc0dca7d60812c60de99bde14fbadb6c27cc5" => :sierra
end
# setuptools remembers the build flags python is built with and uses them to
# build packages later. Xcode-only systems need different flags.
pour_bottle? do
reason <<~EOS
The bottle needs the Apple Command Line Tools to be installed.
You can install them, if desired, with:
xcode-select --install
EOS
satisfy { MacOS::CLT.installed? }
end
depends_on "pkg-config" => :build
depends_on "gdbm"
depends_on "openssl"
depends_on "readline"
depends_on "sqlite"
depends_on "xz"
depends_on "tcl-tk" # as apple's one is shiiiiite
skip_clean "bin/pip3", "bin/pip-3.4", "bin/pip-3.5", "bin/pip-3.6", "bin/pip-3.7"
skip_clean "bin/easy_install3", "bin/easy_install-3.4", "bin/easy_install-3.5", "bin/easy_install-3.6", "bin/easy_install-3.7"
resource "setuptools" do
url "https://files.pythonhosted.org/packages/c2/f7/c7b501b783e5a74cf1768bc174ee4fb0a8a6ee5af6afa92274ff964703e0/setuptools-40.8.0.zip"
sha256 "6e4eec90337e849ade7103723b9a99631c1f0d19990d6e8412dc42f5ae8b304d"
end
resource "pip" do
url "https://files.pythonhosted.org/packages/36/fa/51ca4d57392e2f69397cd6e5af23da2a8d37884a605f9e3f2d3bfdc48397/pip-19.0.3.tar.gz"
sha256 "6e6f197a1abfb45118dbb878b5c859a0edbdd33fd250100bc015b67fded4b9f2"
end
resource "wheel" do
url "https://files.pythonhosted.org/packages/b7/cf/1ea0f5b3ce55cacde1e84cdde6cee1ebaff51bd9a3e6c7ba4082199af6f6/wheel-0.33.1.tar.gz"
sha256 "66a8fd76f28977bb664b098372daef2b27f60dc4d1688cfab7b37a09448f0e9d"
end
# Homebrew's tcl-tk is built in a standard unix fashion (due to link errors)
# so we have to stop python from searching for frameworks and linking against
# X11.
patch :DATA
def install
# Unset these so that installing pip and setuptools puts them where we want
# and not into some other Python the user has installed.
ENV["PYTHONHOME"] = nil
ENV["PYTHONPATH"] = nil
xy = (buildpath/"configure.ac").read.slice(/PYTHON_VERSION, (3\.\d)/, 1)
lib_cellar = prefix/"Frameworks/Python.framework/Versions/#{xy}/lib/python#{xy}"
args = %W[
--prefix=#{prefix}
--enable-ipv6
--datarootdir=#{share}
--datadir=#{share}
--enable-framework=#{frameworks}
--enable-loadable-sqlite-extensions
--without-ensurepip
--with-dtrace
--with-openssl=#{Formula["openssl"].opt_prefix}
]
args << "--without-gcc" if ENV.compiler == :clang
cflags = []
ldflags = []
cppflags = []
if MacOS.sdk_path_if_needed
# Help Python's build system (setuptools/pip) to build things on SDK-based systems
# The setup.py looks at "-isysroot" to get the sysroot (and not at --sysroot)
cflags << "-isysroot #{MacOS.sdk_path}" << "-I#{MacOS.sdk_path}/usr/include"
ldflags << "-isysroot #{MacOS.sdk_path}"
# For the Xlib.h, Python needs this header dir with the system Tk
# Yep, this needs the absolute path where zlib needed a path relative
# to the SDK.
# as external tck is added later on uncomment this
# cflags << "-I#{MacOS.sdk_path}/System/Library/Frameworks/Tk.framework/Versions/8.5/Headers"
end
# Avoid linking to libgcc https://mail.python.org/pipermail/python-dev/2012-February/116205.html
args << "MACOSX_DEPLOYMENT_TARGET=#{MacOS.version}"
# We want our readline! This is just to outsmart the detection code,
# superenv makes cc always find includes/libs!
inreplace "setup.py",
"do_readline = self.compiler.find_library_file(lib_dirs, 'readline')",
"do_readline = '#{Formula["readline"].opt_lib}/libhistory.dylib'"
inreplace "setup.py" do |s|
s.gsub! "sqlite_setup_debug = False", "sqlite_setup_debug = True"
s.gsub! "for d_ in inc_dirs + sqlite_inc_paths:",
"for d_ in ['#{Formula["sqlite"].opt_include}']:"
end
# Allow python modules to use ctypes.find_library to find homebrew's stuff
# even if homebrew is not a /usr/local/lib. Try this with:
# `brew install enchant && pip install pyenchant`
inreplace "./Lib/ctypes/macholib/dyld.py" do |f|
f.gsub! "DEFAULT_LIBRARY_FALLBACK = [", "DEFAULT_LIBRARY_FALLBACK = [ '#{HOMEBREW_PREFIX}/lib',"
f.gsub! "DEFAULT_FRAMEWORK_FALLBACK = [", "DEFAULT_FRAMEWORK_FALLBACK = [ '#{HOMEBREW_PREFIX}/Frameworks',"
end
# ADD tcl-tk include / lib paths
tcl_tk = Formula["tcl-tk"].opt_prefix
cppflags << "-I#{tcl_tk}/include"
ldflags << "-L#{tcl_tk}/lib"
args << "CFLAGS=#{cflags.join(" ")}" unless cflags.empty?
args << "LDFLAGS=#{ldflags.join(" ")}" unless ldflags.empty?
args << "CPPFLAGS=#{cppflags.join(" ")}" unless cppflags.empty?
system "./configure", *args
system "make"
ENV.deparallelize do
# Tell Python not to install into /Applications (default for framework builds)
system "make", "install", "PYTHONAPPSDIR=#{prefix}"
system "make", "frameworkinstallextras", "PYTHONAPPSDIR=#{pkgshare}"
end
# Any .app get a " 3" attached, so it does not conflict with python 2.x.
Dir.glob("#{prefix}/*.app") { |app| mv app, app.sub(/\.app$/, " 3.app") }
# Prevent third-party packages from building against fragile Cellar paths
inreplace Dir[lib_cellar/"**/_sysconfigdata_m_darwin_darwin.py",
lib_cellar/"config*/Makefile",
frameworks/"Python.framework/Versions/3*/lib/pkgconfig/python-3.?.pc"],
prefix, opt_prefix
# Help third-party packages find the Python framework
inreplace Dir[lib_cellar/"config*/Makefile"],
/^LINKFORSHARED=(.*)PYTHONFRAMEWORKDIR(.*)/,
"LINKFORSHARED=\\1PYTHONFRAMEWORKINSTALLDIR\\2"
# Fix for https://github.com/Homebrew/homebrew-core/issues/21212
inreplace Dir[lib_cellar/"**/_sysconfigdata_m_darwin_darwin.py"],
%r{('LINKFORSHARED': .*?)'(Python.framework/Versions/3.\d+/Python)'}m,
"\\1'#{opt_prefix}/Frameworks/\\2'"
# A fix, because python and python3 both want to install Python.framework
# and therefore we can't link both into HOMEBREW_PREFIX/Frameworks
# https://github.com/Homebrew/homebrew/issues/15943
["Headers", "Python", "Resources"].each { |f| rm(prefix/"Frameworks/Python.framework/#{f}") }
rm prefix/"Frameworks/Python.framework/Versions/Current"
# Symlink the pkgconfig files into HOMEBREW_PREFIX so they're accessible.
(lib/"pkgconfig").install_symlink Dir["#{frameworks}/Python.framework/Versions/#{xy}/lib/pkgconfig/*"]
# Remove the site-packages that Python created in its Cellar.
(prefix/"Frameworks/Python.framework/Versions/#{xy}/lib/python#{xy}/site-packages").rmtree
%w[setuptools pip wheel].each do |r|
(libexec/r).install resource(r)
end
# Install unversioned symlinks in libexec/bin.
{
"idle" => "idle3",
"pydoc" => "pydoc3",
"python" => "python3",
"python-config" => "python3-config",
}.each do |unversioned_name, versioned_name|
(libexec/"bin").install_symlink (bin/versioned_name).realpath => unversioned_name
end
end
def post_install
ENV.delete "PYTHONPATH"
xy = (prefix/"Frameworks/Python.framework/Versions").children.min.basename.to_s
site_packages = HOMEBREW_PREFIX/"lib/python#{xy}/site-packages"
site_packages_cellar = prefix/"Frameworks/Python.framework/Versions/#{xy}/lib/python#{xy}/site-packages"
# Fix up the site-packages so that user-installed Python software survives
# minor updates, such as going from 3.3.2 to 3.3.3:
# Create a site-packages in HOMEBREW_PREFIX/lib/python#{xy}/site-packages
site_packages.mkpath
# Symlink the prefix site-packages into the cellar.
site_packages_cellar.unlink if site_packages_cellar.exist?
site_packages_cellar.parent.install_symlink site_packages
# Write our sitecustomize.py
rm_rf Dir["#{site_packages}/sitecustomize.py[co]"]
(site_packages/"sitecustomize.py").atomic_write(sitecustomize)
# Remove old setuptools installations that may still fly around and be
# listed in the easy_install.pth. This can break setuptools build with
# zipimport.ZipImportError: bad local file header
# setuptools-0.9.8-py3.3.egg
rm_rf Dir["#{site_packages}/setuptools*"]
rm_rf Dir["#{site_packages}/distribute*"]
rm_rf Dir["#{site_packages}/pip[-_.][0-9]*", "#{site_packages}/pip"]
%w[setuptools pip wheel].each do |pkg|
(libexec/pkg).cd do
system bin/"python3", "-s", "setup.py", "--no-user-cfg", "install",
"--force", "--verbose", "--install-scripts=#{bin}",
"--install-lib=#{site_packages}",
"--single-version-externally-managed",
"--record=installed.txt"
end
end
rm_rf [bin/"pip", bin/"easy_install"]
mv bin/"wheel", bin/"wheel3"
# Install unversioned symlinks in libexec/bin.
{
"easy_install" => "easy_install-#{xy}",
"pip" => "pip3",
"wheel" => "wheel3",
}.each do |unversioned_name, versioned_name|
(libexec/"bin").install_symlink (bin/versioned_name).realpath => unversioned_name
end
# post_install happens after link
%W[pip3 pip#{xy} easy_install-#{xy} wheel3].each do |e|
(HOMEBREW_PREFIX/"bin").install_symlink bin/e
end
# Help distutils find brewed stuff when building extensions
include_dirs = [HOMEBREW_PREFIX/"include", Formula["openssl"].opt_include,
Formula["sqlite"].opt_include]
library_dirs = [HOMEBREW_PREFIX/"lib", Formula["openssl"].opt_lib,
Formula["sqlite"].opt_lib]
# Again tcl-tk
include_dirs << Formula["tcl-tk"].opt_include
library_dirs << Formula["tcl-tk"].opt_lib
cfg = prefix/"Frameworks/Python.framework/Versions/#{xy}/lib/python#{xy}/distutils/distutils.cfg"
cfg.atomic_write <<~EOS
[install]
prefix=#{HOMEBREW_PREFIX}
[build_ext]
include_dirs=#{include_dirs.join ":"}
library_dirs=#{library_dirs.join ":"}
EOS
end
def sitecustomize
xy = (prefix/"Frameworks/Python.framework/Versions").children.min.basename.to_s
<<~EOS
# This file is created by Homebrew and is executed on each python startup.
# Don't print from here, or else python command line scripts may fail!
# <https://docs.brew.sh/Homebrew-and-Python>
import re
import os
import sys
if sys.version_info[0] != 3:
# This can only happen if the user has set the PYTHONPATH for 3.x and run Python 2.x or vice versa.
# Every Python looks at the PYTHONPATH variable and we can't fix it here in sitecustomize.py,
# because the PYTHONPATH is evaluated after the sitecustomize.py. Many modules (e.g. PyQt4) are
# built only for a specific version of Python and will fail with cryptic error messages.
# In the end this means: Don't set the PYTHONPATH permanently if you use different Python versions.
exit('Your PYTHONPATH points to a site-packages dir for Python 3.x but you are running Python ' +
str(sys.version_info[0]) + '.x!\\n PYTHONPATH is currently: "' + str(os.environ['PYTHONPATH']) + '"\\n' +
' You should `unset PYTHONPATH` to fix this.')
# Only do this for a brewed python:
if os.path.realpath(sys.executable).startswith('#{rack}'):
# Shuffle /Library site-packages to the end of sys.path
library_site = '/Library/Python/#{xy}/site-packages'
library_packages = [p for p in sys.path if p.startswith(library_site)]
sys.path = [p for p in sys.path if not p.startswith(library_site)]
# .pth files have already been processed so don't use addsitedir
sys.path.extend(library_packages)
# the Cellar site-packages is a symlink to the HOMEBREW_PREFIX
# site_packages; prefer the shorter paths
long_prefix = re.compile(r'#{rack}/[0-9\._abrc]+/Frameworks/Python\.framework/Versions/#{xy}/lib/python#{xy}/site-packages')
sys.path = [long_prefix.sub('#{HOMEBREW_PREFIX/"lib/python#{xy}/site-packages"}', p) for p in sys.path]
# Set the sys.executable to use the opt_prefix, unless explicitly set
# with PYTHONEXECUTABLE:
if 'PYTHONEXECUTABLE' not in os.environ:
sys.executable = '#{opt_bin}/python#{xy}'
EOS
end
def caveats
if prefix.exist?
xy = (prefix/"Frameworks/Python.framework/Versions").children.min.basename.to_s
else
xy = version.to_s.slice(/(3\.\d)/) || "3.7"
end
<<~EOS
Python has been installed as
#{HOMEBREW_PREFIX}/bin/python3
Unversioned symlinks `python`, `python-config`, `pip` etc. pointing to
`python3`, `python3-config`, `pip3` etc., respectively, have been installed into
#{opt_libexec}/bin
If you need Homebrew's Python 2.7 run
brew install python@2
You can install Python packages with
pip3 install <package>
They will install into the site-package directory
#{HOMEBREW_PREFIX/"lib/python#{xy}/site-packages"}
See: https://docs.brew.sh/Homebrew-and-Python
EOS
end
test do
xy = (prefix/"Frameworks/Python.framework/Versions").children.min.basename.to_s
# Check if sqlite is ok, because we build with --enable-loadable-sqlite-extensions
# and it can occur that building sqlite silently fails if OSX's sqlite is used.
system "#{bin}/python#{xy}", "-c", "import sqlite3"
# Check if some other modules import. Then the linked libs are working.
system "#{bin}/python#{xy}", "-c", "import tkinter; root = tkinter.Tk()"
system "#{bin}/python#{xy}", "-c", "import _gdbm"
system "#{bin}/python#{xy}", "-c", "import zlib"
system bin/"pip3", "list", "--format=columns"
end
end
__END__
diff --git a/setup.py b/setup.py
index 2779658..902d0eb 100644
--- a/setup.py
+++ b/setup.py
@@ -1699,9 +1699,6 @@ class PyBuildExt(build_ext):
# Rather than complicate the code below, detecting and building
# AquaTk is a separate method. Only one Tkinter will be built on
# Darwin - either AquaTk, if it is found, or X11 based Tk.
- if (host_platform == 'darwin' and
- self.detect_tkinter_darwin(inc_dirs, lib_dirs)):
- return
# Assume we haven't found any of the libraries or include files
# The versions with dots are used on Unix, and the versions without
@@ -1747,22 +1744,6 @@ class PyBuildExt(build_ext):
if dir not in include_dirs:
include_dirs.append(dir)
- # Check for various platform-specific directories
- if host_platform == 'sunos5':
- include_dirs.append('/usr/openwin/include')
- added_lib_dirs.append('/usr/openwin/lib')
- elif os.path.exists('/usr/X11R6/include'):
- include_dirs.append('/usr/X11R6/include')
- added_lib_dirs.append('/usr/X11R6/lib64')
- added_lib_dirs.append('/usr/X11R6/lib')
- elif os.path.exists('/usr/X11R5/include'):
- include_dirs.append('/usr/X11R5/include')
- added_lib_dirs.append('/usr/X11R5/lib')
- else:
- # Assume default location for X11
- include_dirs.append('/usr/X11/include')
- added_lib_dirs.append('/usr/X11/lib')
-
# If Cygwin, then verify that X is installed before proceeding
if host_platform == 'cygwin':
x11_inc = find_file('X11/Xlib.h', [], include_dirs)
@@ -1786,10 +1767,6 @@ class PyBuildExt(build_ext):
if host_platform in ['aix3', 'aix4']:
libs.append('ld')
- # Finally, link with the X11 libraries (not appropriate on cygwin)
- if host_platform != "cygwin":
- libs.append('X11')
-
ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
define_macros=[('WITH_APPINIT', 1)] + defs,
include_dirs = include_dirs,
@iexa

This comment has been minimized.

Copy link
Owner Author

iexa commented May 20, 2019

I tried it on macOS 10.11 and 10.13 only; should work the same on all macOS versions upwards. Follow these steps:

  1. xcode-select --install (to install xcode command line tools - it is required if installing a package from source code)

  2. brew update

  3. Replace /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/python.rb with the file above (use the raw version),

  4. HOMEBREW_NO_AUTO_UPDATE=1 brew install --build-from-source python (note: --build-from-source is very important)

  5. python3 -c "import tkinter; print(tkinter.TkVersion)"

  6. you should see 8.6 on your screen. If so great - build something cool with tcl/tk/ttk. If not -check for errors & post here I'll try to help.

  7. if a newer python version is out, just go to the python site and grab the link to the latest 3.x & put it into line 4; go download it and run openssl dgst -sha256 [FILENAME_of_DOWNLOADED_python.tar.gz] on it to get the sha256 hash and replace that in line 5

If you already have python (version 3) installed with brew and the older system tk, then you should do a brew uninstall python and brew cleanup first before anything else is attempted.

If a newer python version should appear by the time you read this, just replace everything above the patch :DATA line (line 54) in this file from the newer python.rb file, and add back the line depends_on "tcl-tk" (line 31). Leave everything else as is. It should work just fine.

@AllenDang

This comment has been minimized.

Copy link

AllenDang commented Jun 4, 2019

I noticed a error in step 2:
2. Replace /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/python.rb with the file above
The path of python.rb is incorrect, should be changed to
/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/python.rb

@mpaniwozik

This comment has been minimized.

Copy link

mpaniwozik commented Jun 8, 2019

Tried this today but no go, still getting 8.5. Not showing any errors. Running python 3.7.3 that has been updated via brew. Any ideas?

@iexa

This comment has been minimized.

Copy link
Owner Author

iexa commented Jul 3, 2019

Thanks @AllenDang, I missed that, prob. not checked :( my bad. As for @mpaniwozik: the problem usually is that brew overwrites the /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/python.rb file with a new(ish/-er) one, and removes the changes outlined here. Sometimes when you make the mod, do a cat on this file to check if it is the changed one, and then do the brew install python step it still does automatically a brew update -- which just git clones its own repo and removes the changes. So do the steps, but before saving the python.rb file with the changes, do a brew update manually, then save the python.rb file, and try from there.

@chmedly

This comment has been minimized.

Copy link

chmedly commented Jul 10, 2019

I tried this according to the instructions and indeed found that brew auto-updated itself right before installing python and overwrote the python.rb file that was created. Then I found this link https://apple.stackexchange.com/questions/293250/how-to-install-an-homebrew-formula-without-updating-homebrew-itself and tried it to install with this .rb. It appeared to go as planned but python3.7.3 still tells me that Tk is version 8.5. Wah,wah (sad horns).

@iexa

This comment has been minimized.

Copy link
Owner Author

iexa commented Jul 13, 2019

Strange. If you did everything correctly (and checked the path for the python.rb file is correct and its contents are correct) then my only suggestion is to do a brew uninstall python && brew cleanup before trying again. I had this problem like you many times but it works now fine.

Also if you add an export HOMEBREW_NO_AUTO_UPDATE=1 to your .bash_profile file - as suggested in the stackexchange thread -, make sure to do a source ~/.bash_profile before attempting again (to reload env vars from it in current shell)

@ramkyc

This comment has been minimized.

Copy link

ramkyc commented Jul 14, 2019

@iexa, I also tried your solution, it still shows 8.5 version of tcl-tk.

@iexa

This comment has been minimized.

Copy link
Owner Author

iexa commented Jul 15, 2019

@ramkyc, what version of macos are you using? could you paste a log onto gist? just do the install step 3 like this:
brew install python 2>&1 | tee install.log - then paste the contents of the install.log file to a gist and share - I'd pretty much like to take a look at it if possible.

@ramkyc

This comment has been minimized.

Copy link

ramkyc commented Jul 15, 2019

Tried as you said; still the same result ==> 8.5
Install.log attached.
install

@iexa

This comment has been minimized.

Copy link
Owner Author

iexa commented Jul 18, 2019

Thanks for the log, it helped immensely. I know what the problem is. brew has 2 options for installing packages:

  • a) from a "bottle" -- that is a precompiled package from their servers -> in this mode the changes I've outlined do not matter at all, as they are ignored. This is the default mode (but somehow on my system it was not...)
  • b) from source. This takes a bit longer but the changes are used so you will have Tk 8.6 compiled into your python 3.x for sure

I have updated my install notes above, just follow them and you'll be fine. Of course do first a brew uninstall python to be sure and then do a brew cleanup as well. You might also need to install xcode command line tools with xcode-select --install.

@chmedly

This comment has been minimized.

Copy link

chmedly commented Jul 18, 2019

I have attempted this again and it appears that I have successfully installed python3.7.4 with version 8.6 of Tcl/Tk. Here's my step by step using iexa's .rb file.

First of all, I wanted Python3.7.4 (latest as of my post) so I edited the script changing both references in line 4 to 3.7.4 instead of 3.7.3. I also changed the SHA256 (line5) so that it matches the 3.7.4.tar.xz file. I got the SHA by downloading the file from Python.org and running openssl dgst -sha256 Python-3.7.4.tar.xz on the file.

Then I ran brew update just to make sure everything was as fresh as possible.

Then I moved the existing python.rb file out of the "Formula" folder and into the parent folder. One reason was that it was a good way to see if homebrew was updating before installing or not. I found that when brew update occurred, it overwrote the homebrew-core folder removing this file. So, if the file still exists after doing an install, then I know it didn't update. I then copied the script into the "Formula" folder and renamed it to python.rb I don't know that this rename is necessary but it seemed to make sense to me.

Then I did the actual install with this line:
HOMEBREW_NO_AUTO_UPDATE=1 brew install --build-from-source python
I found that if I did not use the NO_AUTO_UPDATE prefix, it would overwrite the brew and obviously mess up the install. I think this needs to be added to the instructions...

After that I checked by starting python in a terminal python3 and importing tkinter import tkinter and then checking the version with tkinter.TkVersion This simply printed to the command line "8.6".

Thank You iexa!

@iexa

This comment has been minimized.

Copy link
Owner Author

iexa commented Jul 19, 2019

@chmedly: Thanks for your input, I've added the no_auto_update to the above instructions just to be sure.

Also if someone wants to use idle3 for developing / testing (instead of jupyter, pycharm, wingide, sublime, etc.), I suggest to install idlex by pip install idlex in a python3 virtual env, and then use its non-blocking gui editor feature. No need to install anything else.

I've also updated the code to use python 3.7.4 now. Only lines 4 and 5 changed.

@chmedly

This comment has been minimized.

Copy link

chmedly commented Jul 19, 2019

So, it appears that tklib is not installed with this method. I downloaded tklib-0.6 from https://core.tcl-lang.org/tklib/home, ran the installer (which installed it to the system tcl) and then copied the resulting tklib0.6 folder to usr>local>Cellar>tcl-tk>8.6.9>lib. tklib is an old and obscure package these days and probably not something needed often, but it is included in the Tk8.5 that is already installed by Apple. Since it's missing from this homebrew install, it makes me wonder what else might be missing.

@iexa

This comment has been minimized.

Copy link
Owner Author

iexa commented Jul 21, 2019

that's why line #31 depends on "tcl-tk" is there, it is supposed to install the tcl-tk latest version inside homebrew... without it there is no way the install succeeds or succeeded, especially as it is forced to compile from source.

@ramkyc

This comment has been minimized.

Copy link

ramkyc commented Jul 22, 2019

@iexa It worked like a breeze. Building from source is a little scary for me, as I am not accustomed to installing s/w through that route. Thanks a ton.

@ignat980

This comment has been minimized.

Copy link

ignat980 commented Aug 10, 2019

@iexa thank you for this gist! I've had this problem since December 2018 and had no idea where to modify what file in homebrew to re-add the --with-tcl-tk option. I followed the instructions and everything had installed correctly! Will I have to modify anything in this file for future Python 3 updates or will everything work automatically? It looks like the Python version is hardcoded in line 4... can you give a short explanation in the difference between Homebrew's default python.rb and your file here? Thanks again :)

Edit: missed the small bit about what to do with new Python updates at the end of your install instructions, nevermind then!

@tcarroll2

This comment has been minimized.

Copy link

tcarroll2 commented Aug 12, 2019

I get this error when I try to build from source using the above file:

MacBook-Pro:~ tom$ HOMEBREW_NO_AUTO_UPDATE=1 brew install --build-from-source python
Error: python: /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/python.rb:342: syntax error, unexpected tIDENTIFIER, expecting keyword_do or '{' or '('
diff --git a/setup.py b/setup.py
^
/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/python.rb:342: syntax error, unexpected
tIDENTIFIER, expecting end-of-input
diff --git a/setup.py b/setup.py
^

@iexa

This comment has been minimized.

Copy link
Owner Author

iexa commented Aug 12, 2019

@tcarroll2: you might have copied the file erroneously. Try saving the raw version of the gist and using that to replace the file where you had the error message

@tcarroll2

This comment has been minimized.

Copy link

tcarroll2 commented Aug 12, 2019

I am going to the raw page and copying the code from there and pasting it into VSCode. It looks to be the same code. I would past the code here of what I am copying, but it doesn't format it correctly due to the comments in the source or something. It breaks out of the formatting and turns it into some crazy stuff.

@tcarroll2

This comment has been minimized.

Copy link

tcarroll2 commented Aug 12, 2019

I stand corrected. It looks like VSCode was modifying the poasted code on it's own somehow. I pasted it into BBEdit and saved and it worked just fine. Thank you for doing this!

@namann1209

This comment has been minimized.

Copy link

namann1209 commented Aug 13, 2019

I am trying to use tkinter on my system. I have python 3.7.4 and tkinter version: 8.6.
I made this install from Anaconda.

But for some reason, I am not able to run tkinter at all.

The moment I create any dialogue box, the machine crashes.

Can someone help?

@fishtreesugar

This comment has been minimized.

Copy link

fishtreesugar commented Sep 10, 2019

I use this patch compile from source, and it works! Thank you!

@viable-hartman

This comment has been minimized.

Copy link

viable-hartman commented Oct 15, 2019

Works like a charm!

@iexa

This comment has been minimized.

Copy link
Owner Author

iexa commented Oct 16, 2019

@namann1209 Regarding (ana)conda: it uses its own packages and python, so I have no idea. I know it's just the same python as the regular one, but with its own package manager (conda). If the computer freezes it might be something really wrong with its built in tkinter code.

@mpaniwozik

This comment has been minimized.

Copy link

mpaniwozik commented Oct 16, 2019

I followed the updated instructions and it worked like a charm for me as well! I had to first uninstall python using the brew uninstall python3 command and then ran brew cleanup. After python was uninstalled, I then followed @iexa instructions and I now have tkinter v8.6 working on my machine as it should. Thanks everyone for the help!

@alexpearce92

This comment has been minimized.

Copy link

alexpearce92 commented Nov 6, 2019

Worked like a charm in OS 10.15.1 Python 3.7.5 (with python.rb updates). Also appreciated that the instructions started at #0. Otherwise I would have thought I had missed a step.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.