搜尋此網誌

顯示具有 Python 標籤的文章。 顯示所有文章
顯示具有 Python 標籤的文章。 顯示所有文章

2017年9月1日 星期五

PyQt5 教學 Part 5: Qt Designer 製作GUI介面

前幾章有教部分的GUI物件如何產生出來,但是在大型的程式裡物件非常的多,一個一個新增可能會很混亂,因此Qt也有提供程式專門製作物件的GUI。

在官方下載 Qt 之後預設有含 Designer程式。
本章著重在於存檔完後的.ui檔如何使用,因此不會太詳細描述每個物件。

1. 建立主視窗

一個程式會有主要的視窗作為進入點,所以記得一開始需要的是
Main Window的物件

建立視窗

2.擺放物件

將物件直接拖曳到視窗上,以先放Layout再放物件,
則可以讓物件自動去排列。
Main Window

3.物件的事件觸發

  1. 在物件盒上選擇編輯事件與信號槽
    1

  2. 在視窗上將物件的信號拖曳到Main Window,如圖
    2

  3. 選取事件種類,左邊為觸發的事件,以按鈕為例通常為clicked(),右邊則是點選編輯或是選擇要觸發的事件
    3

  4. 點選編輯時會出現下圖,需要新增的是信號槽(slot),新增完畢後即可選取slot
    4

4.如何使用存檔後的ui文件

我們會需要將ui的的格式檔案轉換成.py。
使用以下指令

python -m PyQt5.uic.pyuic [input.ui] -o [output.py]

轉換後的py檔我通常不會去編輯,而是利用編寫其他py檔去繼承自動產生的檔案。

新檔案的開頭如下

from PyQt5.QtWidgets import QMainWindow
import MainWindow


class Main(QMainWindow, MainWindow.Ui_MainWindow):
    def __init__(self):
        super(self.__class__, self).__init__()
        self.setupUi(self)

MainWindow是我將ui檔轉換成.py,
因此繼承了 QMainWindow以及 ui的window後,透過這個方式就可以專心的寫程式不需要事前寫很多的UI程式碼。

5.別忘了進入主程序

import sys
from PyQt5.QtWidgets import QApplication

......

if __name__ == "__main__":
    app = QApplication(sys.argv)
    MainWindow = Main()
    MainWindow.show()
    sys.exit(app.exec_())

6.事件也別忘了

第三步驟有自行新增信號槽(slot),因此也必須補上function,例如我信號槽的名稱是 click_button

class Main(QMainWindow, MainWindow.Ui_MainWindow):
    def __init__(self):
        super(self.__class__, self).__init__()
        self.setupUi(self)

    def click_button(self):
        # do_something

以上是Designer的教學,我自己是更常使用這種方式來製作 Qt的程式。


如果有任何疑問或指教,歡迎底下回覆,謝謝。

PyQt5 教學 Part 4: 執行緒的使用

2017年3月27日 星期一

PyQt5部署與編譯 pyqtdeploy-程式設定

此文章因為內容較長,因此拆成兩篇文章
1. 環境安裝
2. 程式設定
需要做的事情
環境安裝:
1. 安裝pyqtdeploy
2. 下載Qt、Python、sip、PyQt5的source code
3. 建立存放靜態程式碼的資料夾
4. 編譯下載的檔案(由pyqtdeploycli設定)

程式設定:
5. 開始製作 prc 檔案(由pyqtdeploy建立)
6. 製作qmake檔案
7. 最後程式的編譯
在過程中,可能會遇到非常多的錯誤,歡迎發問一起解決。

PyQt5 部署與編譯pyqtdeploy-環境安裝

此文章因為內容較長,將會拆成兩篇文章
1. 環境安裝
2. 程式設定
在這篇文章裡,要介紹的是如何讓寫好的Qt應用程式能夠讓其他人使用,
並且是在Client盡量不需要安裝其他環境的情況下。

簡單的方法可以參考 Python 使用 PyInstaller 打包程式
這個會自動抓取所有用到的動態函式庫,並且採用動態連結的方式執行。

在這篇我們要教另一個方法 pyqtdeploy
他會將Python 與 Qt的程式碼轉成C++的程式碼,採用靜態的方式編譯所有程式。好處在於除了執行速度之外,甚至可以編譯成 iOS 或 Android 的程式。

因此最重要的一點就是所有的程式都必須要有靜態的原始碼

2017年2月28日 星期二

PyQt5 教學 Part 4: 執行緒的使用

在前一章我們學習到如何觸發事件,
但是在撰寫視窗的程式時,我們常常會需要一次能夠執行很多不同的功能,
例如我們需要製作一個定期任務,每隔一秒就必須把資訊傳回到主視窗。

接著開始介紹如何使用多執行緒,
依照慣例先去教學文件裡面,尋找可以使用的資源。
Qthread的文件

2017年1月7日 星期六

PyQt5 教學 Part 3: 信號觸發

接著會介紹怎麼讓一個按鈕可以作動
首先我們先去教學文件裡面,尋找按鈕可以使用的Signal(信號)
QPushButton的文件
我們可以根據以下的文字發現總共有9個 signals 可以使用

Additional Inherited Members

4 signals inherited from QAbstractButton
3 signals inherited from QWidget
2 signals inherited from QObject

而其中點擊相關的信號都在 QAbstractButton

2016年12月12日 星期一

PyQt5 教學 Part 2: Layout排版系統

此篇是介紹物件的擺放方式,物件要擺放在視窗上面總共有兩個方式
分別是用自動排版跟設定座標的方式

這個要介紹的就是Layout自動排版

自動排版有四種排版方法
  • QHBoxLayout:水平排版
  • QVBoxLayout:垂直排版
  • QGridLayout:格線排版
  • QFormLayout:表格排版

2016年12月11日 星期日

PyQt5 教學 Part 1: 安裝與開始

最近開始嘗試接觸Qt,但是網路上中文教學還是以Qt4為主要,
在這系列的教學裡面,如果有不太清楚的地方,歡迎互相交流。
如果覺得有想補充的地方也歡迎回覆給我,畢竟我也是才剛起步而已。

另外在大部分的程式,我會採用物件導向的方式,
如果不懂的地方也歡迎回覆發問。

Python 連結RS232 序列埠

Python 可以很簡單的處理序列埠的連接
這篇網誌主頁介紹的是 PySerial這個套件

下面就開始介紹如何安裝與使用

透過pip安裝pyserial套件
$ pip install pyserial

安裝完畢之後,即可開始使用pyserial

2016年12月10日 星期六

Python 資料庫連結 MySQL

Python在連接MySQL的有各式各樣的套件,而這一個套件是我覺得比較方便的一種,
因為它不需要例外安裝 mysql-client 這類的開發環境,
這個套件的名稱叫做 PyMySQL

以下開始介紹大致的使用方式
首先安裝套件
$ pip install PyMySQL

裝完資料庫連結的套件之後,我們可以開始引用這個模組

2016年4月2日 星期六

Django 多國語系製作 i18n

通常在開發網站的時候,常常我們都會需要有多國語系的功能,
以下主要就是教學Django如何製作多國語系。
範例中,我會採用將繁體中文翻譯成英文。
這邊將會有以下幾個步驟
  1. 在設定中添加翻譯設定
  2. 編輯需要翻譯的文字
    1. Model
    2. View
    3. Template
  3. 製作語系檔(.po)
  4. 編輯翻譯文字
  5. 編譯語系檔(.mo)

1、在設定檔內新增參數

settings.py
LANGUAGES = [
('en-US', 'English'),
('zh-Hans', '简体中文'),
('zh-Hant', '繁體中文'),
...
]
LOCALE_PATHS = [os.path.join(BASE_DIR, "locale")]`  
Django2.0以下用MIDDLEWARE_CLASSES
MIDDLEWAR = ( 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.locale.LocaleMiddleware', 'django.middleware.common.CommonMiddleware', ... ) LANGUAGE_CODE = 'zh-Hant' USE_I18N = True
在預設的情況下, 只有 USE_I18N 是不需要修改的,
其他都需要修改或新增

2、編輯需要翻譯的文字

在新增翻譯文字的時候,有幾種翻譯方式
  1. ugettext_lazy
  2. ugettext
差別在於ugettext_lazy會等到實際使用者需要看到文字時才會翻譯,ugettext會在系統開始時就先翻譯完成。
models較常使用的是ugettext_lazy,view則是ugettext
以下分別示範Model、View、Template三種
models.py
from django.db import models  
from django.utils.translation import ugettext_lazy as _  

class Profile(models.Model):  
    name = models.CharField(_("name"), max_length=255)  
    phone = models.CharField(_("phone"), max_length=6, null=True, blank=True)
views.py
from django.shortcuts import render
from django.utils.translation import ugettext as _

def index(request):
    translate_str = _("這裡放需要翻譯的文字")
    context = {"translate_str": translate_str}
    return render(request, 'index.html', context)
index.html
{% load i18n %}
<body>
    <div>
    {# 示範第一種方式,不可以放變數 #}
    {% trans "翻譯我" %}

    {# 示範第二種方式,可以變數 #}
    {% blocktrans %}
        這裡的文字都會被翻譯,
        而且還可以放變數: {{ translate_str }}
    {% endblocktrans %}

    {# 示範第二種方式,並且加入一些參數#}
    {% blocktrans trimmed %}
        翻譯上面的方式之後,在製作po檔時會發現都會多換行符號 \n
        但是加入 trimmed 之後,這裡的文字翻譯時就不會有\n了
        而且一樣可以放變數: {{ translate_str }}
    {% endblocktrans %}
    </div>
</body>

3、製作語系檔

首先我們要先在專案的根目錄建立叫做locale的資料夾
project  
    --project  
    --app  
    --locale  
    --static
你的資料夾路徑可能會像是以上這樣

示範以英文為需要翻譯的目標語系

執行指令建立語系檔
$ python manage.py makemessages -l en_US
此時你的資料夾路徑會像是這樣
project  
    --project  
    --app  
    --locale  
    ----zh_hant  
    ------LC_MESSAGES  
    --------django.po  
    --static
出現沒有gettext的問題,請參閱1

4、編輯 po 翻譯檔

在檔案裡面你會看到兩個屬性 msgid、msgstr
msgid是原始文字,而我們的目標是修改msgst
msgid "姓名"
msgstr "name"  

msgid "電話"  
msgstr "phone"  
修改完會像是以上這樣。 2

5、編譯po語系檔

$ python manage.py compilemessages
完成之後,執行就可以翻譯成你製作的語系了。

最後如果還需要能夠在網頁上動態設置語系,那還會需要添加一些連結以及製作切換語系的選單,Django網站有明確的範例https://docs.djangoproject.com/en/1.11/topics/i18n/translation/#miscellaneous


  1. 發生這個問題可以到 GNU Project 下載之後自己編譯,所有軟體編譯方式大致一樣,可以參考用編譯方式安裝最新的Python 這篇來編譯。 ↩
  2. 網路上有一些專門編輯po翻譯檔的程式可以更方便去翻譯,例如 Poedit ↩

2015年11月26日 星期四

Debian 用編譯方式安裝最新的Python

在伺服器上面,我們常常會碰到一種情況,
就是Debian的apt-get在安裝軟體的時候軟體的版本太舊了,不是我們想要的
那這個時候我們就只能在網站上面下載原始碼,並且自己編譯了
以下就利用Python當作舉例,但是不一定只侷限於Python。

首先我們要先確保編譯器有安裝
$ sudo apt-get install gcc
$ sudo apt-get install build-essential libssl-dev

2015年11月3日 星期二

Python 方法修飾器 (at) @

Python 主要有三個修飾器,函式修飾器、類別修飾器、方法修飾器
修飾器的功能可以在不修改其他程式下,新增其他功能。

修飾器會把整個Function傳入到你要的程式中,而方法修飾器還另外會再把你的程式中第一個引數傳入(一般是用self)

以下是一個範例,建立一個方法的登入驗證

1.先建立一個登入驗證的function
def verify(func):
    def wrapper(self):
        處理self資訊.....
        return func(self)
    return wrapper

2.再建立一個需要進入登入驗證的方法,並且我們只需要在需要的方法上面一行加上 @verify
class Web:
    @verify
    def menu(request):
        return render(request, "menu.html")

這樣的做法就會在要進入menu之前,先將menu傳入verify的func,
並且將 menu 的request參數傳入wrapper的self。
當通過驗證的時候,就會回傳function到原來的menu,讓menu繼續執行,
或是不通過的時候,可以在 wrapper中return其他的地方,像是下面的方式。

def verify(func):
    def wrapper(self):
        if self.POST["password"] == "123456:
            return func(self)
        else:
            return render(self, "Login.html")
    return wrapper

如果在 Django 當中self不習慣的話,也可以改回request
def verify(func):
    def wrapper(request):
        if request.POST["password"] == "123456:
            return func(request)
        else:
            return render(request, "Login.html")
    return wrapper



完整的程式大概長得像是下面這樣。
def verify(func):
    def wrapper(request, *args, **kwargs):
        if request.POST["password"] == "123456:
            return func(request, *args, **kwargs)
        else:
            return render(request, "Login.html")
    return wrapper

class Web:
    @verify
    def menu(request):
        return render(request, "menu.html")

2015年11月1日 星期日

Django 1.8 以上 使用 MySQL

mysqlclient Python連接MySQL的Interface

mysqlclient 的特點
  • 遵守 PEP 0249 ,也就是符合Python連接資料庫介面的規範

mysqlclient 安裝

$ pip install mysqlclient


如果出現 OSError: mysql_config not found 這個錯誤,就代表說電腦沒有安裝MySQL的client端,
所以我們需要安裝libmysqlclient-dev
$ sudo apt-get install libmysqlclient-dev

連結Mysql

Django 設定檔

在Settings.py 的 DATABASES 括號內替換成自己需要的字串
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '[DatabaseName]',
'USER': '[user]',
'PASSWORD': '[password]',
'HOST': '[127.0.0.1]'
} }

2015年10月31日 星期六

Python 隔離函式庫環境 虛擬環境 Virtualenv

Virtualenv 是用來創造一個虛擬環境給需要使用不同套件或套件版本不同的軟體使用,
並且能不影響到主要的環境。

Virtualenv 有幾個特點
  • 不同的專案(虛擬環境)可以使用不同版本的函式庫
  • 在更新專案(虛擬環境)的套件時,不會影響到其他的專案
  • 在安裝套件的時候,不需要有最高權限

Virtualenv 環境建立

安裝Virtualenv
$ pip3 install virtualenv

使用Virtualenv

1.建立虛擬環境

$ virtualenv [虛擬環境名稱]

例如下列指令要建立叫做ExampleENV的虛擬環境
$ virtualenv ExampleENV

Virtualenv 預設會裝pip,setup tools,wheel 還會裝其他系統內已經安裝的套件
如果不需要其他系統內安裝的套件,可以加上參數 --no-site-packages
$ virtualenv --no-site-packages ExampleENV
如果你電腦的預設是沒裝系統其他套件,但是你想要裝的話則是加上 --system-site-packages
$ virtualenv --system-site-packages ExampleENV

另外也可以指定Python直譯器的版本,但是是從電腦內去抓的,例如在mac os x 上面
$ virtualenv -p python3.4

需要注意的事情是Python 直譯器是從電腦內抓的。

2.啟動虛擬環境

只用 source 指令切換至虛擬環境。
$ source ExampleENV/bin/activate

切換後即可發現 shell 前面多了 (ExampleENV)
可以使用 pip -V 在這個模式下也可以發現 pip的位置改變了

Windows 環境
> ExampleENV\Scripts\activate.bat

3.離開虛擬環境

輸入下列指令即可離開虛擬環境。
$ deactive

2014年9月21日 星期日

Python 使用 PyInstaller 打包 部屬

PyInstaller 可以將軟體打包成執行檔,
需要注意的是Linux系統打包好的執行檔是不能給Windows執行的,
要讓Windows能夠執行的話就還是必須要在Windows的環境才能編譯出執行檔。

PyInstaller 有幾個特點
  • 可以直接打包成1個可執行檔
  • 在Linux, Mac, Windows都可以使用

PyInstaller 安裝

安裝PyInstaller
$ pip install pyinstaller

使用PyInstaller

1.編譯

$ pyinstaller [檔案名稱]

例如下列指令要建立Hello的執行檔
$ pyinstaller Hello.py

PyInstaller會自動將函式庫包裝,並且在dist資料夾會產生打包好的資料夾
如果需要編譯成單一執行檔則使用下列指令
$ pyinstaller -F Hello.py

在 Mac OS X 如果想要包裝成.app 的應用程式,可以加上 -w
$ pyinstaller -w Hello.py


在Windows下面,我曾經做成exe之後換到其他電腦不能執行,出現 找不到 VCRUNTIME140.DLL 的錯誤,
如果有出現一樣的錯誤,就是少了 Visual C++ Redistributable 的套件。
程式正常執行時,如果打包找不到檔案,可以使用 --paths 添加檔案的路徑

20170322 補充
Mac OS X之前常常發生程式會閃退的問題,通常是因為寫入檔案時的資料夾權限不足,
因此包裝成 app 程式時,記得路徑要使用應用程式內的路徑