2011-07-21 4 views
2

Pmw(Pythonメガウィジェット)を使用しているPythonプログラムから実行可能ファイルを作成できません。私はcx_Freezeを使っています(GUIバックエンド "Gui2Exe"を通して)。 Pmwサイトを検索しています。Pmwライブラリが実行されたときにPmwライブラリがモジュールをチェックし、ライブラリがzipファイルになっているためにpy2exeや類似のプログラムを使用したときに動作しないことが原因です。詳細はこちらをご覧ください:http://pmw.sourceforge.net/doc/dynamicloader.html 簡単にフリーズすることができる1つのスタンドアロンPmwモジュールを生成するスクリプトを提供することで、 "Freezing Pmw"の下にそのページのソリューションを提供します。しかし、このスクリプトは廃止予定のコードを使用しており、Python 2.6 +では動作しません。私は幸運でそれを修正しようとしました。Python Pmwおよびcx_Freeze?

EDIT: 'regex'を 're'と置き換えるだけでは機能しません。

#!/usr/bin/env python 

# Helper script when freezing Pmw applications. It concatenates all 
# Pmw megawidget files into a single file, 'Pmw.py', in the current 
# directory. The script must be called with one argument, being the 
# path to the 'lib' directory of the required version of Pmw. 
# To freeze a Pmw application, you will also need to copy the 
# following files to the application directory before freezing: 
# 
# PmwBlt.py PmwColor.py 

import os 
import regsub 
import string 
import sys 

# The order of these files is significant. Files which reference 
# other files must appear later. Files may be deleted if they are not 
# used. 
files = [ 
    'Dialog', 'TimeFuncs', 'Balloon', 'ButtonBox', 'EntryField', 
    'Group', 'LabeledWidget', 'MainMenuBar', 'MenuBar', 'MessageBar', 
    'MessageDialog', 'NoteBook', 'OptionMenu', 'PanedWidget', 'PromptDialog', 
    'RadioSelect', 'ScrolledCanvas', 'ScrolledField', 'ScrolledFrame', 
    'ScrolledListBox', 'ScrolledText', 'HistoryText', 'SelectionDialog', 
    'TextDialog', 'TimeCounter', 'AboutDialog', 'ComboBox', 'ComboBoxDialog', 
    'Counter', 'CounterDialog', 
] 

# Set this to 0 if you do not use any of the Pmw.Color functions: 
needColor = 1 

# Set this to 0 if you do not use any of the Pmw.Blt functions: 
needBlt = 1 

def expandLinks(path): 
    if not os.path.isabs(path): 
    path = os.path.join(os.getcwd(), path) 
    while 1: 
    if not os.path.islink(path): 
     break 
    dir = os.path.dirname(path) 
    path = os.path.join(dir, os.readlink(path)) 

    return path 

def mungeFile(file): 
    # Read the file and modify it so that it can be bundled with the 
    # other Pmw files. 
    file = 'Pmw' + file + '.py' 
    text = open(os.path.join(srcdir, file)).read() 
    text = regsub.gsub('import Pmw\>', '', text) 
    text = regsub.gsub('INITOPT = Pmw.INITOPT', '', text) 
    text = regsub.gsub('\<Pmw\.', '', text) 
    text = '\n' + ('#' * 70) + '\n' + '### File: ' + file + '\n' + text 
    return text 

# Work out which version is being bundled. 
file = sys.argv[0] 
file = os.path.normpath(file) 
file = expandLinks(file) 

dir = os.path.dirname(file) 
dir = expandLinks(dir) 
dir = os.path.dirname(dir) 
dir = expandLinks(dir) 
dir = os.path.basename(dir) 

version = string.replace(dir[4:], '_', '.') 

# Code to import the Color module. 
colorCode = """ 
import PmwColor 
Color = PmwColor 
del PmwColor 
""" 

# Code to import the Blt module. 
bltCode = """ 
import PmwBlt 
Blt = PmwBlt 
del PmwBlt 
""" 

# Code used when not linking with PmwBlt.py. 
ignoreBltCode = """ 
_bltImported = 1 
_bltbusyOK = 0 
""" 

# Code to define the functions normally supplied by the dynamic loader. 
extraCode = """ 

### Loader functions: 

_VERSION = '%s' 

def setversion(version): 
    if version != _VERSION: 
     raise ValueError, 'Dynamic versioning not available' 

def setalphaversions(*alpha_versions): 
    if alpha_versions !=(): 
    raise ValueError, 'Dynamic versioning not available' 

def version(alpha = 0): 
    if alpha: 
     return() 
    else: 
     return _VERSION 

def installedversions(alpha = 0): 
    if alpha: 
     return() 
    else: 
     return (_VERSION,) 

""" 

if '-noblt' in sys.argv: 
    sys.argv.remove('-noblt') 
    needBlt = 0 

if '-nocolor' in sys.argv: 
    sys.argv.remove('-nocolor') 
    needColor = 0 

if len(sys.argv) != 2: 
    print 'usage: bundlepmw.py [-noblt] [-nocolor] /path/to/Pmw/Pmw_X_X_X/lib' 
    sys.exit() 

srcdir = sys.argv[1] 

if os.path.exists('Pmw.py'): 
    print 'Pmw.py already exists. Remove it and try again.' 
    sys.exit() 

outfile = open('Pmw.py', 'w') 

if needColor: 
    outfile.write(colorCode) 

if needBlt: 
    outfile.write(bltCode) 

outfile.write(extraCode % version) 

# Specially handle PmwBase.py file: 
text = mungeFile('Base') 
text = regsub.gsub('import PmwLogicalFont', '', text) 
text = regsub.gsub('PmwLogicalFont._font_initialise', '_font_initialise', text) 
outfile.write(text) 
if not needBlt: 
    outfile.write(ignoreBltCode) 

files.append('LogicalFont') 
for file in files: 
    text = mungeFile(file) 
    outfile.write(text) 

print '' 
print ' Pmw.py has been created.' 

if needColor or needBlt: 
    print ' Before running freeze, also copy the following file(s):' 
    if needBlt: 
    print ' ' + os.path.join(srcdir, 'PmwBlt.py') 
    if needColor: 
    print ' ' + os.path.join(srcdir, 'PmwColor.py') 

答えて

2

残念ながら、元のファイルがタブとスペースといくつかの問題を抱えている(ちょうどexpandlinkswhileインデントを見てください)。

regsub.gsubre.subに変更し、文字列型メソッドを使用してstringのインポートを削除しました。

Pmw.py has been created. 
    Before running freeze, also copy the following file(s): 
    C:\Users\joaquin\Desktop\Pmw.1.3.2\src\Pmw\Pmw_1_3\lib\PmwBlt.py 
    C:\Users\joaquin\Desktop\Pmw.1.3.2\src\Pmw\Pmw_1_3\lib\PmwColor.py 

ここでは、修正スクリプトがあります:

#!/usr/bin/env python 

# Helper script when freezing Pmw applications. It concatenates all 
# Pmw megawidget files into a single file, 'Pmw.py', in the current 
# directory. The script must be called with one argument, being the 
# path to the 'lib' directory of the required version of Pmw. 
# To freeze a Pmw application, you will also need to copy the 
# following files to the application directory before freezing: 
# 
# PmwBlt.py PmwColor.py 

import os 
import re 
import sys 

# The order of these files is significant. Files which reference 
# other files must appear later. Files may be deleted if they are not 
# used. 
files = [ 
    'Dialog', 'TimeFuncs', 'Balloon', 'ButtonBox', 'EntryField', 
    'Group', 'LabeledWidget', 'MainMenuBar', 'MenuBar', 'MessageBar', 
    'MessageDialog', 'NoteBook', 'OptionMenu', 'PanedWidget', 'PromptDialog', 
    'RadioSelect', 'ScrolledCanvas', 'ScrolledField', 'ScrolledFrame', 
    'ScrolledListBox', 'ScrolledText', 'HistoryText', 'SelectionDialog', 
    'TextDialog', 'TimeCounter', 'AboutDialog', 'ComboBox', 'ComboBoxDialog', 
    'Counter', 'CounterDialog', 
] 

# Set this to 0 if you do not use any of the Pmw.Color functions: 
needColor = 1 

# Set this to 0 if you do not use any of the Pmw.Blt functions: 
needBlt = 1 

def expandLinks(path): 
    if not os.path.isabs(path): 
     path = os.path.join(os.getcwd(), path) 
    while 1: 
     if not os.path.islink(path): 
      break 
     dir = os.path.dirname(path) 
     path = os.path.join(dir, os.readlink(path)) 

    return path 

def mungeFile(file): 
    # Read the file and modify it so that it can be bundled with the 
    # other Pmw files. 
    file = 'Pmw' + file + '.py' 
    text = open(os.path.join(srcdir, file)).read() 
    text = re.sub('import Pmw\>', '', text) 
    text = re.sub('INITOPT = Pmw.INITOPT', '', text) 
    text = re.sub('\<Pmw\.', '', text) 
    text = '\n' + ('#' * 70) + '\n' + '### File: ' + file + '\n' + text 
    return text 

# Work out which version is being bundled. 
file = sys.argv[0] 
file = os.path.normpath(file) 
file = expandLinks(file) 

dir = os.path.dirname(file) 
dir = expandLinks(dir) 
dir = os.path.dirname(dir) 
dir = expandLinks(dir) 
dir = os.path.basename(dir) 

version = dir[4:].replace('_', '.') 

# Code to import the Color module. 
colorCode = """ 
import PmwColor 
Color = PmwColor 
del PmwColor 
""" 
# Code to import the Blt module. 
bltCode = """ 
import PmwBlt 
Blt = PmwBlt 
del PmwBlt 
""" 
# Code used when not linking with PmwBlt.py. 
ignoreBltCode = """ 
_bltImported = 1 
_bltbusyOK = 0 
""" 
# Code to define the functions normally supplied by the dynamic loader. 
extraCode = """ 

### Loader functions: 

_VERSION = '%s' 

def setversion(version): 
    if version != _VERSION: 
     raise ValueError, 'Dynamic versioning not available' 

def setalphaversions(*alpha_versions): 
    if alpha_versions !=(): 
     raise ValueError, 'Dynamic versioning not available' 

def version(alpha = 0): 
    if alpha: 
     return() 
    else: 
     return _VERSION 

def installedversions(alpha = 0): 
    if alpha: 
     return() 
    else: 
     return (_VERSION,) 

""" 
if '-noblt' in sys.argv: 
    sys.argv.remove('-noblt') 
    needBlt = 0 

if '-nocolor' in sys.argv: 
    sys.argv.remove('-nocolor') 
    needColor = 0 

if len(sys.argv) != 2: 
    print 'usage: bundlepmw.py [-noblt] [-nocolor] /path/to/Pmw/Pmw_X_X_X/lib' 
    sys.exit() 

srcdir = sys.argv[1] 

if os.path.exists('Pmw.py'): 
    print 'Pmw.py already exists. Remove it and try again.' 
    sys.exit() 

outfile = open('Pmw.py', 'w') 

if needColor: 
    outfile.write(colorCode) 

if needBlt: 
    outfile.write(bltCode) 

outfile.write(extraCode % version) 

# Specially handle PmwBase.py file: 
text = mungeFile('Base') 
text = re.sub('import PmwLogicalFont', '', text) 
text = re.sub('PmwLogicalFont._font_initialise', '_font_initialise', text) 
outfile.write(text) 
if not needBlt: 
    outfile.write(ignoreBltCode) 

files.append('LogicalFont') 
for file in files: 
    text = mungeFile(file) 
    outfile.write(text) 

print '' 
print ' Pmw.py has been created.' 

if needColor or needBlt: 
    print ' Before running freeze, also copy the following file(s):' 
    if needBlt: 
     print ' ' + os.path.join(srcdir, 'PmwBlt.py') 
    if needColor: 
     print ' ' + os.path.join(srcdir, 'PmwColor.py') 
+0

グレートをスクリプトが完璧に働いた。その後

。私は今それを試してみましょう。変更を追加するには、Pmw開発者に連絡することをお勧めします。あなたが時間を持っていなければ、私はあなたのためにそれをやることができると言っているのです。 – Brock123

+0

@ Brock123、それは必要ではありません。私はサイトをチェックしたが、放棄されたようだが、寄稿者、gruberは数か月前にスクリプトを更新して[cvs sourceforge repository]に入れた(http://pmw.cvs.sourceforge.net/viewvc/pmw/Pmw/Pmw_0_0_0 /bin/bundlepmw.py?revision=1.3&view=markup) – joaquin

関連する問題