在 Python 寫 main 函式

本篇介紹 Python main 主程式進入點用法與範例,
Python 中沒有所謂的 main 主程式入口函式,Python 是腳本語言,執行時是從上往下逐步解析執行,

Python 中基本的 main 函式

在 Python 中一個 main 函式的基本寫法如下,
Python interpreter 執行 Python 腳本時會定義 name 變數為某個字串,
if __name__ == '__main__',是想表示 main() 只有在當前腳本被直接執行時才執行,不希望被導入其它模組時執行。

1
2
3
4
5
def main():
print('Hello World')

if __name__ == '__main__':
main()

Python 中模組的 main 函式

有時候執行 Python 檔案時,並沒有指定入口檔案(命令行中較常見,例如:python -m http.server 8000),這時候程式是從哪個檔案開始執行呢?答案是 __main__.py 檔案,它所在的包被當成一個”檔案”來執行了

其它參考
Python - if name == ‘main‘ 涵義
http://blog.castman.net/%E6%95%99%E5%AD%B8/2018/01/27/python-name-main.html
python的 if name == ‘main‘: 是什麼意思?
https://ithelp.ithome.com.tw/articles/10231756
在Python中定義Main函數
https://kknews.cc/zh-tw/code/gjxb2am.html


在Python中定义Main函数(第一部分)
https://python.freelycode.com/contribution/detail/1584
在Python中定义Main函数(第二部分)
https://blog.csdn.net/sinat_38682860/article/details/90522767
在Python中定义Main函数(第三部分)
https://python.freelycode.com/contribution/detail/1586
Defining Main Functions in Python (原文)
https://realpython.com/python-main-function/

Python為什麼沒有main函數?為什麼我不推薦寫main函數?
https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/723146/

其它相關文章推薦
Python 新手入門教學懶人包
Python 寫檔,寫入 txt 文字檔
[Python] 讀取 csv 檔案
[Python] 寫入 csv 檔案
[Python] 讀寫檔案
[Python] 產生 random 隨機不重複的數字 list
[Python] PyAutoGUI 使用教學
Python OpenCV resize 圖片縮放

Python 循序搜尋法 Sequential Search

本篇 ShengYu 介紹 Python 循序搜尋法 Sequential Search。

Python Sequential Search 循序搜尋法

以下為 Python 循序搜尋法的實作,要從串列 data 裡尋找數字 7,循序搜尋法是最簡單的實作方式,主要是由一個主迴圈從頭掃到尾,一個一個值拿來跟 key 作比對,一直到有比對成功救回傳索引值或者一直到結束都沒有比對成功,沒有比對成功的話就回傳 -1,範例如下,

python3-sequential-search.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def sequential_search(data, key):
for i in range(len(data)):
if key == data[i]:
return i
return -1

data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
key = 7
print(data)
ret = sequential_search(data, key)
if ret == -1:
print('找不到')
else:
print('找到索引值' + str(ret))

結果如下,

1
2
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
找到索引值6

使用循序搜尋法時資料不需要先排序過

使用循序搜尋法前時資料不需要先排序過就可以直接搜尋了,跟二元搜尋法比較不一樣,範例如下,

python3-sequential-search2.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def sequential_search(data, key):
for i in range(len(data)):
if key == data[i]:
return i
return -1

data = [1, 9, 2, 7, 4, 10, 3, 8, 5, 6]
key = 7
print(data)
ret = sequential_search(data, key)
if ret == -1:
print('找不到')
else:
print('找到索引值' + str(ret))

結果如下,

1
2
[1, 9, 2, 7, 4, 10, 3, 8, 5, 6]
找到索引值3

其它相關文章推薦
Python 二元搜尋法 Binary Search
Python 新手入門教學懶人包

Linux base64 用法與範例

本篇 ShengYu 介紹 Linux base64 用法與範例,

以下的 Linux base64 用法與範例將分為這幾部分,

  • Linux base64 encode 編碼
  • Linux base64 decode 解碼
  • Linux base64 encode 編碼並輸出至檔案
  • Linux base64 從檔案解碼 decode
  • 為什麼 linux base64 跟 python base64 的結果輸出不一樣?

那我們開始吧!

Linux base64 encode 編碼

這邊示範用 Linux base64 編碼一段文字並輸出在標準輸出上,

1
echo "Hello World" | base64

標準輸出如下,

1
SGVsbG8gV29ybGQK

Linux echo 指令預設會加上換行符號 \n,如果想要 echo 不加上換行符號的話可以加上 -n 的選項,

1
echo -n "Hello World" | base64

標準輸出如下,

1
SGVsbG8gV29ybGQ=

Linux base64 decode 解碼

承上例,將這段編碼的文字用 base64 指令解碼,編碼後輸出至標準輸出,
Linux base64 decode 解碼的參數是 -d,macOS base64 decode 解碼的參數是 -D

1
echo -n "SGVsbG8gV29ybGQ=" | base64 -d

標準輸出如下,

1
Hello World

Linux base64 encode 編碼並輸出至檔案

如下範例,把 inputPlan.txt 檔案內容編碼,編碼後輸出至標準輸出,

1
base64 inputPlan.txt

要輸出至檔案的話,指令會變成這樣,

1
base64 inputPlan.txt > encoded.txt

Linux base64 從檔案解碼 decode

承上例,將這個編碼過的 encoded.txt 的檔案用 base64 指令解碼,並輸出至標準輸出,
Linux 下 base64 解碼 decode 的參數是 -d,macOS 下 base64 解碼 decode 的參數是 -D

1
base64 -d encoded.txt

為什麼 linux base64 跟 python base64 的結果輸出不一樣?

stackoverflow 這篇有在討論為什麼 linux base64 指令跟 python base64 的輸出不一樣,理論上用不同工具做 base64 轉換應該要得到相同結果,結果發現是在用 echo 指令時會加上換行符號 \n,解決方式就是用 echo -n 不要加上換行符號。

以上就是 Linux base64 用法與範例介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其它相關文章推薦
Linux 常用指令教學懶人包
Linux cut 字串處理用法與範例
Linux find 尋找檔案/尋找資料夾用法與範例
Linux grep/ack/ag 搜尋字串用法與範例
Linux tee 同時螢幕標準輸出和輸出到檔案用法與範例
Linux xargs 參數列表轉換用法與範例
Linux tail 持續監看檔案輸出用法與範例

Python tkinter Entry 文字輸入框用法與範例

本篇 ShengYu 介紹 Python tkinter Entry 文字輸入框用法與範例,Python GUI 程式設計裡文字輸入框的處理是很基本且常用的功能,接下來就來學習怎麼用 tkinter 建立 Entry 吧!

以下的 Python tkinter Entry 用法與範例將分為這幾部分,

  • tkinter Entry 基本用法
  • tkinter Entry 基本參數
  • tkinter 取得 Entry 的輸入文字
  • tkinter Entry 限制輸入框只能輸入數字
  • tkinter Entry 使用 show='*' 隱藏輸入密碼

tkinter Entry 基本用法

這邊示範 tkinter Entry 基本用法,tk.Entry() 初始化完以後,用 grid() 來設定排版,Label 在左邊(0,0),Entry 在右邊(0,1) ,之後就進入 mainloop(),就可以完成初步的 tkinter Entry 體驗囉!範例如下,

python3-entry.py
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk

root = tk.Tk()
root.title('my window')

mylabel = tk.Label(root, text='Name:')
mylabel.grid(row=0, column=0)
myentry = tk.Entry(root)
myentry.grid(row=0, column=1)

root.mainloop()

結果圖如下,

tkinter Entry 基本參數

這邊是 tkinter 的 tk.Entry() 的參數說明,有需要客製化 Entry 的一些變動的話,例如:設定Entry 的背景顏色或者設定 Entry 的邊框寬度,可以參考下面的參數,

bgbackground:文字框的背景顏色,預設是 light gray
bdbordwith:文字框的邊框寬度,預設是 2px
cursor:滑鼠游標的外型,例如:arrow、circle、cross 與 plus 等等
fgforeground:字型顏色,預設是黑色
font:字型
highlightbackground:沒有 focus 文字框時的邊框顏色
highlightcolor:focus 文字框時的邊框顏色
highlightthickness:focus 文字框時的邊框寬度
justify:文字對齊方式,選項有 tk.LEFT、tk.RIGHT 或 tk.CENTER,預設是 tk.LEFT
relief:邊框3D陰影效果,tk.FLAT、tk.GROOVE、tk.RAISED、tk.RIDGE、tk.SOLID 或 tk.SUNKEN,預設為 tk.SUNKEN
selectbackground:選取文字時的背景顏色
selectborderwidth:選取文字時的邊框寬度,預設是 1px
selectforeground:選取文字時的顏色
show:顯示輸入的字元,例如用在密碼欄位時可以使用 show='*' 來顯示星號
state:文字框的狀態,state=tk.NORMAL 是允許輸入,state=tk.DISABLED 是無法輸入,預設是 state=tk.NORMAL
takefocus:預設接受 tab 鍵的 foucs,設成 0 則是不接收
textvariable:文字變數,需要傳入類型為 StringVar 的變數
validate:設定文字框的文字驗證選項
validatecommand:設定文字驗證 callback function
width:文字框的寬度,單位是字元寬度
xscrollcommand:設定水平捲動軸,適用於文字框的內容寬度大於文字框的寬度時使用

tkinter 取得 Entry 的輸入文字

tkinter 取得 Entry 的輸入文字可以用 tk.Entry.get() 的方式,如下例子中的 myentry.get(),這邊示範按下按鈕時將 Entry 裡的文字取出來後,並且設定成 mybutton 顯示的文字,

python3-entry2.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk

def button_event():
#print(myentry.get())
if myentry.get() != '':
mybutton['text'] = myentry.get()

root = tk.Tk()
root.title('my window')
root.geometry('200x150')

myentry = tk.Entry(root)
myentry.pack()

mybutton = tk.Button(root, text='button', command=button_event)
mybutton.pack()

root.mainloop()

輸入文字且按下按鈕的結果圖如下,

這邊改用另一個例子,我們寫一個簡單的數學問題,讓使用者來回答,
取得 Entry 的輸入文字還有另一種方式,你可以宣告一個 tk.StringVar 變數 var,將 var 與 tk.Entry 綁訂,之後就可以用 var.get() 的方式來取得 Entry 的輸入文字,這次我們把它顯示在 messagebox 上,

python3-entry3.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk
from tkinter import messagebox

def button_event():
#print(var.get())
if var.get() == '':
tk.messagebox.showerror('message', '未輸入答案')
elif var.get() == '2':
tk.messagebox.showinfo('message', '答對了!')
else:
tk.messagebox.showerror('message', '答錯')

root = tk.Tk()
root.title('my window')

mylabel = tk.Label(root, text='1+1=')
mylabel.grid(row=0, column=0)

var = tk.StringVar()
myentry = tk.Entry(root, textvariable=var)
myentry.grid(row=0, column=1)

mybutton = tk.Button(root, text='完成', command=button_event)
mybutton.grid(row=1, column=1)

root.mainloop()

結果圖如下,

關於 tk.messagebox 的詳細用法可以看這篇介紹。

tkinter Entry 限制輸入框只能輸入數字

這邊介紹蠻常使用到的功能,就是限制使用者只能在 Entry 輸入框裡輸入數字,需要在 tk.Tk().register() 註冊一個驗證的函式,在這個驗證函式裡你可以客製化一些規則,例如本例中的限制使用者只能輸入數字,大概的用法如下,

python3-entry4.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk

def validate(P):
#print(P)
if str.isdigit(P) or P == '':
return True
else:
return False

root = tk.Tk()
root.title('my window')

mylabel = tk.Label(root, text='input:')
mylabel.pack(side=tk.LEFT)

vcmd = (root.register(validate), '%P')
myentry = tk.Entry(root, validate='key', validatecommand=vcmd)
myentry.pack(side=tk.LEFT)

root.mainloop()

結果圖如下,

詳細內容可以看我之前寫的 tkinter Entry 限制輸入數字這篇介紹。

tkinter Entry 使用 show='*' 隱藏輸入密碼

這邊示範一個登入視窗,裡面有兩個 Entry,分別是要讓使用者輸入使用者名稱與密碼,我們希望使用者輸入的密碼不要用明碼顯示出來,取而代之的是用 * 星號來顯示,那要怎麼作呢?就是在 tk.Entry() 初始化時設定 show='*' 參數,這樣輸入時就會顯示 * 星號而不會顯示明碼了,範例如下,

python3-entry5.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk

root = tk.Tk()
root.title('my window')

mylabel = tk.Label(root, text='Name:')
mylabel.grid(row=0, column=0)
myentry = tk.Entry(root)
myentry.grid(row=0, column=1)

mylabel2 = tk.Label(root, text='Password:')
mylabel2.grid(row=1, column=0)
myentry2 = tk.Entry(root, show='*')
myentry2.grid(row=1, column=1)

mybutton = tk.Button(root, text='Login')
mybutton.grid(row=2, column=1)

root.mainloop()

結果圖如下,

以上就是 Python tkinter Entry 文字輸入框用法與範例介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其它相關文章推薦
Python tkinter 標籤用法與範例
Python tkinter 按鈕用法與範例
Python 新手入門教學懶人包
Python tkinter 新手入門教學

Linux awk 用法與範例

本篇 ShengYu 介紹 Linux awk 用法與範例,Linux awk 這個指令最常用來取得欄位資料,跟 cut 的功能很像。

echo 字串後 pipe 給 awk

以 ifconfig 的輸出為例,因為這個在我的經驗與實務中很常拿來處理取得 IP address,

假設 ifconfig 輸出如下,

1
2
3
$ ifconfig
eth0 Link encap:Ethernet HWaddr aa:bb:cc:dd:12:34
inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0

以空白作為分隔符號,之後取得結果的第二欄,

1
2
$ echo "inet addr:192.168.1.2  Bcast:192.168.1.255  Mask:255.255.255.0" | awk -F ' ' '{print $2}'
addr:192.168.1.2

接著再以:分號作為分隔符號,之後取得結果的第二欄,

1
2
$ echo "inet addr:192.168.1.2  Bcast:192.168.1.255  Mask:255.255.255.0" | awk -F ' ' '{print $2}' | awk -F ':' '{print $2}'
192.168.1.2

那能不能同時接受多個分隔符號呢?可以的!
結合上述兩個例子,以 [ :] 空白或分號作為分隔符號,之後取得結果的第三欄,

1
2
$ echo "inet addr:192.168.1.2  Bcast:192.168.1.255  Mask:255.255.255.0" | awk -F '[ :]' '{print $3}'
192.168.1.2

如果要取得欄位名稱為例,
取出 第一欄,

1
2
$ echo "inet addr:192.168.1.2  Bcast:192.168.1.255  Mask:255.255.255.0" | awk -F '[ :]' '{print $1,$2}'
inet addr

注意這邊加逗號的話中間會留一個空白,如果不加的話變這樣,

1
2
$ echo "inet addr:192.168.1.2  Bcast:192.168.1.255  Mask:255.255.255.0" | awk -F '[ :]' '{print $1$2}'
inetaddr

也可以這樣寫,也會留一個空白,

1
2
echo "inet addr:192.168.1.2  Bcast:192.168.1.255  Mask:255.255.255.0" | awk -F '[ :]' '{print $1" "$2}'
inet addr

其它相關文章推薦
Linux 常用指令教學懶人包
Linux cut 字串處理用法與範例
Linux find 尋找檔案/尋找資料夾用法與範例
Linux grep/ack/ag 搜尋字串用法與範例
Linux tee 同時螢幕標準輸出和輸出到檔案用法與範例
Linux xargs 參數列表轉換用法與範例
Linux tail 持續監看檔案輸出用法與範例

Python tkinter Entry 限制輸入數字

本篇 ShengYu 介紹 Python tkinter Entry 限制輸入數字的方法。

tkinter Entry 限制只能輸入數字

這邊就已簡單的數學問題回答為例,需要限制使用者只能在 Entry 裡輸入數字,
tkinter Entry 限制輸入數字的方式要在 tk.Entry() 帶入 validatecommand 驗證文字的函式,也就是下例中的 validate(),驗證函式名稱可以自己改名,在這個驗證函式裡你可以客製化一些規則,例如本例中的限制使用者只能輸入數字,在 validate() 裡回傳 True 的話會讓這次的文字驗證通過,反之 False 就不會讓這次的文字通過,通過的文字才會顯示在 Entry 上,詳細用法如下,

python3-entry-number-only.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk
from tkinter import messagebox

def button_event():
print(myentry.get())
if myentry.get() == '':
tk.messagebox.showerror('message', '未輸入答案')
elif myentry.get() == '2':
tk.messagebox.showinfo('message', '答對了!')
else:
tk.messagebox.showerror('message', '答錯')

def validate(P):
print(P)
if str.isdigit(P) or P == '':
return True
else:
return False

root = tk.Tk()
root.title('my window')

mylabel = tk.Label(root, text='1+1=')
mylabel.grid(row=0, column=0)

vcmd = (root.register(validate), '%P')
myentry = tk.Entry(root, validate='key', validatecommand=vcmd)
myentry.grid(row=0, column=1)

mybutton = tk.Button(root, text='完成', command=button_event)
mybutton.grid(row=1, column=1)

root.mainloop()

結果圖如下,實際操作可以發現只能輸入數字,無法輸入數字以外的文字,這是因為我們在 validate() 驗證函式裡加上 str.isdigit() 來判斷輸入文字是否為數字,是數字才回傳 True,

參數說明

以下為 tk.Tk().register() 的參數說明,
%d:Type of action (1 for insert, 0 for delete, -1 for focus, forced or textvariable validation)
%i:index of char string to be inserted/deleted, or -1
%P:value of the entry if the edit is allowed
%s:value of entry prior to editing
%S:the text string being inserted or deleted, if any
%v:the type of validation that is currently set
%V:the type of validation that triggered the callback (key, focusin, focusout, forced)
%W:the tk name of the widget
這邊我們只使用 %P 參數,其它參數就不在此篇介紹,有興趣的人可以去試試其它參數的功用。

其它參考
python - Restricting the value in Tkinter Entry widget - Stack Overflow
https://stackoverflow.com/questions/8959815/restricting-the-value-in-tkinter-entry-widget
python - Interactively validating Entry widget content in tkinter - Stack Overflow
https://stackoverflow.com/questions/4140437/interactively-validating-entry-widget-content-in-tkinter/
entry manual page - Tk Built-In Commands
http://tcl.tk/man/tcl8.6/TkCmd/entry.htm#M16

其它相關文章推薦
Python tkinter Entry 文字框用法與範例
Python 新手入門教學懶人包
Python tkinter 新手入門教學

Python tkinter window position 改變視窗位置

本篇 ShengYu 介紹 Python tkinter window position 改變視窗位置的方法。

tkinter 改變視窗寬高與視窗位置

這邊解釋一下螢幕上的座標軸,這樣才清楚視窗要設定在哪個位置。
以下範例為 1920 x 1080 的螢幕解析度示意。

1
2
3
4
5
6
7
8
9
(0,0)       X 增加 -->
+---------------------------+
| | Y 增加
| | |
| 1920 x 1080 screen | |
| | V
| |
| |
+---------------------------+ (1919, 1079)

tkinter 改變視窗位置要使用 geometry() 函式,語法為

1
geometry('WIDTHxHEIGHT+X+Y')

如下範例所示,root.geometry(200x150) 是設定視窗寬200x高150,如果是要設定視窗位置的話則需在後面加上 +X+Y,例如 root.geometry(200x150+100+50) 是設定X軸100,Y軸50,tkinter 改變視窗位置的用法範例如下,

python3-window-change-position.py
1
2
3
4
5
6
7
8
9
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk

root = tk.Tk()
root.title('my window')
root.geometry('200x150+100+50')

root.mainloop()

tkinter 改變視窗位置

如果要單獨改變視窗位置的話可以參考下列範例,geometry() 直接帶入(X,Y)座標位置,忽略寬高的參數,

python3-window-change-position2.py
1
2
3
4
5
6
7
8
9
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk

root = tk.Tk()
root.title('my window')
root.geometry('+100+50')

root.mainloop()

其它參考
How Do I Change the Size and Position of the Main Window in Tkinter and Python 3
https://yagisanatode.com/2018/02/23/how-do-i-change-the-size-and-position-of-the-main-window-in-tkinter-and-python-3/

其它相關文章推薦
Python 新手入門教學懶人包
Python tkinter 新手入門教學

Python tkinter OptionMenu 用法與範例

本篇 ShengYu 介紹 Python tkinter OptionMenu 用法與範例。OptionMenu 下拉式選單通常適用於讓使用者從多個選項中選擇一個的情境,

以下的 Python tkinter OptionMenu 用法與範例將分為這幾部分,

  • tkinter OptionMenu 基本用法
  • 取得 tkinter OptionMenu 目前選項值
  • 當 tkinter OptionMenu 選項改變時的事件通知

tkinter OptionMenu 基本用法

OptionMenu 建立時是顯示空白,加入選項的方式如下,將所有選項放到 tk.OptionMenu() 的第三個參數之後,將 tk.StringVar 帶入 tk.OptionMenu() 第二個參數綁訂之後,透過 var.set() 來設定 OptionMenu 預設的選項值,

python3-optionmenu.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk

root = tk.Tk()
root.title('my window')
root.geometry('200x150')

var = tk.StringVar()
var.set('apple')
myoptionmenu = tk.OptionMenu(root, var, 'apple','banana','orange')
myoptionmenu.pack(pady=10)

root.mainloop()

結果圖如下,

你也可以將選項先放在 list 裡之後再帶入 tk.OptionMenu() 裡,

python3-optionmenu2.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk

root = tk.Tk()
root.title('my window')
root.geometry('200x150')

optionList = ['apple','banana','orange','lemon','tomato']
var = tk.StringVar()
var.set(optionList[2])
myoptionmenu = tk.OptionMenu(root, var, *optionList)
myoptionmenu.pack(pady=10)

root.mainloop()

結果圖如下,

取得 tkinter OptionMenu 目前選項值

這邊示範如何按下 button 時取得 OptionMenu 目前選項值,將 tk.StringVar 跟 tk.OptionMenu 綁訂之後,透過 var.get() 來取得 OptionMenu 目前選項值,執行範例時會發現按下 button 時會在 button_event 裡將目前的 myoptionmenu 選項值顯示在 mylabel 的文字上,

python3-optionmenu3.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk

def button_event():
#print(var.get())
mylabel.configure(text='my favourite fruit is ' + var.get())

root = tk.Tk()
root.title('my window')
root.geometry('200x150')

optionList = ['apple','banana','orange','lemon','tomato']
var = tk.StringVar()
var.set(optionList[0])
myoptionmenu = tk.OptionMenu(root, var, *optionList)
myoptionmenu.pack(pady=10)

tk.Button(root, text='button', command=button_event).pack(pady=10)

mylabel = tk.Label(root, text='this is label', height=2, font=('Arial', 12))
mylabel.pack()

root.mainloop()

結果圖如下,

當 tkinter OptionMenu 選項改變時的事件通知

這邊示範當 OptionMenu 選項改變時的事件通知,

python3-optionmenu4.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk

def optionmenu_event(*args):
#print(var.get())
mylabel['text'] = 'my favourite fruit is ' + var.get()

root = tk.Tk()
root.title('my window')
root.geometry('200x150')

optionList = ['apple','banana','orange','lemon','tomato']
var = tk.StringVar()
var.set(optionList[0])
myoptionmenu = tk.OptionMenu(root, var, *optionList)
myoptionmenu.pack(pady=10)

mylabel = tk.Label(root, text='this is label', height=2, font=('Arial', 12))
mylabel.pack()

#var.trace('w', lambda *args: print(var.get()))
var.trace("w", optionmenu_event)

root.mainloop()

結果圖如下,

var.trace_add() 在 ubuntu 16.04 (python3.5.2) 會遇到下列的錯誤,這邊先用 var.trace() 的方式,

1
AttributeError: 'StringVar' object has no attribute 'trace_add'

文章內有人提到 python 3.6 已棄用 var.trace() 應該要用 var.trace_add() 來替代。

以上就是 Python tkinter OptionMenu 用法與範例介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其它參考
Getting a value from Tkinter OptionMenu in Python - Stack Overflow
https://stackoverflow.com/questions/46831855/getting-a-value-from-tkinter-optionmenu-in-python

其它相關文章推薦
Python 新手入門教學懶人包
Python tkinter 新手入門教學

VS Code 文字轉小寫的方法

本篇介紹 VS Code 文字轉小寫(lowercase)的方法,在 VS Code 選取好文字後按快捷鍵 Ctrl+Shift+p (Windows 與 Linux 適用,Mac 快捷鍵是 CMD+Shift+p) 然後輸入 lower 找到 Transform to Lowercase 按下 enter 就可以將選取文字轉小寫了。

其它參考
How to switch text case in visual studio code - Stack Overflow
https://stackoverflow.com/questions/30265978/how-to-switch-text-case-in-visual-studio-code

其它相關文章推薦
Visual Studio Code 常用快捷鍵
Visual Studio Code 安裝 C/C++11 環境教學
VS Code 新增 C++ 標頭檔路徑

Shell Script function 函式

本篇 ShengYu 介紹 Shell Script function 函式寫法,腳本寫多了自然有很多邏輯是重複的,這時候就可以用 function 將這些重複邏輯抽取出來放在一個函式裡,提昇程式碼的重複利用性,另一方面是邏輯太複雜時,適時地包裝成函式能夠提昇程式的易讀性,在多人開發的環境下很能夠體會這件事。

以下的 Shell Script function 函式用法與範例將分為這幾部分,

  • Shell Script function 函式基本寫法
  • Shell Script function 傳遞參數
  • Shell Script function 回傳值
  • Shell Script function 回傳字串

以下就開始介紹 Shell Script function 函式寫法吧!

Shell Script function 函式基本寫法

Shell Script 最簡單的 function 函式寫法如下,每個函式名稱前面有個 function 關鍵字表示這邊是函式,

shellscript-function.sh
1
2
3
4
5
6
7
#!/bin/bash

function myfunc() {
echo "hello world"
}

myfunc

輸出如下,

1
hello world

沒有寫 function 關鍵字也可以,

shellscript-function-2.sh
1
2
3
4
5
6
7
#!/bin/bash

myfunc() {
echo "hello world"
}

myfunc

Shell Script function 傳遞參數

Shell Script function 要傳遞參數的用法如下,用 "$1" 來取出第一個參數,用 "$2" 來取出第二個參數,依此類推,

shellscript-function-3.sh
1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash

function myfunc1() {
echo "myfunc1 $1"
}

function myfunc2() {
echo "myfunc2 $1 $2"
}

myfunc1 "aaa"
myfunc2 "aaa" "bbb"

輸出如下,

1
2
myfunc1 aaa
myfunc2 aaa bbb

Shell Script function 回傳值

Shell Script function 用 return 關鍵字來回傳值,return 只能回傳數字,$? 代表 function 的回傳值,

shellscript-function-4.sh
1
2
3
4
5
6
7
8
#!/bin/bash

function myfunc() {
return 5
}

myfunc
echo Return value is $?

輸出如下,

1
Return value is 5

根據上述例子,我們可以來作個加法的函式,然後傳回結果值,範例如下,

shellscript-function-5.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

function myadd() {
return $(($1+$2))
}

myadd 3 4
retval=$?
echo "Return value is $retval"

myadd 6 8
retval=$?
echo "Return value is $retval"

輸出如下,

1
2
Return value is 7
Return value is 14

Shell Script function 回傳字串

基本上 Shell Script function 是無法用 return 關鍵字來回傳字串的,但是可以透過其它方式來回傳字串,方法如下,

shellscript-function-6.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash

function myfunc1() {
echo "myfunc1: hello world"
}

function myfunc2() {
local retval="myfunc2: hello world"
echo "$retval"
}

val1=$(myfunc1)
echo "val1=$val1"

val2=$(myfunc2)
echo "val2=$val2"

輸出如下,

1
2
val1=myfunc1: hello world
val2=myfunc2: hello world

以上就是 Shell Script function 函式的用法與範例介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!
下一篇介紹 讀取 txt 文字檔

其它參考
How to Return a String from Bash Functions – Linux Hint
https://linuxhint.com/return-string-bash-functions/

其它相關文章推薦
Shell Script 新手入門教學
Shell Script 四則運算,變數相加、相減、相乘、相除
Shell Script if 條件判斷
Shell Script for 迴圈
Shell Script while 迴圈
Shell Script 讀檔,讀取 txt 文字檔