Quando um virtualenv que compartilha os pacotes de sites do ambiente global é usado para o aplicativo baseado em Tk usando o Tk global.
O Tkinter não pode inicializar corretamente em um virtualenv, pois falha em pesquisar corretamente seus recursos - que ainda estão no ambiente global python.
\Documents and Settings\Roger\Desktop\windows-install-bits>cd \venvtest
C:\venvtest>Scripts\activate.bat
(venvtest) C:\venvtest>python
Python 2.6.5 (r265:79096, Mar 19 2010, 21:48:26) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import Tkinter
>>> f= Tk()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'Tk' is not defined
>>> f= Tkinter.Tk()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "c:\Python26\Lib\lib-tk\Tkinter.py", line 1643, in __init__
self.tk = _tkinter.create(screenName, baseName, className, interactive, want
objects, useTk, sync, use)
_tkinter.TclError: Can't find a usable init.tcl in the following directories:
c:/Python26/lib/tcl8.5 c:/venvtest/lib/tcl8.5 c:/lib/tcl8.5 c:/venvtest/libr
ary c:/library c:/tcl8.5.2/library c:/tcl8.5.2/library
This probably means that Tcl wasn't installed properly.
>>> ^Z
(venvtest) C:\venvtest>deactivate
O que eu esperaria é que um ambiente virtual funcionasse da mesma forma que o ambiente global: -
C:\venvtest>c:\Python26\python.exe
Python 2.6.5 (r265:79096, Mar 19 2010, 21:48:26) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import Tkinter
>>> f = Tkinter.Tk()
>>> ^Z
C:\venvtest>
Após alguma experimentação, descobri que copiar os diretórios c: \ python26 \ tcl {tcl, tk} 8.5 para c: \ venvtest \ Libs resolve os problemas.
Na verdade, uma maneira melhor de corrigir isso seria definir o caminho TCL_LIBRARY em
activate.bat ou mude FixTk.py para saber sobre o virtualenv.
Original Comment By: Roger Gammans
Eu também estou apenas definindo o caminho da variável de ambiente TCL_LIBRARY em activate.bat. Então, tudo que o virtualenv precisa fazer é adicionar essa linha para activate.bat automagicamente.
Há uma discussão sobre stackoverflow neste problema:
http://stackoverflow.com/questions/15884075/tkinter-in-a-virtualenv
Também acabei de definir a variável de ambiente em activate.bat. No entanto, seria ótimo se isso fosse feito automaticamente.
Ainda é um problema no virtualenv 15.0.1.
... apenas dizendo'
Este problema foi marcado automaticamente como obsoleto porque não teve atividades recentes. Ele será fechado se nenhuma outra atividade ocorrer. Basta adicionar um comentário se quiser mantê-lo aberto. Obrigado por suas contribuições.
Parece que ainda é um problema
Este problema foi marcado automaticamente como obsoleto porque não teve atividades recentes. Ele será fechado se nenhuma outra atividade ocorrer. Basta adicionar um comentário se quiser mantê-lo aberto. Obrigado por suas contribuições.
Isso ainda é um problema. Eu achei mais recentemente no Mac - a correção para https://github.com/pypa/virtualenv/issues/93 não resolveu o problema no Mac.
Alguém precisa reativar este problema. Só porque ficou parado sem puxar, não significa que não seja mais um problema. Significa apenas que os mantenedores do projeto não o priorizaram como deveriam.
No Windows, ainda é um problema com o Python 2.7, mas parece resolvido no Python 3.8 com o módulo venv
.
Fique à vontade para registrar um novo problema, com a mensagem de erro, instruções de reprodução e informações sobre como você instalou o Python.
Significa apenas que os mantenedores do projeto não o priorizaram como deveriam.
Considerando que os mantenedores do projeto não são pagos, e fazem isso de graça em seu tempo pessoal, não acredito que você possa falar sobre they should
. Se esse problema for um problema para você, considere preencher um PR com uma correção. Todo o código é de código aberto e está disponível gratuitamente para você.
Comentários muito úteis
Ainda é um problema no virtualenv 15.0.1.
... apenas dizendo'