Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
MacOS homebrew python 3.8.6 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.8.6/Python-3.8.6.tar.xz"
sha256 "a9e0b79d27aa056eb9cce8d63a427b5f9bab1465dee3f942dcfdb25a82f4ab8a"
head "https://github.com/python/cpython.git"
license "Python-2.0"
revision 1
bottle do
sha256 "123ddd272ba0670d72578b36c4801b59449ac21e9d5a7e47c34c9e489330600a" => :catalina
sha256 "6367896e90735c0f1476d297d608ee08cd5f7fccf7c794c45589093fa86f4faa" => :mojave
sha256 "8714bfcc84ab6486cc7c757028298478fc28609f148ef27497940cd5cd7292e7" => :high_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@1.1"
depends_on "readline"
depends_on "sqlite"
depends_on "xz"
depends_on "tcl-tk" # as apple's one is shiiiiite
uses_from_macos "bzip2"
uses_from_macos "libffi"
uses_from_macos "ncurses"
uses_from_macos "unzip"
uses_from_macos "zlib"
skip_clean "bin/pip3", "bin/pip-3.4", "bin/pip-3.5", "bin/pip-3.6", "bin/pip-3.7", "bin/pip-3.8"
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", "bin/easy_install-3.8"
resource "setuptools" do
url "https://files.pythonhosted.org/packages/a7/e0/30642b9c2df516506d40b563b0cbd080c49c6b3f11a70b4c7a670f13a78b/setuptools-50.3.2.zip"
sha256 "ed0519d27a243843b05d82a5e9d01b0b083d9934eaa3d02779a23da18077bd3c"
end
resource "pip" do
url "https://files.pythonhosted.org/packages/0b/f5/be8e741434a4bf4ce5dbc235aa28ed0666178ea8986ddc10d035023744e6/pip-20.2.4.tar.gz"
sha256 "85c99a857ea0fb0aedf23833d9be5c40cf253fe24443f0829c7b472e23c364a1"
end
resource "wheel" do
url "https://files.pythonhosted.org/packages/83/72/611c121b6bd15479cb62f1a425b2e3372e121b324228df28e64cc28b01c2/wheel-0.35.1.tar.gz"
sha256 "99a22d87add3f634ff917310a3d87e499f19e663413a52eb9232c447aa646c9f"
end
# Remove this block when upstream adds arm64 compatibility
if Hardware::CPU.arm?
# Upstream PRs #20171, #21114, #21224 and #21249
patch do
url "https://raw.githubusercontent.com/Homebrew/formula-patches/113aa84/python/3.8.3.patch"
sha256 "9c0d7c28c33c6036860457bd9c5a03026c71bd034907b77fbf861ff5fe216ed0"
end
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@1.1"].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(self.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 self.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__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__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
# Remove wheel test data.
# It's for people editing wheel and contains binaries which fail `brew linkage`.
rm libexec/"wheel/tox.ini"
rm_r libexec/"wheel/tests"
# 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@1.1"].opt_include,
Formula["sqlite"].opt_include]
library_dirs = [HOMEBREW_PREFIX/"lib", Formula["openssl@1.1"].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
xy = if prefix.exist?
(prefix/"Frameworks/Python.framework/Versions").children.min.basename.to_s
else
version.to_s.slice(/(3\.\d)/) || "3.8"
end
<<~EOS
Python has been installed as
#{opt_bin}/python3
Unversioned symlinks `python`, `python-config`, `pip` etc. pointing to
`python3`, `python3-config`, `pip3` etc., respectively, have been installed into
#{opt_libexec}/bin
You can install Python packages with
#{opt_bin}/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 20d7f35..b9616d3 100644
--- a/setup.py
+++ b/setup.py
@@ -1851,8 +1851,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 (MACOS and self.detect_tkinter_darwin()):
- return True
# Assume we haven't found any of the libraries or include files
# The versions with dots are used on Unix, and the versions without
@@ -1901,21 +1899,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 CYGWIN:
@@ -1937,9 +1920,6 @@ class PyBuildExt(build_ext):
libs.append('tk'+ version)
libs.append('tcl'+ version)
- # Finally, link with the X11 libraries (not appropriate on cygwin)
- if not CYGWIN:
- libs.append('X11')
# XXX handle these, but how to detect?
# *** Uncomment and edit for PIL (TkImaging) extension only:
@iexa

This comment has been minimized.

Copy link
Owner Author

@iexa iexa commented May 20, 2019

SINCE 2021/march this is no longer needed. Just install the python-tk or python-tk@3.9 (@3.10, and so on) formula and you are all set. It seems that there are still quite a few users who love simple 'batteries included' guis.

UPDATED to python 3.8.6 on 5/nov/20 -- procedure remains very much the same -- proof with idle3:
idle3 and tk8.6 *** add bg='black'

I tried it on macOS 10.11 and 10.14 only; should work the same on all macOS versions 10.11+ 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@3.8.rb with the file above (use the raw version),
    a) kudos to @dhinakg for this step:
    FRMPTH="/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/python@3.8.rb"; rm $FRMPTH; wget -O $FRMPTH https://gist.github.com/iexa/2ac761bfd96ab78988b76c030d54a5b8/raw/python-with-tcl.rb
    b) if you do not have wget but do have curl, then replace wget -O $FRMPTH... with curl -L -o $FRMPTH... from above

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

  5. python3 -c "import tkinter; tkinter.Tcl().eval('info patchlevel')

  6. you should see 8.6.10 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.

Recently python 3.9 was made to be the default with homebrew. I like to wait a few patchlevels before jumping ship as lots of pip wheels / packages have not yet been compiled for python 3.9 - so I stick with 3.8 for now. In a few months I'll probably update.

This necessitates one extra step which is linking it to the system path as 3.8 is "keg-only". Do this:
brew link --force python@3.8

@AllenDang

This comment has been minimized.

Copy link

@AllenDang 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

@iexa

This comment has been minimized.

Copy link
Owner Author

@iexa 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 viable-hartman commented Oct 15, 2019

Works like a charm!

@iexa

This comment has been minimized.

Copy link
Owner Author

@iexa 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.

@alexpearce92

This comment has been minimized.

Copy link

@alexpearce92 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.

@iexa

This comment has been minimized.

Copy link
Owner Author

@iexa iexa commented Jan 15, 2020

Updated to python 3.8.1 for such niceties as formatted string variables f'{x=}' # == f'x={x}' and the walrus operator x := 11 plus some more I forgot. 3.8 official changelog

@lawrence-lee

This comment has been minimized.

Copy link

@lawrence-lee lawrence-lee commented Jan 16, 2020

Hi @iexa,

I'm unable to get this working on macOS 10.15.2. I'm still seeing v8.5 when I execute step 4.

This is my log from step 3

HOMEBREW_NO_AUTO_UPDATE=1 brew install --build-from-source python
==> Downloading https://www.python.org/ftp/python/3.8.1/Python-3.8.1.tar.xz
######################################################################## 100.0%
==> Patching
patching file setup.py
patch unexpectedly ends in middle of line
Hunk #3 succeeded at 1920 with fuzz 1.
==> ./configure --prefix=/usr/local/Cellar/python/3.8.1 --enable-ipv6 --datarootdir=/usr/local/Cellar/python/3.8.1/share --datadir=/usr/local/Cellar/python/3.8.1/share --enable-framework=/usr/local/Cellar/python
==> make
==> make install PYTHONAPPSDIR=/usr/local/Cellar/python/3.8.1
==> make frameworkinstallextras PYTHONAPPSDIR=/usr/local/Cellar/python/3.8.1/share/python
==> Downloading https://files.pythonhosted.org/packages/f7/b6/5b98441b6749ea1db1e41e5e6e7a93cbdd7ffd45e11fe1b22d45884bc777/setuptools-42.0.2.zip
######################################################################## 100.0%
==> Downloading https://files.pythonhosted.org/packages/ce/ea/9b445176a65ae4ba22dce1d93e4b5fe182f953df71a145f557cffaffc1bf/pip-19.3.1.tar.gz
######################################################################## 100.0%
==> Downloading https://files.pythonhosted.org/packages/59/b0/11710a598e1e148fb7cbf9220fd2a0b82c98e94efbdecb299cb25e7f0b39/wheel-0.33.6.tar.gz
######################################################################## 100.0%
==> /usr/local/Cellar/python/3.8.1/bin/python3 -s setup.py --no-user-cfg install --force --verbose --install-scripts=/usr/local/Cellar/python/3.8.1/bin --install-lib=/usr/local/lib/python3.8/site-packages --sing
==> /usr/local/Cellar/python/3.8.1/bin/python3 -s setup.py --no-user-cfg install --force --verbose --install-scripts=/usr/local/Cellar/python/3.8.1/bin --install-lib=/usr/local/lib/python3.8/site-packages --sing
==> /usr/local/Cellar/python/3.8.1/bin/python3 -s setup.py --no-user-cfg install --force --verbose --install-scripts=/usr/local/Cellar/python/3.8.1/bin --install-lib=/usr/local/lib/python3.8/site-packages --sing
==> Caveats
Python has been installed as
  /usr/local/bin/python3

Unversioned symlinks `python`, `python-config`, `pip` etc. pointing to
`python3`, `python3-config`, `pip3` etc., respectively, have been installed into
  /usr/local/opt/python/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
  /usr/local/lib/python3.8/site-packages

See: https://docs.brew.sh/Homebrew-and-Python
==> Summary
🍺  /usr/local/Cellar/python/3.8.1: 8,792 files, 124.5MB, built in 1 minute 39 seconds
@iexa

This comment has been minimized.

Copy link
Owner Author

@iexa iexa commented Jan 17, 2020

Hi, based on the log you posted, you seem to have not fully replaced the python.rb file with the raw version of it from this gist - maybe a code/text editor messed it up if you opened it and then saved from there. First uninstall python with brew uninstall python then right click, save as: this raw version as python.rb then replace -like in step #2- /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/python.rb with this raw version.

You can probably do a rm /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/python.rb first and the copy what you downloaded there, then continue with #3

@asterisk37n

This comment has been minimized.

Copy link

@asterisk37n asterisk37n commented Feb 3, 2020

worked on MacOS 10.15 Catalina. Thank you.
image

@sri0sharma

This comment has been minimized.

Copy link

@sri0sharma sri0sharma commented Feb 21, 2020

Would be above instructions work with pyenv? The reason I am asking this is I installed python 3.8.1 following instructions at
https://stackoverflow.com/questions/28921333/installed-python-3-on-mac-os-x-but-its-still-python-2-7:

  1. brew install pyenv
  2. pyenv install 3.8.1
  3. pyenv global 3.8.1
  4. pyenv version

My python 3.8.1 is working fine in .pyenv, but IDLE/IDLE3 is not working, and I am afraid to mess it up.

I tried the instruction above in my mac Catalina terminal, but my python3 in step 4. (python3 -c "import tkinter; tkinter.Tcl().eval('info patchlevel')") uses by default
"/Users/ryan/.pyenv/shims/python3".

Also, when executing step 3, I get the following:
==> tcl-tk
tcl-tk is keg-only, which means it was not symlinked into /usr/local,
because tk installs some X11 headers and macOS provides an (older) Tcl/Tk.

If you need to have tcl-tk first in your PATH run:
echo 'export PATH="/usr/local/opt/tcl-tk/bin:$PATH"' >> ~/.zshrc

For compilers to find tcl-tk you may need to set:
export LDFLAGS="-L/usr/local/opt/tcl-tk/lib"
export CPPFLAGS="-I/usr/local/opt/tcl-tk/include"

For pkg-config to find tcl-tk you may need to set:
export PKG_CONFIG_PATH="/usr/local/opt/tcl-tk/lib/pkgconfig"

==> python
Python has been installed as
/usr/local/bin/python3

Unversioned symlinks python, python-config, pip etc. pointing to
python3, python3-config, pip3 etc., respectively, have been installed into
/usr/local/opt/python/libexec/bin

If you need Homebrew's Python 2.7 run
brew install python@2

You can install Python packages with
pip3 install
They will install into the site-package directory
/usr/local/lib/python3.8/site-packages

I am probably wasting iexa's and others' time in this thread as this may not be the right place to ask this question. If I am, I do apologize.

@iexa

This comment has been minimized.

Copy link
Owner Author

@iexa iexa commented Feb 25, 2020

pyenv is an entirely different beast than homebrew, it works totally different than brew on linux / mac.
googling:pyenv with tcl-tk macos
results in many problems, largely related to not finding x11 headers. But I only took a short look. Sorry I don't have time to look into this.

@itsjimbo

This comment has been minimized.

Copy link

@itsjimbo itsjimbo commented Mar 12, 2020

this worked for me - reference pyenv/pyenv#1375

brew install tcl-tk
export PATH="/usr/local/opt/tcl-tk/bin:$PATH"
export LDFLAGS="-L/usr/local/opt/tcl-tk/lib"
export CPPFLAGS="-I/usr/local/opt/tcl-tk/include"
export PKG_CONFIG_PATH="/usr/local/opt/tcl-tk/lib/pkgconfig"
vi +775  /usr/local/Cellar/pyenv/1.2.16/plugins/python-build/bin/python-build
# comment out these 2 lines 
# ${!PACKAGE_CONFIGURE:-./configure} --prefix="${!PACKAGE_PREFIX_PATH:-$PREFIX_PATH}" \
# $CONFIGURE_OPTS ${!PACKAGE_CONFIGURE_OPTS} "${!PACKAGE_CONFIGURE_OPTS_ARRAY}" || return 1
# and replace with the following two lines  

${!PACKAGE_CONFIGURE:-./configure} --prefix="${!PACKAGE_PREFIX_PATH:-$PREFIX_PATH}" \
$CONFIGURE_OPTS --with-tcltk-includes='-I/usr/local/opt/tcl-tk/include' --with-tcltk-libs='-L/usr/local/opt/tcl-tk/lib -ltcl8.6 -ltk8.6' ${!PACKAGE_CONFIGURE_OPTS} "${!PACKAGE_CONFIGURE_OPTS_ARRAY}" || return 1

pyenv install 3.8.1
pyenv global 3.8.1
@ivanoats

This comment has been minimized.

Copy link

@ivanoats ivanoats commented Mar 27, 2020

FWIW, I tried both the pyenv and the homebrew replacement and only the homebrew replacement really worked. Thank you !

@sri0sharma

This comment has been minimized.

Copy link

@sri0sharma sri0sharma commented Mar 28, 2020

@codyd51

This comment has been minimized.

Copy link

@codyd51 codyd51 commented Apr 19, 2020

This worked like a charm. Thank you!

@TonioGela

This comment has been minimized.

Copy link

@TonioGela TonioGela commented Apr 28, 2020

@iexa I'm curious, why doesn't this thing get merged in homebrew formulas?

@iexa

This comment has been minimized.

Copy link
Owner Author

@iexa iexa commented May 7, 2020

@TonioGela homebrew had it, my changes are based on their old patches. They removed support probably since python 3.7.x?

The use of tkinter with python is quite low (according to them).
It is a bit dated I have to admit (one specially strange thing is the scrollbars with canvas / textarea trickery).

And also there is pyside / pyqt / wx / kiwi ...and many others.
I like tk for its relative simplicity, ease of use and (mainly) that it is built into python - so I can use it everywhere python is installed without installing anything else. There wont be a stupidly large codebase because of this (not unlike electron or nw.js with its massive sizes).
Also for projects low-mid complexity in need of a gui - imho tk is enough.

@sergey-arkhipov

This comment has been minimized.

Copy link

@sergey-arkhipov sergey-arkhipov commented Jul 24, 2020

For clear installation homebrew python@3.8 (3.8.5) can apply path for /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/python@3.8.rb and run after that
$ brew reinstall python@3.8 --build-from-source
This way is more simpler as doesn't demand removal of python@3.8 which is required by other installed homebrew programs

-> MBA ! ~ % python3
Python 3.8.5 (default, Jul 24 2020, 21:52:41) 
[Clang 11.0.3 (clang-1103.0.32.62)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import tkinter as tk
>>> print(tk.TkVersion, tk.TclVersion)
8.6 8.6
>>> 

PATH File

--- python@3.8.rb	2020-07-24 21:59:39.000000000 +0300
+++ python@3.8.5.rb	2020-07-24 21:54:51.000000000 +0300
@@ -28,6 +28,7 @@
   depends_on "readline"
   depends_on "sqlite"
   depends_on "xz"
+  depends_on "tcl-tk"  # as apple's one is shiiiiite
 
   uses_from_macos "bzip2"
   uses_from_macos "libffi"
@@ -77,6 +78,11 @@
     end
   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.
@@ -110,7 +116,8 @@
       # 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.
-      cflags << "-I#{MacOS.sdk_path}/System/Library/Frameworks/Tk.framework/Versions/8.5/Headers"
+      # cflags << "-I#{MacOS.sdk_path}/System/Library/Frameworks/Tk.framework/Versions/8.5/Headers"
+      cflags << "-I#{MacOS.sdk_path}/usr/local/opt/tcl-tk/include"
     end
     # Avoid linking to libgcc https://mail.python.org/pipermail/python-dev/2012-February/116205.html
     args << "MACOSX_DEPLOYMENT_TARGET=#{MacOS.version}"
@@ -135,6 +142,11 @@
       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?
@@ -255,6 +267,10 @@
     library_dirs = [HOMEBREW_PREFIX/"lib", Formula["openssl@1.1"].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
@@ -339,3 +355,50 @@
     system bin/"pip3", "list", "--format=columns"
   end
 end
+__END__
+diff --git a/setup.py b/setup.py
+index 20d7f35..b9616d3 100644
+--- a/setup.py
++++ b/setup.py
+@@ -1851,8 +1851,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 (MACOS and self.detect_tkinter_darwin()):
+-            return True
+
+         # Assume we haven't found any of the libraries or include files
+         # The versions with dots are used on Unix, and the versions without
+@@ -1901,21 +1899,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 CYGWIN:
+@@ -1937,9 +1920,6 @@ class PyBuildExt(build_ext):
+         libs.append('tk'+ version)
+         libs.append('tcl'+ version)
+
+-        # Finally, link with the X11 libraries (not appropriate on cygwin)
+-        if not CYGWIN:
+-            libs.append('X11')
+
+         # XXX handle these, but how to detect?
+         # *** Uncomment and edit for PIL (TkImaging) extension only:
+
@jethro-djan

This comment has been minimized.

Copy link

@jethro-djan jethro-djan commented Aug 16, 2020

uninitialized constant Formula (NameError)

This error occurred at step 3. Thanks in advance for your help

Traceback (most recent call last): 29: from /usr/local/Homebrew/Library/Homebrew/brew.rb:23:in

'
28: from /usr/local/Homebrew/Library/Homebrew/brew.rb:23:in require_relative' 27: from /usr/local/Homebrew/Library/Homebrew/global.rb:133:in <top (required)>'
26: from /usr/local/Homebrew/Library/Homebrew/vendor/portable-ruby/2.6.3_2/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in require' 25: from /usr/local/Homebrew/Library/Homebrew/vendor/portable-ruby/2.6.3_2/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in require'
24: from /usr/local/Homebrew/Library/Homebrew/tap.rb:3:in <top (required)>' 23: from /usr/local/Homebrew/Library/Homebrew/vendor/portable-ruby/2.6.3_2/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in require'
22: from /usr/local/Homebrew/Library/Homebrew/vendor/portable-ruby/2.6.3_2/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in require' 21: from /usr/local/Homebrew/Library/Homebrew/commands.rb:3:in <top (required)>'
20: from /usr/local/Homebrew/Library/Homebrew/vendor/portable-ruby/2.6.3_2/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in require' 19: from /usr/local/Homebrew/Library/Homebrew/vendor/portable-ruby/2.6.3_2/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in require'
18: from /usr/local/Homebrew/Library/Homebrew/cask/cmd.rb:14:in <top (required)>' 17: from /usr/local/Homebrew/Library/Homebrew/vendor/portable-ruby/2.6.3_2/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in require'
16: from /usr/local/Homebrew/Library/Homebrew/vendor/portable-ruby/2.6.3_2/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in require' 15: from /usr/local/Homebrew/Library/Homebrew/cask/cmd/audit.rb:3:in <top (required)>'
14: from /usr/local/Homebrew/Library/Homebrew/vendor/portable-ruby/2.6.3_2/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in require' 13: from /usr/local/Homebrew/Library/Homebrew/vendor/portable-ruby/2.6.3_2/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in require'
12: from /usr/local/Homebrew/Library/Homebrew/cli/parser.rb:6:in <top (required)>' 11: from /usr/local/Homebrew/Library/Homebrew/vendor/portable-ruby/2.6.3_2/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in require'
10: from /usr/local/Homebrew/Library/Homebrew/vendor/portable-ruby/2.6.3_2/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in require' 9: from /usr/local/Homebrew/Library/Homebrew/formula.rb:6:in <top (required)>'
8: from /usr/local/Homebrew/Library/Homebrew/vendor/portable-ruby/2.6.3_2/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in require' 7: from /usr/local/Homebrew/Library/Homebrew/vendor/portable-ruby/2.6.3_2/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in require'
6: from /usr/local/Homebrew/Library/Homebrew/formula_pin.rb:3:in <top (required)>' 5: from /usr/local/Homebrew/Library/Homebrew/vendor/portable-ruby/2.6.3_2/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in require'
4: from /usr/local/Homebrew/Library/Homebrew/vendor/portable-ruby/2.6.3_2/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in require' 3: from /usr/local/Homebrew/Library/Homebrew/keg.rb:4:in <top (required)>'
2: from /usr/local/Homebrew/Library/Homebrew/vendor/portable-ruby/2.6.3_2/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in require' 1: from /usr/local/Homebrew/Library/Homebrew/vendor/portable-ruby/2.6.3_2/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in require'
/usr/local/Homebrew/Library/Homebrew/language/python.rb:1:in <top (required)>': uninitialized constant Formula (NameError)

@sri0sharma

This comment has been minimized.

Copy link

@sri0sharma sri0sharma commented Sep 20, 2020

I am sorry that I could not respond to earlier. I hope you have already got it working, but if not, here are my thoughts (This is for macOS Catalina 10.15.6 using a virtual environment, pyenv. One can do the same without pyenv installation):

  1. I would do a clean install of homebrew:
    (a) To Uninstall brew:
    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall.sh)"
    (b) To install brew
    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

Then I would go through all the steps already listed:

  1. brew install pyenv
  2. brew install tcl-tk --build-from-source

I will add the following to my /.zshrc

echo 'export PATH="/usr/local/opt/tcl-tk/bin:$PATH"' >> ~/.zshrc
export LDFLAGS="-L/usr/local/opt/tcl-tk/lib"
export CPPFLAGS="-I/usr/local/opt/tcl-tk/include"
export PKG_CONFIG_PATH="/usr/local/opt/tcl-tk/lib/pkgconfig"
  1. To get tcl-tk 8.6 to work with the pyenv install of python, I would
    edit the python-build script file. It may be located in one these two locations:

~/.pyenv/plugins/python-build/bin/python-build
or:
/usr/local/Cellar/pyenv/1.2.20/plugins/python-build/bin/python-build

Once I have the script file open using TextEdit, I would search for:
$CONFIGURE_OPTS ${!PACKAGE_CONFIGURE_OPTS} "${!PACKAGE_CONFIGURE_OPTS_ARRAY}" || return 1
and replace with:
$CONFIGURE_OPTS --with-tcltk-includes='-I/usr/local/opt/tcl-tk/include' --with-tcltk-libs='-L/usr/local/opt/tcl-tk/lib -ltcl8.6 -ltk8.6' ${!PACKAGE_CONFIGURE_OPTS} "${!PACKAGE_CONFIGURE_OPTS_ARRAY}" || return 1

I have read a feedback from Thomas Opplet that it did not work him, so he added it to /.zshrc. He did not say if that worked for him.

  1. pyenv install 3.8.5
  2. pyenv global 3.8.5 (I did not do it this time around)
  3. pyenv version
    Refreshed the current terminal and checked

python -V
Python 3.8.5

  1. pip install --upgrade pip
    When running it now, it shows "trackback" issues>. I did dome research on this and found out that the problem is with pip. In my case, I went ahead with next steps and it worked fine for me.

  2. python -m tkinter -c 'tkinter._test()'
    I did get "deprecated" warning, as commented by Ivan Stock, but it did not affect the installation.
    Tk window pops up. I hit β€˜Quit’ to back to Terminal.

  3. idle3
    Python 3.8.5 Shell window pops up.
    When I used "idle", I got "deprecated" warning. Everything was fine when using "idle3" .

@mlazovjp

This comment has been minimized.

Copy link

@mlazovjp mlazovjp commented Sep 21, 2020

I have been struggling with using Nuitka to compile a very small Python script that uses Tcl/Tk for the past 6 months but I finally got it working a minute ago!!!

Using this Homebrew code, I was able to install Python 3.8+Tcl/Tk (thank you!). I was able to run the .py file on my MacBook Pro running macOS, but when I tried to create a standalone distribution using Nuitka it would begin processing and eventually bomb, complaining "Could not find Tcl. Aborting standalone generation."

Two things I did differently this time around. I don't know yet if the first one makes any difference, but the second one definitely did.

1.) I had been trying to use a Python virtual environment in VS Code. I had seen a few references to the fact that penv might not behave properly, so I changed the interpreter in VS Code to use the Homebrew one located at /usr/local/bin/python3

2.) When I Googled "Could not find Tcl.", of all places I found a reference to a bug in OpenSUSE when compiling something using Nuitka. That bug report page is at openSUSE tk error #490 . Their fix was to run the following:

export TCL_LIBRARY=%{_libdir}/tcl/tcl8.6
export TK_LIBRARY=%{_libdir}/tcl/tk8.6

I added the following statements to the script file I use to compile the .py file using Nuitka and it works! Hopefully this will help someone else.

export _libdir=/usr/local/Cellar/tcl-tk/8.6.10/lib
export TCL_LIBRARY=${_libdir}/tcl8.6
export TK_LIBRARY=${_libdir}/tk8.6

For reference, this is the bash script I used to compile a standalone distribution with Nuitka.

#!/bin/bash

PROJ_PATH=~/Documents/testTCL
PYTHON_DIR=/usr/local/Cellar/python/3.8.1/bin/

_libdir=/usr/local/Cellar/tcl-tk/8.6.10/lib
TCL_LIBRARY=${_libdir}/tcl8.6
TK_LIBRARY=${_libdir}/tk8.6

COMPILE_CMD="$PYTHON_DIR/python3 -m nuitka --standalone --clang --plugin-enable=tk-inter --show-progress \
  --windows-icon="$PROJ_PATH/misc/UDLogo.ico" --output-dir="$PROJ_PATH/Nuitka_TestmacOS_dist" \
  --assume-yes-for-downloads Nuitka_Test.py"

$COMPILE_CMD
@iexa

This comment has been minimized.

Copy link
Owner Author

@iexa iexa commented Nov 5, 2020

@sergey-arkhipov Thanks for your input, your method is in fact faster - if you've already did this install once at least (xcode, brew no autoupdate, etc.).

@rd0fun

This comment has been minimized.

Copy link

@rd0fun rd0fun commented Nov 5, 2020

Been struggling for some time now, step 3 just doesn't seem to work

HOMEBREW_NO_AUTO_UPDATE=1 brew install --build-from-source python@3.8
==> Searching for similarly named formulae...
This similarly named formula was found:
python@3.8
To install it, run:
  brew install python@3.8
Error: No available formula or cask with the name "python@3.8".
==> Searching taps on GitHub...
Error: No formulae found in taps.

brew doctor shows the following

Warning: You have uncommitted modifications to Homebrew/homebrew-core.
If this is a surprise to you, then you should stash these modifications.
Stashing returns Homebrew to a pristine state but can be undone
should you later need to do so for some reason.
  cd /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core && git stash && git clean -d -f

Uncommitted files:
   M Formula/python@3.8.rb
@sergey-arkhipov

This comment has been minimized.

Copy link

@sergey-arkhipov sergey-arkhipov commented Nov 5, 2020

@sergey-arkhipov Thanks for your input, your method is in fact faster - if you've already did this install once at least (xcode, brew no autoupdate, etc.).
Yes, I checked this way. Xcode is not necessary, but Command Line tools is necessary for compilation from source codes (homebrew demands Command Line tools, so it has to be already installed).
The described sequence of actions does not demand anything more, necessary dependencies will be installed in process. During of installation (REINSTALL !!!) the brew does not replace patched file. Certainly, at the following updates of versions this procedure should be made again, making changes in path, if python@3.8.rb will be replaced.(3.8.6 for now, path for 3.8.5)

@iexa

This comment has been minimized.

Copy link
Owner Author

@iexa iexa commented Nov 5, 2020

@rd0fun if you type brew show python@3.8 what will it print? if it seems to not find a recipe, then there must be something wrong with the python@3.8.rb file. I had that first but fixed it (and fixed version is up here).

@sergey-arkhipov

This comment has been minimized.

Copy link

@sergey-arkhipov sergey-arkhipov commented Nov 5, 2020

I have just tried this path for python homebrew version 3.9.
This works as described above. I have python@3.9 and tcl-tk already installed via Homebrew
Attached the full steps.

  1. brew upgrade
  2. path python@3.9.rb
  3. brew reinstall python@3.9 --build-from-source

++++++++++++++++++++++++++++++++++++++++++++++++++++
-> MBA ! ~ % python3 -V
Python 3.9.0
-> MBA ! ~ % echo "import tkinter as tk\nprint(tk.TkVersion,tk.TclVersion)" |python3
8.5 8.5

++++++++++++++++++++++++++++++++++++++++++++++++++++

-> MBA ! % colordiff python@3.9.rb python@3.9.pathed.rb

36a37
>   depends_on "tcl-tk"  # as apple's one is shiiiiite
77d77
< 
87c87
< 
---
>   patch :DATA
121c121,122
<       cflags << "-I#{MacOS.sdk_path}/System/Library/Frameworks/Tk.framework/Versions/8.5/Headers"
---
>       #cflags << "-I#{MacOS.sdk_path}/System/Library/Frameworks/Tk.framework/Versions/8.5/Headers"
>       cflags << "-I#{MacOS.sdk_path}/usr/local/opt/tcl-tk/include"
145c146,151
< 
---
>     
>     # ADD tcl-tk include / lib paths
>     tcl_tk = Formula["tcl-tk"].opt_prefix
>     cppflags << "-I#{tcl_tk}/include"
>     ldflags  << "-L#{tcl_tk}/lib"
>     
265c271,275
< 
---
>     
>     # Again tcl-tk
>     include_dirs << Formula["tcl-tk"].opt_include
>     library_dirs << Formula["tcl-tk"].opt_lib
>     
349a360,405
> __END__
> diff --git a/setup.py b/setup.py
> index 20d7f35..b9616d3 100644
> --- a/setup.py
> +++ b/setup.py
> @@ -1851,8 +1851,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 (MACOS and self.detect_tkinter_darwin()):
> -            return True
> 
>          # Assume we haven't found any of the libraries or include files
>          # The versions with dots are used on Unix, and the versions without
> @@ -1901,21 +1899,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 CYGWIN:
> @@ -1937,9 +1920,6 @@ class PyBuildExt(build_ext):
>          libs.append('tk'+ version)
>          libs.append('tcl'+ version)
> 
> -        # Finally, link with the X11 libraries (not appropriate on cygwin)
> -        if not CYGWIN:
> -            libs.append('X11')
> 
>          # XXX handle these, but how to detect?
>          # *** Uncomment and edit for PIL (TkImaging) extension only:

++++++++++++++++++++++++++++++++++++++++++++++++++++
-> MBA ! % cp python@3.9.pathed.rb /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/python@3.9.rb
overwrite /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/python@3.9.rb? (y/n [n]) y

++++++++++++++++++++++++++++++++++++++++++++++++++++
-> MBA ! ~/ownCloud/AS/Python/Patch/3.9 % brew reinstall python@3.9 --build-from-source
==> Downloading https://files.pythonhosted.org/packages/a7/e0/30642b9c2df516506d40b563b0cbd080c49c6b3f11a70b4c7a670f13a78b/setuptools-50.3.2.zip
Already downloaded: /Users/as/Library/Caches/Homebrew/downloads/6c4cd84935cccfee61e433509bdda7951ea6b77ae5db203b1e708eea72d93603--setuptools-50.3.2.zip
==> Downloading https://files.pythonhosted.org/packages/0b/f5/be8e741434a4bf4ce5dbc235aa28ed0666178ea8986ddc10d035023744e6/pip-20.2.4.tar.gz
Already downloaded: /Users/as/Library/Caches/Homebrew/downloads/8420c2f6f4c2831dfbd1b0e1caa05c0c044729c31b52f8884a785a56038ad0e7--pip-20.2.4.tar.gz
==> Downloading https://files.pythonhosted.org/packages/83/72/611c121b6bd15479cb62f1a425b2e3372e121b324228df28e64cc28b01c2/wheel-0.35.1.tar.gz
Already downloaded: /Users/as/Library/Caches/Homebrew/downloads/1aa1a9563d6af09f2712c180679dfd512aac6c710fc3fb573175e88eaa7c6de3--wheel-0.35.1.tar.gz
==> Downloading https://www.python.org/ftp/python/3.9.0/Python-3.9.0.tar.xz
Already downloaded: /Users/as/Library/Caches/Homebrew/downloads/d37370983bfa2dfe731256050c2097e61210550756783e4623a6eb9a8812b210--Python-3.9.0.tar.xz
==> Reinstalling python@3.9
==> Patching
==> ./configure --prefix=/usr/local/Cellar/python@3.9/3.9.0_1 --enable-ipv6 --datarootdir=/usr/local/Cellar/python@3.9/3.9.0_1/share --datadir=/usr/local/Cellar
==> make
==> make install PYTHONAPPSDIR=/usr/local/Cellar/python@3.9/3.9.0_1
==> make frameworkinstallextras PYTHONAPPSDIR=/usr/local/Cellar/python@3.9/3.9.0_1/share/python@3.9
Unlinking /usr/local/Cellar/python@3.8/3.8.6_1... 9 symlinks removed
==> /usr/local/Cellar/python@3.9/3.9.0_1/bin/python3 -s setup.py --no-user-cfg install --force --verbose --install-scripts=/usr/local/Cellar/python@3.9/3.9.0_1/
==> /usr/local/Cellar/python@3.9/3.9.0_1/bin/python3 -s setup.py --no-user-cfg install --force --verbose --install-scripts=/usr/local/Cellar/python@3.9/3.9.0_1/
==> /usr/local/Cellar/python@3.9/3.9.0_1/bin/python3 -s setup.py --no-user-cfg install --force --verbose --install-scripts=/usr/local/Cellar/python@3.9/3.9.0_1/
==> Caveats
Python has been installed as
/usr/local/bin/python3

Unversioned symlinks python, python-config, pip etc. pointing to
python3, python3-config, pip3 etc., respectively, have been installed into
/usr/local/opt/python@3.9/libexec/bin

You can install Python packages with
pip3 install
They will install into the site-package directory
/usr/local/lib/python3.9/site-packages

See: https://docs.brew.sh/Homebrew-and-Python
==> Summary
🍺 /usr/local/Cellar/python@3.9/3.9.0_1: 9,224 files, 136.2MB, built in 3 minutes 28 seconds
++++++++++++++++++++++++++++++++++++++++++++++++++++

-> MBA ! % echo "import tkinter as tk\nprint(tk.TkVersion,tk.TclVersion)" |python3
8.6 8.6

-> MBA ! % date
Thu Nov 5 23:12:20 MSK 2020

@rd0fun

This comment has been minimized.

Copy link

@rd0fun rd0fun commented Nov 5, 2020

Is this a problem with my version of brew?

$ brew show
Error: Unknown command: show
brew --version
Homebrew 2.5.8
Homebrew/homebrew-core (git revision a0e08; last commit 2020-11-05)
Homebrew/homebrew-cask (git revision 97d5ff; last commit 2020-11-05)
@iexa

This comment has been minimized.

Copy link
Owner Author

@iexa iexa commented Nov 6, 2020

@rd0fun sorry, I mixed it up, do brew info python@3.8 -- not show... there are so many command line tools I use (brew, node, pip, npm, yarn, etc.) i just try each option until one works with each one of them.

@iexa

This comment has been minimized.

Copy link
Owner Author

@iexa iexa commented Nov 6, 2020

@sergey-arkhipov -- good to know that python 3.9 works as well. I know there's not much change from 3.8 -> 3.9 (like before the walrus operator for instance and f-string speedups) - some speedups for sure. Once it hits 3.9.2 or so I will update.

Do you have any problems with any pip packages on 3.9? I mean packages that have native parts and not just pure python.

@sergey-arkhipov

This comment has been minimized.

Copy link

@sergey-arkhipov sergey-arkhipov commented Nov 6, 2020

Do you have any problems with any pip packages on 3.9? I mean packages that have native parts and not just pure python.

I haven't faced yet any problems just now :-)

+++++++++++++++++++++++++++++++++++

-> MBA ! ~ % pip3 -V
pip 20.2.4 from /usr/local/lib/python3.9/site-packages/pip (python 3.9)
-> MBA ! ~ % pip3 list outdated
Package    Version
---------- -------
pip        20.2.4
setuptools 50.3.2
wheel      0.35.1
-> MBA ! ~ % pip3 list --outdated 
-> MBA ! ~ % pip3 install numpy
Collecting numpy
  Downloading numpy-1.19.4-cp39-cp39-macosx_10_9_x86_64.whl (15.4 MB)
     |β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 15.4 MB 12.8 MB/s 
Installing collected packages: numpy
Successfully installed numpy-1.19.4
 -> MBA ! ~ % echo "import numpy as np\na = np.arange(15).reshape(3, 5)\nprint(a)\nprint(a.ndim)" |python3
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]]
2
-> MBA ! ~ % 

+++++++++++++++++++++++++++++++++++

@iexa

This comment has been minimized.

Copy link
Owner Author

@iexa iexa commented Nov 6, 2020

Ok, good to know it's fine. I like your piping of a small python code string into the python interpreter. It got me for a bit until I saw the |.

@a4840639

This comment has been minimized.

Copy link

@a4840639 a4840639 commented Nov 18, 2020

Apparently you now need to rename the classname from Python to PythonAT38
Took me a while to figure this out

@sergey-arkhipov

This comment has been minimized.

Copy link

@sergey-arkhipov sergey-arkhipov commented Nov 23, 2020

I can confirm that it works at Mac OS Big Sur. I used the same patch and steps, described above.

ο£Ώ-> mba ! ~ % sw_vers          
ProductName:	macOS
ProductVersion:	11.0.1
BuildVersion:	20B29
ο£Ώ-> mba ! ~ % python3 -V
Python 3.9.0
ο£Ώ-> mba ! ~ % echo "import tkinter as tk\nprint(tk.TkVersion,tk.TclVersion)" |python3
8.6 8.6
ο£Ώ-> mba ! ~ % date
Tue Nov 24 01:37:38 MSK 2020
ο£Ώ-> mba ! ~ % 

@sergey-arkhipov

This comment has been minimized.

Copy link

@sergey-arkhipov sergey-arkhipov commented Nov 23, 2020

ο£Ώ-> mba ! ~ % colordiff -Naur python@3.9.rb python@3.9.pathed.rb
--- python@3.9.rb	2020-11-24 01:04:58.000000000 +0300
+++ python@3.9.pathed.rb	2020-11-24 01:45:40.000000000 +0300
@@ -34,6 +34,7 @@
   depends_on "readline"
   depends_on "sqlite"
   depends_on "xz"
+  depends_on "tcl-tk"  # as apple's one is shiiiiite
 
   uses_from_macos "bzip2"
   uses_from_macos "libffi"
@@ -85,6 +86,7 @@
     end
   end
 
+  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.
@@ -118,7 +120,8 @@
       # 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.
-      cflags << "-I#{MacOS.sdk_path}/System/Library/Frameworks/Tk.framework/Versions/8.5/Headers"
+      #cflags << "-I#{MacOS.sdk_path}/System/Library/Frameworks/Tk.framework/Versions/8.5/Headers"
+      cflags << "-I#{MacOS.sdk_path}/usr/local/opt/tcl-tk/include"
     end
     # Avoid linking to libgcc https://mail.python.org/pipermail/python-dev/2012-February/116205.html
     args << "MACOSX_DEPLOYMENT_TARGET=#{MacOS.version}"
@@ -142,7 +145,12 @@
       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?
@@ -262,7 +270,11 @@
                     Formula["sqlite"].opt_include]
     library_dirs = [HOMEBREW_PREFIX/"lib", Formula["openssl@1.1"].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
@@ -347,3 +359,49 @@
     system bin/"pip3", "list", "--format=columns"
   end
 end
+__END__
+diff --git a/setup.py b/setup.py
+index 20d7f35..b9616d3 100644
+--- a/setup.py
++++ b/setup.py
+@@ -1851,8 +1851,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 (MACOS and self.detect_tkinter_darwin()):
+-            return True
+
+         # Assume we haven't found any of the libraries or include files
+         # The versions with dots are used on Unix, and the versions without
+@@ -1901,21 +1899,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 CYGWIN:
+@@ -1937,9 +1920,6 @@ class PyBuildExt(build_ext):
+         libs.append('tk'+ version)
+         libs.append('tcl'+ version)
+
+-        # Finally, link with the X11 libraries (not appropriate on cygwin)
+-        if not CYGWIN:
+-            libs.append('X11')
+
+         # XXX handle these, but how to detect?
+         # *** Uncomment and edit for PIL (TkImaging) extension only:
@iexa

This comment has been minimized.

Copy link
Owner Author

@iexa iexa commented Nov 27, 2020

@sergey-arkhipov thanks for the info - i wont update to big sur for a good while so thanks for testing it out.

@neilyoung

This comment has been minimized.

Copy link

@neilyoung neilyoung commented Nov 27, 2020

I had to change the first line of this gist to match the first line of the existing python@3.8.rb:

class PythonAT38 < Formula

otherwise the error was Error: No available formula or cask with the name "python@3.8.rb".

I was a bit irritated about the diff statement in the .rb, but this was no problem.

Mac OS Catalina 10.15.7.

EDIT: Even though tk sources have been downloaded, this gist didn't bring me TK support

EDIT_2: Got it working now

@iexa

This comment has been minimized.

Copy link
Owner Author

@iexa iexa commented Dec 1, 2020

The homebrew package changed it. I'll update to 3.9 once 3.9.1 or 3.9.2 is out. Then this change won't be necessary.

@jimmybrancaccio

This comment has been minimized.

Copy link

@jimmybrancaccio jimmybrancaccio commented Dec 30, 2020

I'd love to see this get updated for 3.9.1. I had a look myself but couldn't seem to figure out the setup.py bit. ☹️

@dhinakg

This comment has been minimized.

Copy link

@dhinakg dhinakg commented Feb 19, 2021

With Homebrew/homebrew-core@e41f896, this doesn't seem to be needed anymore. Can anyone confirm?
image

@jimmybrancaccio

This comment has been minimized.

Copy link

@jimmybrancaccio jimmybrancaccio commented Feb 22, 2021

Looks like you're right @dhinakg πŸ‘ πŸŽ‰

@tomoyanonymous

This comment has been minimized.

Copy link

@tomoyanonymous tomoyanonymous commented Mar 30, 2021

Homebrew/homebrew-core@80412c2#diff-38ae209ebc6d2954d5532ae8c3e6e579dc77a7d3002bed515fa930d6ea528139

Now tkinter is newly in python-tk formula. If you fail to execute tkinter, just run brew update && brew install python-tk .

@iexa

This comment has been minimized.

Copy link
Owner Author

@iexa iexa commented Jun 24, 2021

So finally tk made its way back to brew. It's back in the official repo so I'm glad :)
https://github.com/Homebrew/homebrew-core/blob/master/Formula/python-tk@3.9.rb

https://www.youtube.com/watch?v=d-diB65scQU

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment