2016年11月30日 星期三

Python編碼問題

程式的開頭加入下列這行,表示程式本身的編碼為utf8
# -*- coding: utf8 –*-
test.py
# -*- coding: utf8 -*-
import requests
r=requests.get('http://tw.yahoo.com')
print r.text.encode('utf8') #因為網頁內容為utf8編碼,所以這裏要用utf8


然而在命令列中執行該程式,顯示的資料卻是亂碼image
原因為命令列的預設編碼為 CP950(BIG5):950
image
所以我們要將它切換至 utf-8 
chcp 65001
image
之後執行即可正常顯示中文了
image

2016年11月24日 星期四

SMTP–send mail by Telnet

1.開啟命令列(CMD)

2.Telnet your_server_ip 25 <Enter>

連線後會出現mail主機相關訊息

程序

使用 telnet 測試 SMTP 通訊

  1. 開啟 telnet 工作階段:在命令提示字元中,輸入 telnet,然後按 ENTER。

  2. 在執行 Microsoft Windows® 2000 Server 的電腦上輸入 set local_echo,或在執行 Windows Server™ 2003 或 Windows XP 的電腦上輸入 SET LOCALECHO,然後按 ENTER。此命令可讓您檢視命令的回應。
    附註:如需可用的 telnet 命令的清單,請輸入 set ?

  3. 輸入 o <您的郵件伺服器網域> 25,然後按 ENTER。

  4. 輸入 EHLO <您的郵件伺服器網域>,然後按 ENTER。

  5. 輸入 AUTH LOGIN。伺服器會回應您使用者名稱的加密提示。

  6. 輸入您以 base 64 加密的使用者名稱。您可以使用任一種可用來將使用者名稱編碼的工具。
    例: 網域\使用者名稱(以下方工具編碼成base64貼上後按<Enter>
    (工具:http://www.convertstring.com/zh_TW/EncodeDecode/Base64Encode)

  7. 伺服器會回應您密碼的 base 64 加密提示。請輸入以 base 64 加密的密碼。

  8. 輸入 MAIL FROM:<sender@domain.com>,然後按 ENTER。如果不允許寄件者傳送郵件,則 SMTP 伺服器會傳回錯誤。

  9. 輸入 RCPT TO:<recipient@remotedomain.com>,然後按 ENTER。如果收件者不是有效的收件者或伺服器未接受此網域的郵件,則 SMTP 伺服器會傳回錯誤。

  10. 輸入 DATA

  11. 您可以視需要輸入郵件文字、按 ENTER、輸入句點 (.),然後再次按 ENTER。

  12. 如果郵件運作正常,您應該會看到與下列類似的回應,指出該郵件已在佇列中等待傳遞:

[轉貼]Python 的內建 GUI 模組 Tkinter 測試 (一) : 建立視窗

Python 的內建 GUI 模組 Tkinter 測試 (一) : 建立視窗

最近因為玩樹苺派的關係, 接觸到 Python 內建的 GUI 開發模組 Tkinter (意思是 Tk Interface), 初步覺得比用 Java 的 Swing 還要來得容易, 因此就來學看看唄!
Tk 原先是為 Tcl 語言所開發的 GUI 套件, 因為是 Tcl 的第一個擴充, 所以現在都合起來稱呼為 Tcl/Tk. Tcl 是一種以 string-based 的跨平台工具命令式直譯語言 (Tool command language), 繼承了 LISP/C/Shell 等語言的優點, 並具有語法簡單, 容易擴展與可靈活嵌入其他語言的特點, 而且全面支持 unicode.
而 Tkinter 是 Python 內建的標準模組, 內部嵌入了 Tcl/Tk GUI 套件, 用來在 Python 中建構 GUI 圖形介面程式, 它具有如下優點 :

  1. 簡單易學 :
    比 Python 其他 GUI 要容易, 甚至於我覺得比學 Java Swing 還容易.
  2. 程式碼精簡 :
    以很短的程式碼便能產生強大功能的 GUI 程式.
  3. 跨平台 :
    同樣的程式可以在 Linux/Windows/Mac 等系統上執行.
不過在 Python 2 中的模組名稱 Tkinter 到 Python 3 版後已被改為小寫的 tkinter, 使用時要注意所用之 Python 版本, 匯入時注意該用首字大寫與否. 不過 Python 2 下以 Tkinter 所寫的 GUI 程式可以利用 2to3 程式轉成 Python 3 版的程式, 詳見 :
# https://docs.python.org/2/library/tkinter.html

在 Python 中使用 Tkinter 需先匯入模組 : 

import Tkinter

from Tkinter import *
但書裡說不建議使用後面這種方式, 因為此方法是匯入 Tkinter 所有函數與屬性, 這樣會占用較多記憶體, 而且容易讓命名空間混淆, 並使得 debug 難度增加. 不過, 這種方式使用起來較方便.
比較常見的匯入方式是幫 Tkinter 取個別名 :
import Tkinter as tk
注意, 在 Python 3 要用小寫的 tkinter.
這樣就能使用 tk 這個別名來呼叫此模組內的函數 :
tk.函數名稱()
匯入模組就可以呼叫 Tk() 函數建立一個視窗實體 :
import Tkinter as tk
win=tk.Tk()
如果沒有取別名, 就要用 Tkinter.Tk() :
import Tkinter
win=Tkinter.Tk()
然後呼叫此視窗實體之 mainloop() 函數將此視窗加入事件監視迴圈, 這樣會產生 GUI 視窗了.
win.mainloop()
真是太簡單了, 建立一個空視窗只要三行程式碼!
如果用 Java Swing 來產生一個空視窗, 至少需要 10 行以上的程式碼 :
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class JFrame1 {
  JFrame f;
  public static void main(String argv[]) {
    new JFrame1();
    }
  public JFrame1() {
    f=new JFrame("JFrame 1");
    f.setBounds(0,0,400,300);
    f.setVisible(true);
    }
  }
這就是為什麼 Tkinter 非常適合用來快速開發 GUI 程式的原因.
在 IDLE 介面輸入此三行程式, 馬上就建立一個視窗了 :
Python 2.7.6 (default, Nov 10 2013, 19:24:18) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import Tkinter as tk
>>> win=tk.Tk()
>>> win.mainloop()

注意, 視窗描繪是在加入事件監視函數 mainloop() 後才發生的唷!
此空視窗右上角有標準視窗的縮小, 放大, 以及關閉按鈕, 還可以拖曳調整視窗大小. 預設標題 (title) 是 "tk", 我們可以呼叫 title 函數來加以設定 :
>>> import Tkinter as tk
win=tk.Tk()
win.title("My First Tk GUI")
win.mainloop()

如果不想讓使用者調整視窗大小, 可以呼叫 resizable(0, 0) 來禁止 :
import Tkinter as tk
win=tk.Tk()
win.title("My First Tk GUI")
win.resizable(0,0)
win.mainloop()

這樣不僅無法拖曳縮放視窗, 右上角的放大按鈕也被禁能了, 只能縮小與關閉. 此 resizable() 函數事實上是設定視窗左上角座標, 如果設為 0,0 表示無法縮放.
Tkinter 提供了下列 21 種 GUI 元件 (稱為 widget 或 control)  :

  1. Label
  2. Button
  3. Radiobutton
  4. Checkbutton
  5. Entry
  6. Frame
  7. LabelFrame
  8. Listbox
  9. Text
  10. Message
  11. PanedWindow
  12. Scrollbar
  13. Scale
  14. Spinbox
  15. Menu
  16. OptionMenu
  17. Menubutton
  18. Canvas
  19. Image
  20. Bitmap
  21. Toplevel
下面來測試其中的 Button 與 Label 元件, 把下列程式用記事本存成 test.py :
import Tkinter as tk
win=tk.Tk()     #建立視窗容器物件
win.title("Tk GUI")
label=tk.Label(win, text="Hello World!")   #建立標籤物件
label.pack()       #顯示元件
button=tk.Button(win, text="OK")
button.pack()     #顯示元件
win.mainloop()

然後在命令提示字元視窗執行 :
D:\Python\test>python test.py

可見在呼叫 pack() 函數做版面管理的話, Tkinter 會將元件由上而下水平置中順序排版.
注意, 在建立 GUI 元件時, 第一個參數必須為其容器物件 (此處為 win 變數所代表之視窗), 格式如下 :
元件變數=元件名稱(容器物件變數, [元件選項])
其他為元件之選項參數, 例如標籤文字 (text), 大小(size), 邊框 (border), 前景顏色 (foreground), 或背景顏色 (background), 每一種元件可能有不同之選項, 可以在建立元件時直接設定, 也可以在建立之後呼叫 configure() 函數或其別名 config() 來設定.
其次, 所建立的元件必須利用版面管理員 (geometry manager) 於視窗容器中定位, 這樣它才會在視窗中顯現, 而此 pack() 函數就是一個版面管理員, 它會由上而下擺放元件.
如果是使用 from Tkinter import * 匯入方式, 上面程式的寫法要改為 :
from Tkinter import *
win=Tk()
win.title("Tk GUI")
label=Label(win, text="Hello World!")
button=Button(win, text="OK")
label.pack()
button.pack()
win.mainloop()
ㄟ, 這個寫法好像比較簡單哩! 不用寫 tk.
除了由上而下的 pack() 版面管理員外, 也可以呼叫 grid() 函數使用網格版面來管理元件 :
from Tkinter import *
win=Tk()
win.title("Tk GUI")
label=Label(win, text="Hello World!")
button=Button(win, text="OK")
label.grid(column=0,row=0)
button.grid(column=1,row=0)
win.mainloop()

在呼叫 grid() 時, 我們將 label 放在 0 行 0 列, button 放在 1 行 0 列, 亦即這是一個 1x2 (1 列 2 行) 的網格, 因此元件是左右各排一個.
目前這個按鈕按下去不會有反應, 因為我們還沒有幫它設定事件處理函數. 在下面範例中, 我定義了一個按鈕事件處理函數 clickOK() 來處理 OK 鍵被按事件, 並設定了一個全域變數 count 來記錄 OK 鍵被按了幾次, 當 OK 被按時, count 會增量, 並且透過呼叫元件的 configure() 或 config() 函數來更改標籤元件的文字內容 (text 屬性) :
from Tkinter import *
win=Tk()
win.title("Tk GUI")
label=Label(win, text="Hello World!")
count=0
def clickOK():
    global count
    count=count + 1
    label.configure(text="Click OK " + str(count) + " times")
button=Button(win, text="OK", command=clickOK)
label.pack()
button.pack()
win.mainloop()

注意, 事件處理函數與 GUI 元件之間是透過 command 參數來綁定的. 另外上面也用到了 Python 內建函數 str() 來將數值類型的 count 轉成字串類型.
上面範例中的按鈕看起來似乎不是那麼好看, 所以 Tkinter 後來又推出了加強版的 ttk 模組來美化元件的外觀, 這 ttk 意思是 Themed Tkinter, 亦即主題化版本, 參考 :
# https://docs.python.org/2/library/ttk.html

此 ttk 模組包含了 17 種元件, 其中的 11 種是 Tkinter 原本已經有的 :

  1. Label
  2. Button
  3. Radiobutton
  4. Checkbutton
  5. Entry
  6. Frame
  7. Labelframe
  8. Menubutton
  9. Scale
  10. Scrollbar
  11. Panedwindow

另外 6 個是 ttk 推出的新元件 :

  1. Combobox
  2. Notebook
  3. Progressbar
  4. Separator
  5. Sizegrip
  6. Treeview

Ttk 的使用方法與 Tkinter 完全一樣, 使用前須先匯入此模組 :

from Tkinter import ttk

from ttk import *
將上面範例用 ttk 改寫如下 :
from Tkinter import *
from ttk import *
win=Tk()
win.title("ttk GUI")
label=Label(win, text="Hello World!")
count=0
def clickOK():
    global count
    count=count + 1
    label.config(text="Click OK " + str(count) + " times")
button=Button(win, text="OK", command=clickOK)
label.pack()
button.pack()
win.mainloop()

可見按鈕真的變漂亮了!
Tk 模組有一個測試函數 _test(), 會顯示一個內建的測試視窗 :
Python 2.7.8 (default, Jun 30 2014, 16:03:49) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> from Tkinter import *
Tkinter._test()

我這是在 Python 2.7.6 上測試的, Tk 的版本是 8.5, 如果在 Python 3 上測試, Tk 版本應該是 8.6 版以上. 8.6 版在功能上比起 8.5 有大幅改進.
呼叫 Tcl().eval() 函數可以查詢 Tk 版本 :
>>> Tkinter.Tcl().eval('info patchlevel')
'8.5.15'
用 Tkinter 模組寫好的 Python 程式可以用 py2exe 模組轉成 Windows 執行檔, 參考 :
# 將python轉成執行檔(py2exe)
# http://www.py2exe.org/index.cgi/Tutorial
# Tk : Dialog window
其他參考 :
# 傻貓布落格 : Tkinter
# TutorialsPoint
# An Introduction to Tkinter
# Thinking in Tkinter

網頁來源:http://yhhuang1966.blogspot.tw/2016/05/python-gui-tkinter.html

2016年11月23日 星期三

Python打包成執行檔(Python 3.5 | PyInstaller 3.1)[轉貼]

Python打包成執行檔(Python 3.5 | PyInstaller 3.1)

06:52 POSTED BY STEVEN ZHENG PYINSTALLER, PYTHON 5 COMMENTS

Python 3.5 嘗試 PyInstaller 3.1
Introduction

Python是個很方便的語言,但是當你需要將程式分享給他人使用時,這種script language需要安裝相對應的直譯器和環境,大幅降低檔案分享的容易程度,因此我們能藉由一些第三方軟體來將python的程式碼打包成Windows、Linux或Mac可以執行的執行檔(ex: exe..)

目前我知道能打包python的工具有py2exe、pyinstaller、cx-freeze

雖然py2exe很小巧方便,但似乎不支援python3.5
所以本篇嘗試使用 pyinstaller!

安裝(在command line下指令)

安裝指令(若不清楚pip可看這篇)

pip install pyinstaller

或是更新

    pip install --upgrade pyinstaller
    使用方式

    這套件功能很強大,官方檔案

    pyinstaller [options] script [script ...] | specfile
    不加任何參數,即可將檔案打包成一個資料夾(包含執行檔+引入的函式庫)
    pyinstaller myscript.py
    若要將整個資料夾打包成一個執行檔
    pyinstaller -F myscript.py
    其他功能未來介紹,或請參閱官方檔案
    問題
    1. 若產生"failed to create process."
      目前推測可能有些bug導致無法解析含空格的檔案路徑(EX:預設的Python 3.5即有空格),因此可以選擇把python裝在沒有含空格的路徑,重新install所以相關檔案。
      或是:
      cd /path.../python 3.5/Scripts
      python pyinstaller-script.py path/YourScript.py

    參考網址:http://zmh00.blogspot.tw/2016/01/python-codeexe.html

    2016年11月21日 星期一

    無法載入檔案或組件 'AjaxControlToolkit' 或其相依性的其中之一。 存取被拒。

     

    主要是

    C:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files

    這個目錄未設定Asp.net user的存取權限,

    image

    但如何得知ASP.NET的使用者帳號呢?

    2016年11月14日 星期一

    Windows 10 下安裝Node.js

    Node.js 是一套事件驅動I/O伺服端JavaScript環境,建立在Google V8 JavaScript Engine上,讓原本執行在Client端(Browser)的語言javaScript也可以在伺服器端執行。

    由於javaScript的特性,使Node.js也可以快速的建置,開發出來的程式也更為輕量。而其目的是提供撰寫可擴充網路程式,例如Web Service。

    而想要體驗Node.js的魅力首先要先進行環境的安裝,在Windows作業系統中,最簡單的安裝方式就是到Node.js的官網下載安裝程式。

    安裝 node.js
    https://nodejs.org/en/

    Windows 10 下安裝Node.js,出現以下錯誤

    image

    image

    image

    image

    安裝會出現錯誤,主要是因為權限的問題

    http://www.howtogeek.com/178826/how-to-force-an-msi-package-to-install-using-administrator-mode/

    這是教你如何在右鍵增加一個選項=>以Administrator身份安裝

    image

    步驟如下:

    1.Mouse移至左下角開始的圖案上,按Mouse右鍵,點執行~輸入 regedit 按 [Enter]

    imageimage

    2.找到及展開以下: HKEY_CLASSES_ROOT\Msi.Package\shell

    imageimage

    3.在shell上按mouse右鍵>新增>機碼,機碼名稱為runas

    image

    4.Mouse左鍵雙擊runas內的預設值,修改數值資料為~ 以Administrator身份安裝

    image

    5.Mouse在runas機碼上按右鍵,新增runas的子機碼,叫command

    並修改command的預設值裏的數值資料為~ msiexec /i "%1"

    image

    image

    這樣就完成了