题目好长。。。
在MacOSX下编译安装pyqt耗费了将近我一周时间,cpu都要冒烟了,今天终于完美解决,现做一记录。
1。安装python
mac下自带的python版本太低,python2.6.5应用广泛我决定安装这个版本。起先我为了图省事直接下载了dmg安装,结果会影响到pyinstaller打包,害我瞎折腾几天,终于在自己编译安装后问题解决。
首先下载源代码压缩包http://www.python.org/download/releases/2.6.5/
解压;tar zxvf ~/Desktop/Python-2.6.5.tgz.tar
进入目录:cd Python-2.6.5
sudo ./configure –with-universal-archs=intel –enable-universalsdk=/Developer/SDKs/MacOSX10.6.sdk –enable-framework
编译:make (此步骤花费很多时间)
安装:sudo make frameworkinstall
2。编译安装pyqt
(1)安装xcode和Qt
xcode去苹果官方网站下载就行了,安装很简单。
Qt去Qt.nokia.com下载,记得要下载qt-mac-cocoa-opensource-4.x.x.dmg。
(2)下载源码包:PyQt-mac-gpl-4.7.4.tar.gz和sip-4.10.5.tar.gz
然后分别编译安装sip和pyqt
对于sip:python ./configure.py –arch=i386 –arch=x86_64
make
sudo make install
对于pyqt:python ./configure.py –use-arch=i386 –use-arch=x86_64 -q /usr/bin/qmake
make (漫长得等待,至少一个小时)
sudo make install
3。用pyinstaller打包基于pyqt的程序
(1)下载pyinstaller
svn co http://svn.pyinstaller.org/trunk ~/PyInstaller
(2)设置pyinstaller
cd source/linux
python Make.py
make
cd ..
python Configure.py
(3)对程序源码稍作修改
打开主程序,在form.show()前面一行加上form.raise_()
(4)生成spec文件
python Makespec.py -F ~/desktop/googletranslate/googletranslate.py
说明:我是在pyinstaller目录下执行的此命令,程序在桌面的googletranslate目录下。
需要手工在生成的spec文件最后添加
import sys
if sys.platform.startswith(“darwin”):
app = BUNDLE(exe,
name=os.path.join(‘dist’, ‘My.app’),
version=1)
(5)打包
python build.py googletranslate/googletranslate.spec
稍等几分种程序就生成了,位置在pyinstaller目录下得dist文件中,尝试运行不成功。。
(6)善后
通过前面的步骤程序还无法运行,需要梢加处理。。。
(a)在程序图标上右键,选“显示包内容”,打开Contents/Info.plist,取消选择“Application is background only”然后保存退出。
(b)将/Library/FrameworKs/QtGui.framework/Versions/4/Resources/qt_menu.nib文件复制到程序的/Contents/Resources
(c)如果自己有好看的图标也可以定制

完了,累死我了。。。
辛苦几天的结果,来个合影

随机感言:朋友间最凶猛的瘟疫是献媚 慷慨才识友谊的精华
Tagged with:  

郑钱花

On 2010年07月22日, in 未分类, by lushuchao

随机感言:无论发生什么事情,都要首先想到自己是不是做错了。如果自己没错(那是不可能的),那么就站在对方的角度,体验一下对方的感觉。
 

终于没能抵住诱惑,装了黑苹果。。。

On 2010年07月17日, in 未分类, by lushuchao

努力了一天一夜,终于成功了,改天有空写点东西记录下安装过程,越来越懒了。。。

随机感言:看不在的是不是就等于不存在? 也许只是被浓云遮住 也许刚巧风沙飞入眼帘 我看不见你却依然感觉到温暖 生命中不断地有人离开或进入 于是 看见的 看不见了 记住的 遗忘了 生命中不断地有人得到和失落 于是看不见的 看见了 遗忘了 记住了 然而 看不见的 是不是就等于不存在? 记住的 是不是永远不会消失?
 

关于游戏

On 2010年07月1日, in 未分类, by lushuchao

随机感言:朋友落难的时候主动伸手去拉一把 自己倒运的时候 尽量不要去麻烦朋友 这是交友之道 也是为人之道
 

小胖妞

On 2010年06月23日, in 未分类, by lushuchao

随机感言:你放它走如果它回來了 它永遠都是你的 如果它再也沒回來 它從來就不是你的
 

ubuntu下更换显卡,重装驱动

On 2010年06月23日, in ubuntu学习笔记, by lushuchao

今天终于受不了我那块8400的噪音了,拆下来清理了还是不行,看来只有换风扇了,所以临时只能用我的集成显卡 intel gma950。也许是人品好,接上gma950后居然没碰到网上说的无法启动桌面的问题,不但顺利启动了x,还能依旧保持1440*900的分辨率,看来人品不是一般的好,不过有点东西不爽,就是启动的时候会提示‘驱动错误,只能以低分辨率运行’,虽然只用一晚上的集成显卡,我还是觉得很不爽。于是放狗搜了下找到如下解决方案。

1。卸载原来的nvidia显卡驱动。

2。安装最新intel显卡驱动。

sudo apt-add-repository ppa:ubuntu-x-swat/x-retro
sudo apt-get update
sudo apt-get upgrade
执行完后会自动安装好驱动。
3。sudo dpkg-reconfigure xserver-xorg
刚开始运行完这个命令后发现没任何反映,后来才知道它会在“/”根目录生成xorg.conf.new文件
将它重命名后拷贝到 /etc/X11/ 下,覆盖xorg.conf文件后重新启动电脑就成了。
发现gma950集成显卡性能还不错,开3D桌面一点不卡,还能流畅运行assaultcube。 :chongbai
随机感言:无论发生什么事情,都要首先想到自己是不是做错了。如果自己没错(那是不可能的),那么就站在对方的角度,体验一下对方的感觉。
 

On 2010年06月19日, in 未分类, by lushuchao

随机感言:乐观的人看见问题后面的机会,悲观的人只看见机会后面的问题,机会是从来不会主动敲响你的门,无论你等待多少年。它也只会如一阵风一样拂面而过,需要你的反应能力和追随速度。朝着一个目标前进,尽量使用你的潜能,才华横溢的你会发现机会的存在。风虽然没有颜色,可是拂过之后却是绿意一片。
 

为pyqt程序添加多语言支持

On 2010年06月15日, in Python学习笔记, by lushuchao

首先将程序中所有字符串放到self.tr()中,例如self.tr(“Files”)

完成这步后用pylupdate4命令生成ts文件

例如:pylupdate4 GoogleTranslate.py -ts GoogleTranslate_zh_CN.ts

生存ts文件后,用Qt Linguist(Qt语言家)打开ts文件,并将所有字符串翻译成目标语言

翻译好后需要用到lrelease命令生成qm文件

例如:lrelease GoogleTranslate_zh_CN.ts

运行这个命令后会生成GoogleTranslate_zh_CN.qm文件,这个文件就是我们需要的语言文件。

最后在程序的main函数中加入如下语句

    locale = QLocale.system().name()
    appTranslator = QTranslator()
    if appTranslator.load("GoogleTranslate_" + locale):
        app.installTranslator(appTranslator)

中文winxp下运行的效果:

ubuntu10.04 英文locale 下运行效果:

随机感言:后悔是一种耗费精神的情绪,后悔是比损失更大的损失,比错误更大的错误,所以不要后悔。
 

Normally, pressing the TAB key changes focus among widgets. However, I would like to use the TAB key for other purposes (e.g. tab completion). To gain control of the TAB key press event, I need to subclass my widget and reimplement the QObject.event() event handler. I don’t need to re-write the entire event handler. I only need to process TAB key press events. I will pass all other events to the default event handler. The example below subclasses the QLineEdit widget and reimplements the event() method. Pressing the TAB key inside this new widget prints out the text “tab pressed” inside a second QLineEdit box.

The Events and Event Filters Trolltech QT documentation has a good explanation of how this works. My example shows how to use Python and PyQt instead of C++.

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import * 

####################################################################
def main():
    app = QApplication(sys.argv)
    w = MyWindow()
    w.show()
    sys.exit(app.exec_()) 

####################################################################
class MyWindow(QWidget):
    def __init__(self, *args):
        QWidget.__init__(self, *args)

        # create objects
        self.la = QLabel("Press tab in this box:")
        self.le = MyLineEdit()
        self.la2 = QLabel("\nLook here:")
        self.le2 = QLineEdit()

        # layout
        layout = QVBoxLayout()
        layout.addWidget(self.la)
        layout.addWidget(self.le)
        layout.addWidget(self.la2)
        layout.addWidget(self.le2)
        self.setLayout(layout)

        # connections
        self.connect(self.le, SIGNAL("tabPressed"),
                     self.update)

    def update(self):
        newtext = str(self.le2.text()) + "tab pressed "
        self.le2.setText(newtext)

####################################################################
class MyLineEdit(QLineEdit):
    def __init__(self, *args):
        QLineEdit.__init__(self, *args)

    def event(self, event):
        if (event.type()==QEvent.KeyPress) and (event.key()==Qt.Key_Tab):
            self.emit(SIGNAL("tabPressed"))
            return True

        return QLineEdit.event(self, event)

####################################################################
if __name__ == "__main__":
    main()

via:http://www.saltycrane.com/blog/2008/01/how-to-capture-tab-key-press-event-with/

随机感言:无论发生什么事情,都要首先想到自己是不是做错了。如果自己没错(那是不可能的),那么就站在对方的角度,体验一下对方的感觉。
 

谷歌翻译客户端(更新)

On 2010年06月14日, in Python学习笔记, by lushuchao

增加了两种语言互译功能,使用上方便了一些:)
更新了按Ctrl+Return(回车)翻译的功能,及多语言支持,在英文环境下界面是英文,中文系统下是中文

#!/usr/bin/python
# -*- coding:utf-8 -*-
# Filename:GoogleTranslate.py

###############################
#  author:lushuchao
#  Thu May 24 2010
###############################

#Update Tue May 25 2010
#add new function press 'Ctrl+Enter' to translate

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import json
import urllib
import urllib2
#from PyQt4 import QtGui,QtCore

class MainWindow(QMainWindow):
    def __init__(self,parent=None):
        super(MainWindow,self).__init__(parent)
        #上部
        self.lab1=QLabel(self.tr('First Language:'))
        self.Txtyuyan1=MyQTextEdit()
        self.lab2=QLabel(self.tr('Second Language:'))
        self.Txtyuyan2=MyQTextEdit()
        toplayout=QVBoxLayout()
        toplayout.addWidget(self.lab1)
        toplayout.addWidget(self.Txtyuyan1)
        toplayout.addWidget(self.lab2)
        toplayout.addWidget(self.Txtyuyan2)
        #中部
        self.lab3=QLabel(self.tr('Selected Firest Language:'))
        self.yuyan1=QComboBox()
        self.lab4=QLabel(self.tr('Selected Second Language:'))
        self.yuyan2=QComboBox()
        midlayout=QHBoxLayout()
        midlayout.addWidget(self.lab3)
        midlayout.addWidget(self.yuyan1)
        midlayout.addWidget(self.lab4)
        midlayout.addWidget(self.yuyan2)
        lang=sorted(GTranslate.LANG.keys())
        self.yuyan1.addItems(lang)
        self.yuyan1.setCurrentIndex(lang.index('ENGLISH'))
        self.yuyan2.addItems(lang)
        self.yuyan2.setCurrentIndex(lang.index('CHINESE'))
        #下部
        self.yuyan1TOyuyan2=QPushButton(self.tr('First Language ->Second Language'))
        self.yuyan2TOyuyan1=QPushButton(self.tr('Second Language ->First Language'))
        self.chongzhi=QPushButton(self.tr('Reset'))
        self.guanyuQt=QPushButton(self.tr('AboutQt'))
        self.guanyu=QPushButton(self.tr('About'))
        botlayout=QHBoxLayout()
        botlayout.addWidget(self.yuyan1TOyuyan2)
        botlayout.addWidget(self.yuyan2TOyuyan1)
        botlayout.addWidget(self.chongzhi)
        botlayout.addWidget(self.guanyuQt)
        botlayout.addWidget(self.guanyu)
        #整体布局
        mainlayout=QVBoxLayout()
        mainlayout.addLayout(toplayout)
        mainlayout.addLayout(midlayout)
        mainlayout.addLayout(botlayout)
        self.gbox=QGroupBox('')
        self.gbox.setLayout(mainlayout)
        self.setCentralWidget(self.gbox)
        self.Txtyuyan1.setFocus()
        #connections
        self.connect(self.yuyan1TOyuyan2,SIGNAL("clicked()"),self.translate1to2)
        self.connect(self.yuyan2TOyuyan1,SIGNAL("clicked()"),self.translate2to1)
        self.connect(self.chongzhi,SIGNAL("clicked()"),self.reset)
        self.connect(self.guanyuQt,SIGNAL("clicked()"),self.aboutQt)
        self.connect(self.guanyu,SIGNAL("clicked()"),self.showAbout)
        self.connect(self.yuyan1,SIGNAL("currentIndexChanged(int)"),self.setlabtxt)
        self.connect(self.yuyan2,SIGNAL("currentIndexChanged(int)"),self.setlabtxt)
        self.connect(self.Txtyuyan1, SIGNAL("ReturnPressed"),self.translate1to2)
        self.connect(self.Txtyuyan2, SIGNAL("ReturnPressed"),self.translate2to1)
        #初始化
        self.resize(500,300)
        self.center()
        self.setWindowTitle(self.tr('Google Translate Client v1.0'))
        self.setlabtxt()
        self.chongzhi.setEnabled(False)

    def setlabtxt(self):
        f=self.tr('First Language:')
        s=self.tr('Second Language:')
        self.lab1.setText(f+self.yuyan1.currentText())
        self.lab2.setText(s+self.yuyan2.currentText())

    def center(self):
        screen = QDesktopWidget().screenGeometry()
        size =  self.geometry()
        self.move((screen.width()-size.width())/2,
            (screen.height()-size.height())/2) 

#    def keyPressEvent(self, event):
#        key = event.key()
#        if key ==Qt.Key_Return:
#            self.translate()
#            return

    def translate1to2(self):
        text=self.Txtyuyan1.toPlainText()
        text=unicode(text).encode('utf-8')
        key=str(self.yuyan1.currentText())
        langOrigin=GTranslate.LANG[key]
        key=str(self.yuyan2.currentText())
        langTarget=GTranslate.LANG[key]
        self.gt=GTranslate(langOrigin, langTarget, text)
        self.connect(self.gt, SIGNAL("finished()"), self.showResult1to2)

        self.gt.start()
        self.updateUi(False)

    def translate2to1(self):
        text=self.Txtyuyan2.toPlainText()
        text=unicode(text).encode('utf-8')
        key=str(self.yuyan2.currentText())
        langOrigin=GTranslate.LANG[key]
        key=str(self.yuyan1.currentText())
        langTarget=GTranslate.LANG[key]
        self.gt=GTranslate(langOrigin, langTarget, text)
        self.connect(self.gt, SIGNAL("finished()"), self.showResult2to1)

        self.gt.start()
        self.updateUi(False)

    def showResult1to2(self):
        result=self.gt.result
        if(result):
            self.Txtyuyan2.setText(result)
        self.updateUi(True)

    def showResult2to1(self):
        result=self.gt.result
        if(result):
            self.Txtyuyan1.setText(result)
        self.updateUi(True)
    def updateUi(self, enable):
        self.yuyan1TOyuyan2.setEnabled(enable)
        self.yuyan2TOyuyan1.setEnabled(enable)
        self.chongzhi.setEnabled(not enable)

    def reset(self):
        self.gt.terminate()
        self.Txtyuyan1.clear()
        self.Txtyuyan2.clear()
        self.updateUi(True)

    def aboutQt(self):
        self.ab=QMessageBox.aboutQt(self,self.tr('About QT'))

    def showAbout(self):
        dialog = about(self)
        dialog.exec_()

class about(QDialog):
    def __init__(self, parent=None):
        super(about, self).__init__(parent)
        self.setWindowTitle(self.tr('About'))
class MyQTextEdit(QTextEdit):
    def __init__(self, *args):
        QTextEdit.__init__(self, *args)

    def event(self, event):
        if (event.type()==QEvent.KeyPress) and (event.key()==Qt.Key_Return):
                if event.modifiers() & Qt.ControlModifier:
                    self.key = "Ctrl+Return"
                    self.emit(SIGNAL("ReturnPressed"))
                    return True

        return QTextEdit.event(self, event)

class GTranslate(QThread):

    def __init__(self, langOrigin='en', langTarget='zh', text=None, parent=None):
        QThread.__init__(self, parent)

        self.text=text
        self.langOrigin=langOrigin
        self.langTarget=langTarget
        self.result=None

    def translate(self):
        query = (GTranslate.URL % (urllib.quote(self.text), self.langOrigin, self.langTarget))
        req = urllib2.Request(query)
#        req.add_header("Referer", "http://www.my-ajax-site.com")
        try:
            r = urllib2.urlopen(req)
            data = r.read()
        except:
            self.result='Network Connect Error!'
            return

        obj = json.loads(data)
        if obj['responseStatus'] != 200L:
            self.result="Error: %s" % obj['responseDetails']
        else:
            self.result=obj['responseData']['translatedText']

    def run(self):
        self.translate()

    URL = "http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=%s&langpair=%s%%7C%s"
    LANG={
       'AFRIKAANS' : 'af',
  'ALBANIAN' : 'sq',
  'AMHARIC' : 'am',
  'ARABIC' : 'ar',
  'ARMENIAN' : 'hy',
  'AZERBAIJANI' : 'az',
  'BASQUE' : 'eu',
  'BELARUSIAN' : 'be',
  'BENGALI' : 'bn',
  'BIHARI' : 'bh',
  'BULGARIAN' : 'bg',
  'BURMESE' : 'my',
  'CATALAN' : 'ca',
  'CHEROKEE' : 'chr',
  'CHINESE' : 'zh',
  'CHINESE_SIMPLIFIED' : 'zh-CN',
  'CHINESE_TRADITIONAL' : 'zh-TW',
  'CROATIAN' : 'hr',
  'CZECH' : 'cs',
  'DANISH' : 'da',
  'DHIVEHI' : 'dv',
  'DUTCH': 'nl',
  'ENGLISH' : 'en',
  'ESPERANTO' : 'eo',
  'ESTONIAN' : 'et',
  'FILIPINO' : 'tl',
  'FINNISH' : 'fi',
  'FRENCH' : 'fr',
  'GALICIAN' : 'gl',
  'GEORGIAN' : 'ka',
  'GERMAN' : 'de',
  'GREEK' : 'el',
  'GUARANI' : 'gn',
  'GUJARATI' : 'gu',
  'HEBREW' : 'iw',
  'HINDI' : 'hi',
  'HUNGARIAN' : 'hu',
  'ICELANDIC' : 'is',
  'INDONESIAN' : 'id',
  'INUKTITUT' : 'iu',
  'ITALIAN' : 'it',
  'JAPANESE' : 'ja',
  'KANNADA' : 'kn',
  'KAZAKH' : 'kk',
  'KHMER' : 'km',
  'KOREAN' : 'ko',
  'KURDISH': 'ku',
  'KYRGYZ': 'ky',
  'LAOTHIAN': 'lo',
  'LATVIAN' : 'lv',
  'LITHUANIAN' : 'lt',
  'MACEDONIAN' : 'mk',
  'MALAY' : 'ms',
  'MALAYALAM' : 'ml',
  'MALTESE' : 'mt',
  'MARATHI' : 'mr',
  'MONGOLIAN' : 'mn',
  'NEPALI' : 'ne',
  'NORWEGIAN' : 'no',
  'ORIYA' : 'or',
  'PASHTO' : 'ps',
  'PERSIAN' : 'fa',
  'POLISH' : 'pl',
  'PORTUGUESE' : 'pt-PT',
  'PUNJABI' : 'pa',
  'ROMANIAN' : 'ro',
  'RUSSIAN' : 'ru',
  'SANSKRIT' : 'sa',
  'SERBIAN' : 'sr',
  'SINDHI' : 'sd',
  'SINHALESE' : 'si',
  'SLOVAK' : 'sk',
  'SLOVENIAN' : 'sl',
  'SPANISH' : 'es',
  'SWAHILI' : 'sw',
  'SWEDISH' : 'sv',
  'TAJIK' : 'tg',
  'TAMIL' : 'ta',
  'TAGALOG' : 'tl',
  'TELUGU' : 'te',
  'THAI' : 'th',
  'TIBETAN' : 'bo',
  'TURKISH' : 'tr',
  'UKRAINIAN' : 'uk',
  'URDU' : 'ur',
  'UZBEK' : 'uz',
  'UIGHUR' : 'ug',
  'VIETNAMESE' : 'vi',
  'UNKNOWN' : ''
    }

def main():
    app=QApplication(sys.argv)
    locale = QLocale.system().name()
    qtTranslator = QTranslator()
    if qtTranslator.load("qt_" + locale):
        app.installTranslator(qtTranslator)
    appTranslator = QTranslator()
    if appTranslator.load("GoogleTranslate_" + locale):
        app.installTranslator(appTranslator)
    app.setOrganizationName("BlueSea Ltd.")
    app.setOrganizationDomain("Thinkman.com.cn")
    #app.setApplicationName(app.translate("MainWindow", "Google Translate Client v1.0"))
    app.setWindowIcon(QIcon("icon.png"))
    form=MainWindow()
    form.show()
    app.exec_()
if __name__=="__main__":
    main()
随机感言:朋友之间谈到钱就伤感情 情人之间 谈到感情就伤钱
 

install files download:ftp://ftp.idsoftware.com/idstuff/etqw/

then You need a retail copy of the game to install the full client.

when you running Enemy Territory Quake Wars (etqw) ,you will find the sound becomes delayed by about 30 seconds.

here is a solution:

1.

gedit ~/.pulse/client.conf

and add “autospawn = no” without quotes

2.

then the script for the game

#!/bin/bash
killall compiz
killall -9 pulseaudio
cd ~/Installed_Programs/Games/etqw
./etqw
compiz
pulseaudio

3.

restart or relogin.

enjoy the game!

http://ubuntuforums.org/showthread.php?t=1473080

随机感言:人生短短几十年,不要给自己留下了什么遗憾,想笑就笑,想哭就哭,该爱的时候就去爱,无所谓压抑自己。
Tagged with: