Python tkinter Combobox 用法與範例

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

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

  • tkinter 建立 Combobox
  • tkinter 設定 Combobox 預設的選項
  • tkinter 取得目前 Combobox 的選項
  • tkinter Combobox 綁定事件

tkinter 的 Combobox widget 是在 Tkinter 的 ttk 模組中,所以需要另外 import tkinter.ttk 才能使用。

tkinter 建立 Combobox

tkinter 建立 ttk.Combobox 的用法如下,建立 ttk.Combobox() 的同時可以將選項的數值一併設定進去,也就是 Combobox 的 values 參數,

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

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

mycombobox = ttk.Combobox(root, values=[
'apple',
'banana',
'orange',
'lemon',
'tomato'])
mycombobox.pack(pady=10)

root.mainloop()

結果圖如下,

tkinter 設定 Combobox 預設的選項

tkinter 要設定 ttk.Combobox 預設選項的話,可以透過 Combobox.current() 函式來設定,索引值從0開始,第一個選項的索引值為0,這邊也示範選項的數值可以在建立完 Combobox 之後再設定 Combobox 的 values 屬性即可。

python3-combobox2.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
import tkinter.ttk as ttk

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

mycombobox = ttk.Combobox(root)
mycombobox['values'] = ['apple','banana','orange','lemon','tomato']
mycombobox.pack(pady=10)
mycombobox.current(0)

root.mainloop()

結果圖如下,

tkinter 取得目前 Combobox 的選項

示範按下按鈕顯示目前選取的 Combobox 選項,就把目前的 Combobox 選項顯示在按鈕上,使用 Combobox.current() 不傳入任何參數可以取得目前的索引值,使用 Combobox.get() 可以取得目前 Combobox 的選項,在之前就已經透過 buttonText 與 tk.Button 綁定,所以之後修改 buttonText 就會顯示在該按鈕的名稱上,如果要讓選項只能讀取不能修改的話,可以加上 state='readonly' 的參數,

python3-combobox3.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
import tkinter.ttk as ttk

def button_event():
print(mycombobox.current(), mycombobox.get())
buttonText.set('idx:' + str(mycombobox.current()) + ', ' + mycombobox.get())

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

comboboxList = ['apple','banana','orange','lemon','tomato']
mycombobox = ttk.Combobox(root, state='readonly')
mycombobox['values'] = comboboxList

mycombobox.pack(pady=10)
mycombobox.current(0)

buttonText = tk.StringVar()
buttonText.set('button')
tk.Button(root, textvariable=buttonText, command=button_event).pack()

root.mainloop()

結果圖如下,

tkinter Combobox 綁定事件

有時我們會希望當 Combobox 有變動時可以處理這個事件的邏輯,例如下列例子中,當 Combobox 發生改變時就讓 label 顯示對應的選項,這其中就要用到 Combobox.bind 來綁定事件。

python3-combobox4.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
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk
import tkinter.ttk as ttk

def combobox_selected(event):
print(mycombobox.current(), comboboxText.get())
labelText.set('my favourite fruit is ' + comboboxText.get())

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

comboboxText = tk.StringVar()
mycombobox = ttk.Combobox(root, textvariable=comboboxText, state='readonly')
mycombobox['values'] = ['apple','banana','orange','lemon','tomato']
mycombobox.pack(pady=10)
mycombobox.current(2)

mycombobox.bind('<<ComboboxSelected>>', combobox_selected)

labelText = tk.StringVar()
mylabel = tk.Label(root, textvariable=labelText, height=5, font=('Arial', 12))
mylabel.pack()

root.mainloop()

結果圖如下,

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

其它參考
tkinter.ttk — Tk themed widgets — Python 3 documentation
https://docs.python.org/3/library/tkinter.ttk.html#combobox

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

Python global 全域變數用法與範例

本篇介紹 Python global 全域變數用法與範例,Python 全域變數要使用 global 這個關鍵字,先來說說區域變數與全域變數的差別,區域變數(local variable)是該變數只有在函式內使用,影響範圍也只在這函式內,離開這個函式時該變數的生命週期也就結束;全域變數(global variable)是該變數可以在整個程式內使用,影響範圍也在這個程式內,一直到結束這個程式時該變數的生命週期才結束。

以下的 Python global 全域變數用法與範例將分為這幾部分,

  • Python 區域變數與全域變數的差別
  • Python 在函式裡宣告全域變數

那我們開始吧!

Python 區域變數與全域變數的差別

這邊介紹 Python 區域變數與全域變數的差別,如下範例所示,在程式裡的 s 是全域變數,呼叫 myprint 要印出 s 時,因為區域變數裡沒有 s,所以會印出全域變數的 s,

1
2
3
4
5
6
def myprint():
print('myprint: ' + s)

s = 'I am global variable'
print(s)
myprint()

結果如下,

1
2
I am global variable
myprint: I am global variable

那如果我們在 myprint 裡加入 s 這個區域變數呢?

1
2
3
4
5
6
7
def myprint():
s = 'I am local variable'
print('myprint: ' + s)

s = 'I am global variable'
print(s)
myprint()

結果如下,結果是 myprint 就會印出區域變數的 s,

1
2
I am global variable
myprint: I am local variable

不過實際上我們通常不會將區域變數取的名子跟全域變數一樣,因為這可能會造成混淆跟誤會。

Python 在函式裡宣告全域變數

這邊介紹 Python 如何在函式裡宣告全域變數,只要在函式裡使用 global 這個關鍵字來宣告變數,這樣 Python 直譯器就會知道該變數是全域變數,用法範例如下,

1
2
3
4
5
6
7
def myprint():
global s
s = 'hello world'
print('myprint: ' + s)

myprint()
print(s)

這樣 myprint 函式結束後都還能存取 s 全域變數,結果如下,

1
2
myprint: hello world
hello world

再舉一個計數器的例子,並且在一開始時將 counter 設定為 0,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
counter = 0
def func_a():
global counter
counter += 2
print('func_a counter: ' + str(counter))

def func_b():
global counter
counter += 3
print('func_b counter: ' + str(counter))

func_a()
print('counter: ' + str(counter))
func_b()
print('counter: ' + str(counter))

經過 func_a 與 func_b 執行後都有修改到全域變數的 counter,結果如下,

1
2
3
4
func_a counter: 2
counter: 2
func_b counter: 5
counter: 5

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

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

Python argparse 用法與範例

本篇介紹 Python argparse 用法與範例,在寫 Python 程式時,有時需要傳入一些參數給程式,然後在程式裡處理這些 argv,argv 在另外這篇有介紹過了,這篇要教更快更方便的 argparse 模組,讓你在短時間內加好一堆參數選項,還省去處理變數類型轉換問題,這麼厲害的 argparse 模組還不趕緊學習起來!

解析單一個參數

Python argparse 要傳入單一參數的話寫法如下,

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

def get_parser():
parser = argparse.ArgumentParser(description='my description')
parser.add_argument('string', type=str)
return parser

if __name__ == '__main__':
parser = get_parser()
args = parser.parse_args()
print(args.string)
print(type(args.string))

結果如下,

1
2
3
$ ./python3-argparse.py hello 
hello
<class 'str'>

但是這樣的寫法只能接受單一個參數,如果傳入多個參數的話就會報錯,

1
2
3
$ ./python3-argparse.py hello world
usage: python3-argparse.py [-h] string
python3-argparse.py: error: unrecognized arguments: world

如果要傳入多個參數的話請看下一節

解析多個參數

基於上述的例子,Python argparse 要傳入多個參數的話寫法如下,加上 nargs='+' 表示可以接受多個參數,

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

def get_parser():
parser = argparse.ArgumentParser(description='my description')
parser.add_argument('strings', type=str, nargs='+')
return parser

if __name__ == '__main__':
parser = get_parser()
args = parser.parse_args()
print(args.strings)
print(type(args.strings))
print(args.strings[0])

結果如下,

1
2
3
4
$ ./python3-argparse2.py hello world
['hello', 'world']
<class 'list'>
hello

接下來示範網路程式常常會用到的例子,傳入 ip 跟 port 這兩個參數給程式,並且讓 ip 的變數類型為 str,port 的變數類型為 int,以便套用到後續程式的設定,範例如下,

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

def get_parser():
parser = argparse.ArgumentParser(description='my description')
parser.add_argument('ip', type=str)
parser.add_argument('port', type=int)
return parser

if __name__ == '__main__':
parser = get_parser()
args = parser.parse_args()
print(args.ip + ':' + str(args.port))
print(type(args.ip))
print(type(args.port))

結果如下,

1
2
3
4
$ ./python3-argparse3.py 192.168.1.2 8080
192.168.1.2:8080
<class 'str'>
<class 'int'>

參數選項

那如果今天我希望不輸入任何參數也能讓程式順利執行的話呢?那麼這些設定值都給它個預設值,

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

def get_parser():
parser = argparse.ArgumentParser(description='my description')
parser.add_argument('--ip', default='0.0.0.0')
parser.add_argument('--port', default='8080', type=int)
return parser

if __name__ == '__main__':
parser = get_parser()
args = parser.parse_args()
print('ip: ' + args.ip)
print('port: ' + str(args.port))

結果如下,

1
2
3
4
5
6
7
8
9
$ ./python3-argparse4.py
ip: 0.0.0.0
port: 8080
$ ./python3-argparse4.py --ip 192.168.1.2
ip: 192.168.1.2
port: 8080
$ ./python3-argparse4.py --ip 192.168.1.2 --port 80
ip: 192.168.1.2
port: 80

短參數選項

這邊介紹 argparse 的短參數選項,承上述例子,加入 --ip 的短選項為 -i 以及 --port 的短選項為 -p,範例如下,

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

def get_parser():
parser = argparse.ArgumentParser(description='my description')
parser.add_argument('-i', '--ip', default='0.0.0.0')
parser.add_argument('-p', '--port', default='8080', type=int)
return parser

if __name__ == '__main__':
parser = get_parser()
args = parser.parse_args()
print('ip: ' + args.ip)
print('port: ' + str(args.port))

實際上用起來結果如下,

1
2
3
$ ./python3-argparse5.py -i 192.168.1.2 -p 80
ip: 192.168.1.2
port: 80

其它參考
Argparse 教學 — Python 3 說明文件
https://docs.python.org/zh-tw/3/howto/argparse.html
Python学习教程:Python argparse模块_chen801090的博客-CSDN博客
https://blog.csdn.net/chen801090/article/details/102686939
argparse简要用法总结 | Yunfeng’s Simple Blog
https://vra.github.io/2017/12/02/argparse-usage/
Python 超好用標準函式庫 argparse. part 2 在這裡 | by Dboy Liao | Medium
https://dboyliao.medium.com/python-%E8%B6%85%E5%A5%BD%E7%94%A8%E6%A8%99%E6%BA%96%E5%87%BD%E5%BC%8F%E5%BA%AB-argparse-4eab2e9dcc69
argparse模塊用法實例詳解 - 知乎
https://zhuanlan.zhihu.com/p/56922793

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

Python tkinter Button 按鈕用法與範例

本篇 ShengYu 介紹 Python tkinter Button 按鈕用法與範例,Python GUI 程式設計最基本的就是建立按鈕與顯示按鈕以及處理按鈕事件,接下來就來學習怎麼用 tkinter 建立 Button 吧!

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

  • tkinter 建立按鈕 Button
  • tkinter 觸發按鈕事件來修改按鈕文字
  • tkinter Button 搭配 lambda 運算式寫法
  • tkinter 改變按鈕顏色
  • tkinter 改變按鈕大小
  • tkinter 按下按鈕離開程式

tkinter 建立按鈕 Button

tkinter Button 的用法如下,一開始先用 tk.Button 建立一個按鈕,給這個按鈕一個顯示的文字 button,再用一個變數 mybutton 來儲存回傳的 tk.Button

python3-button.py
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk
root = tk.Tk()
root.title('my window')
root.geometry('200x150')

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

root.mainloop()

如果你不需要用變數去儲存 tk.Button 的話,就可以濃縮寫成這樣一行,

1
tk.Button(root, text='button').pack()

結果圖如下,

tkinter 觸發按鈕事件來修改按鈕文字

這邊要示範 tkinter 觸發 Button 按鈕事件來修改按鈕文字,新增一個函式為 button_event,並在建立 tk.Button 時指定 command=button_event 事件處理函式,而按鈕事件發生時就會呼叫到 button_event 以便處理按下該按鈕時要處理的邏輯,

python3-button2.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')

def button_event():
mybutton['text'] = 'hello world'

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

root.mainloop()

點擊 button 後的結果圖如下,

改變按鈕文字的寫法除了上述的方法以外,還可以用另外兩種寫法,如下例所示,

1
2
3
4
def button_event():
# mybutton['text'] = 'hello world' # 方法 1
mybutton.configure(text='hello world') # 方法 2
# mybutton.config(text='hello world') # 方法 3

tkinter Button 搭配 lambda 運算式寫法

這邊介紹一下 tkinter Button 搭配 lambda 運算式的寫法,有些時候按鈕事件處理函式裡僅僅只是一行程式碼時,這時候就可以改用 lamdba 的寫法,根據上述例子的觸發按鈕事件修改按鈕文字的例子來說,部份程式碼如下,

1
2
3
4
5
def button_event():
mybutton['text'] = 'hello world'

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

改成 lambda 寫法以後,將原本 button_event 函式裡的程式碼放在 lambda 運算式裡,就可以移除 button_event 這個函式了,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk
root = tk.Tk()
root.title('my window')
root.geometry('200x150')

# def button_event():
# mybutton['text'] = 'hello world'

mybutton = tk.Button(root, text='button',
command=lambda: mybutton.config(text='hello world')
)
mybutton.pack()

root.mainloop()

當按鈕事件處理函式裡只有短短一行程式碼時,就是個運用 lamdba 好時機的例子,改用 lamba 不一定比較好,還有程式的擴充性與維護性需要自行衡量。

tkinter 改變按鈕顏色

tkinter 改變按鈕顏色的方法如下,改變按鈕的 bgbackground 屬性即可,這邊示範兩個按鈕,button 1 原本背景顏色是黃色,按下按鈕後背景顏色會改變成紅色,而 button 2 原本背景顏色是綠色,按下按鈕後背景顏色會改變成橘色,

python3-button3.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')
root.geometry('200x150')

def button_event1():
mybutton1['bg'] = 'red'
mybutton1['text'] = 'red button'

def button_event2():
mybutton2['bg'] = 'orange'
mybutton2['text'] = 'orange button'

mybutton1 = tk.Button(root, text='button 1', bg='yellow', command=button_event1)
mybutton2 = tk.Button(root, text='button 2', bg='green', command=button_event2)
mybutton1.pack()
mybutton2.pack()

root.mainloop()

點擊 button 2 後的結果圖如下,

tkinter 改變按鈕大小

這邊示範 tkinter 改變按鈕大小的用法,修改按鈕的 widthheight 屬性即可,width 表示設定成 n 個字元的寬度,而 height 則是設定成 n 個字元的高度,修改按鈕的屬性除了上述的例子外,也可以用 config 的方式寫,

python3-button4.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk
root = tk.Tk()
root.title('my window')
root.geometry('200x150')

def button_event1():
mybutton1.config(width='20', height='2')

def button_event2():
mybutton2.config(width='20', height='3')

mybutton1 = tk.Button(root, text='button 1', command=button_event1)
mybutton2 = tk.Button(root, text='button 2', command=button_event2)
mybutton1.pack()
mybutton2.pack()

root.mainloop()

點擊 button 1 後的結果圖如下,

我們可以把程式碼寫得漂亮一點,由於兩個按鈕事件裡面的邏輯都是一樣的,所以可以把這兩個函式合併成一個,在透過 configure 指定 lambda 表達式來傳遞不同參數。

python3-button5.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk
root = tk.Tk()
root.title('my window')
root.geometry('200x150')

def button_event(button, w, h):
button.config(width=w, height=h)

mybutton1 = tk.Button(root, text='button 1')
mybutton1.configure(command=lambda: button_event(mybutton1,20,2))
mybutton2 = tk.Button(root, text='button 2')
mybutton2.configure(command=lambda: button_event(mybutton2,20,3))
mybutton1.pack()
mybutton2.pack()

root.mainloop()

tkinter 按下按鈕離開程式

這邊介紹 tkinter 按下按鈕離開程式,在建立 tk.Button 時指定 command=root.destroy,而按下按鈕事件發生時就會呼叫離開程式,

python3-button6.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk
root = tk.Tk()
root.title('my window')
root.geometry('200x150')

def button_event():
mybutton1['text'] = 'button event'

mybutton1 = tk.Button(root, text='button', command=button_event)
mybutton2 = tk.Button(root, text='exit', command=root.destroy)
mybutton1.pack(side=tk.LEFT)
mybutton2.pack(side=tk.LEFT)

root.mainloop()

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

其它相關文章推薦
Python tkinter 修改按鈕文字的 2 種方式
Python 新手入門教學懶人包
Python tkinter 新手入門教學

VS Code 新增 C++ 標頭檔路徑

本篇 ShengYu 介紹如何在 VS Code 新增 C++ 標頭檔路徑 include path,

在 VS Code 按下 Ctrl+Shift+P,輸入 C/C++: Edit configurations (JSON) 按下 Enter 之後會開啟 c_cpp_properties.json,
includePath 下新增標頭檔案路徑,原本長這樣,

1
2
3
"includePath": [
"${workspaceFolder}/**"
],

mingw 標頭檔

例如新增 mingw32 的 c++ 標頭檔,改成這樣,

1
2
3
4
"includePath": [
"${workspaceFolder}/**",
"C:\\MinGW\\lib\\gcc\\mingw32\\6.3.0\\include\\c++\\"
],

libc++ 標頭檔

VS Code 在 linux 下的 c++ 標頭檔會自動去找 /usr/include/c++/ 如果有另外安裝 libc++ 的標頭檔,例如 Ubuntu 下的話安裝是 sudo apt-get install libc++-dev 就會在 /usr/include/c++/ 下多出 v1 的目錄,
要想換成 /usr/include/c++/v1/ 的話就改成這樣,

1
2
3
4
"includePath": [
"${workspaceFolder}/**",
"/usr/include/c++/v1/"
],

之後你在跳至定義處的話就會跳到你設定的 c++ 標頭檔路徑了。

其它相關文章推薦
Visual Studio Code 常用快捷鍵
Visual Studio Code 安裝 C/C++11 環境教學

C++ 如何使用 libc++

本篇 ShengYu 介紹 clang++ 如何使用 libc++,

在 Ubuntu 下要使用 libc++ 的話需要用 apt 安裝一下這個函式庫,指令如下,

1
sudo apt-get install libc++-dev

平常我們使用 g++ 編譯時預設會連結到 libstdc++,用法如下,

1
g++ main.cpp -o a.out

怎麼看編譯出來的執行檔連結到哪些函式庫可以看這篇

如果換成 clang++ 去編譯的話也是發現最後還是會連結到 libstdc++,

1
clang++ -stdlib=libc++ main.cpp -o a.out

那要怎麼去連結 libc++ 呢?

答案是用 clang++ 並且加上一個 -stdlib=libc++ 參數指定要使用 libc++ 這樣就會連結到 libc++ 了,

1
clang++ -stdlib=libc++ main.cpp -o a.out

PS. g++ 沒有 -stdlib= 參數的,-stdlib= 參數是clang++ 才有的,也就是說用 g++ 只有 libstdc++ 的選擇,要用 libc++請改用clang++。

其它參考
libc++: A Standard Library for C++0x - 2010 LLVM Developers’ Meeting
https://llvm.org/devmtg/2010-11/Hinnant-libcxx.pdf
c++ - When is it necessary to use the flag -stdlib=libstdc++? - Stack Overflow
https://stackoverflow.com/questions/19774778/when-is-it-necessary-to-use-the-flag-stdlib-libstdc
osx mavericks - Using g++ with libc++ - Stack Overflow
https://stackoverflow.com/questions/22228208/using-g-with-libc

其它相關文章推薦
如果你想學習 C++ 相關技術,可以參考看看下面的文章,
C/C++ 新手入門教學懶人包
std::vector 用法與範例
std::deque 介紹與用法
std::queue 用法與範例
std::map 用法與範例
std::unordered_map 用法與範例
std::set 用法與範例
std::thread 用法與範例
std::mutex 用法與範例
std::find 用法與範例
std::sort 用法與範例
std::random_shuffle 產生不重複的隨機亂數
std::shared_ptr 用法與範例
std::async 用法與範例

C++ 印出變數類型

本篇 ShengYu 介紹 C++ 印出變數類型,使用 typeid 可以取得該變數類型的資訊,

要使用 typeid 的話,需要引入的標頭檔<typeinfo>

C++ 印出變數類型

使用 typeid(變數名稱).name() 可以回傳該變數的變數類型。

cpp-typeid.cpp
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
36
37
38
39
40
41
42
43
44
// g++ cpp-typeid.cpp -o a.out -std=c++11
#include <iostream>
#include <string>
#include <vector>
#include <typeinfo>
using namespace std;

int main() {
char c;
cout << "char:" << typeid(c).name() << "\n";
unsigned char uc;
cout << "char:" << typeid(uc).name() << "\n";

short s;
cout << "short:" << typeid(s).name() << "\n";
unsigned short us;
cout << "unsigned short:" <<typeid(us).name() << "\n";

int i;
cout << "int:" << typeid(i).name() << "\n";
unsigned int ui;
cout << "unsigned int:" << typeid(ui).name() << "\n";

long l;
cout << "long:" << typeid(l).name() << "\n";
unsigned long ul;
cout << "unsigned long:" << typeid(ul).name() << "\n";

float f;
cout << "float:" << typeid(f).name() << "\n";
double d;
cout << "double:" << typeid(d).name() << "\n";

char ac[10];
cout << "char:" << typeid(ac).name() << "\n";
string str;
cout << "string:" << typeid(str).name() << "\n";
int ai[20];
cout << "array int:" << typeid(ai).name() << "\n";
vector<int> v;
cout << "vector<int>:" << typeid(v).name() << "\n";

return 0;
}

輸出結果如下,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
char:c
char:h
short:s
unsigned short:t
int:i
unsigned int:j
long:l
unsigned long:m
float:f
double:d
char:A10_c
string:NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
array int:A20_i
vector<int>:St6vectorIiSaIiEE

可以看到這些印出來的型態都不是我們所熟悉的,這時候請使用一個神秘的工具指令叫做 c++filt 就可以印出這些資訊的對應型態了,讓我來示範一下,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ c++filt -t c
char
$ c++filt -t h
unsigned char
$ c++filt -t s
short
$ c++filt -t t
unsigned short
$ c++filt -t j
unsigned int
$ c++filt -t m
unsigned long
$ c++filt -t f
float
$ c++filt -t d
double
$ c++filt -t A10_c
char [10]
$ c++filt -t NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >
$ c++filt -t A20_i
int [20]
$ c++filt -t St6vectorIiSaIiEE
std::vector<int, std::allocator<int> >

以上的示範是不是超級清楚!可是我想要直接就印出變數類型不想這樣還要透過指令轉一手怎麼辦?

typeid 印出真正的變數類型

如果要將 typeid().name() 的結果印出真正的變數類型的話,可以參考下列方式使用 abi::__cxa_demangle 這個函式,使用前需要引入標頭檔 <cxxabi.h>

cpp-typeid2.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// g++ cpp-typeid2.cpp -o a.out -std=c++11
#include <iostream>
#include <typeinfo>
#include <cxxabi.h>
using namespace std;

int main() {
int i;
int status;
char *realname = abi::__cxa_demangle(typeid(i).name(), 0, 0, &status);
cout << realname << "\n";
free(realname);

return 0;
}

印出 auto 的變數型態

這邊舉個例子,有時候 STL 回傳的變數類型用 auto 接很方便,但有時候會想要明確知道這個變數類型是什麼,下面以 vector::size() 為例,vector::size() 會回傳 size_type,那 size_type 實際上是被定義成什麼基本變數型態呢?就可以用剛剛學到的技巧來試試,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// g++ cpp-typeid3.cpp -o a.out -std=c++11
#include <iostream>
#include <vector>
#include <typeinfo>
#include <cxxabi.h>
using namespace std;

int main() {
vector<int> v;
auto size = v.size();

int status;
char *realname = abi::__cxa_demangle(typeid(size).name(), 0, 0, &status);
cout << realname << "\n";
free(realname);

return 0;
}

以我的 Ubuntu 64bit 作業系統下輸出結果如下,

1
unsigned long

其它參考
c++ - typeid() returns extra characters in g++ - Stack Overflow
https://stackoverflow.com/questions/789402/typeid-returns-extra-characters-in-g
https://charlottehong.blogspot.com/2017/04/c-typeid.html

其它相關文章推薦
如果你想學習 C++ 相關技術,可以參考看看下面的文章,
C/C++ 新手入門教學懶人包
std::vector 用法與範例
std::deque 介紹與用法
std::queue 用法與範例
std::map 用法與範例
std::unordered_map 用法與範例
std::set 用法與範例
std::thread 用法與範例
std::mutex 用法與範例
std::find 用法與範例
std::sort 用法與範例
std::random_shuffle 產生不重複的隨機亂數
std::shared_ptr 用法與範例
std::async 用法與範例

Python tkinter Label 標籤用法與範例

本篇 ShengYu 介紹 Python tkinter Label 標籤用法與範例,Python GUI 程式設計最基本的就是建立標籤與顯示標籤,趕快來學習怎麼用 tkinter 建立 Label 吧!

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

  • tkinter 建立標籤 Label
  • tkinter 設定標籤字型大小
  • tkinter 設定標籤大小
  • tkinter 設定標籤背景顏色

tkinter 建立標籤 Label

tkinter Label 的用法如下,一開始先用 tk.Label 建立一個標籤,給這個標籤一個顯示的文字 hello world,再用一個變數 mylabel 來儲存回傳的 tk.Label

python3-label.py
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk
root = tk.Tk()
root.title('my window')
root.geometry('200x150')

mylabel = tk.Label(root, text='hello world')
mylabel.pack()

root.mainloop()

如果你不需要用變數去儲存 tk.Label 的話,就可以濃縮寫成這樣一行,

1
tk.Label(root, text='hello world').pack()

結果圖如下,

tkinter 設定標籤字型大小

tkinter 要設定標籤字型大小的用法如下,在 tk.Label 裡傳入 font 的屬性,這邊示範字型為 Arial,字型大小為 18,

python3-label2.py
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk
root = tk.Tk()
root.title('my window')
root.geometry('200x150')

mylabel = tk.Label(root, text='hello world', font=('Arial', 18))
mylabel.pack()

root.mainloop()

結果圖如下,

tkinter 設定標籤大小

tkinter 要設定標籤大小的用法如下,在 tk.Label 裡傳入 width 的屬性可以設定寬度,傳入 height 的屬性可以設定幾倍字元的高度,

python3-label3.py
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk
root = tk.Tk()
root.title('my window')
root.geometry('200x150')

mylabel = tk.Label(root, text='hello world', width=20, height=10)
mylabel.pack()

root.mainloop()

結果圖如下,

tkinter 設定標籤背景顏色

tkinter 要設定標籤背景顏色的用法如下,在 tk.Label 裡傳入 bg 的屬性,或是傳入 background 的屬性也可以,這邊示範黃色,

python3-label4.py
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk
root = tk.Tk()
root.title('my window')
root.geometry('200x150')

mylabel = tk.Label(root, text='hello world', bg='yellow')
#mylabel = tk.Label(root, text='hello world', background='yellow')
mylabel.pack()

root.mainloop()

結果圖如下,

如果要設定標籤的前景顏色則是在 tk.Label 裡傳入 fgbackground 的屬性,這邊就不作示範了。

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

其它相關文章推薦
Python tkinter 修改標籤文字的 2 種方式
Python 新手入門教學懶人包
Python tkinter 新手入門教學

Python tkinter messagebox 用法與範例

本篇 ShengYu 介紹 Python tkinter messagebox 用法與範例,在 Python GUI 程式設計中常常需要提出一個提示對話框告訴使用者一些訊息,例如:有錯誤發生或者離開程式前的確認對話框,所以這篇會列出幾種 messagebox 用法與範例如下,

  • tkinter messagebox.showinfo() 顯示訊息對話框
  • tkinter messagebox.showwarning() 警告訊息對話框
  • tkinter messagebox.showerror() 錯誤訊息對話框
  • tkinter messagebox.askokcancel() 確定取消對話框
  • tkinter messagebox.askquestion() 是否問題對話框

那就開始吧!

tkinter messagebox.showinfo() 顯示訊息對話框

Python tkinter 要顯示訊息對話框可以使用 messagebox 的 messagebox.showinfo()messagebox.showinfo() 可用來顯示一般資訊,用法如下,

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

root = tk.Tk()
root.withdraw()
messagebox.showinfo('my messagebox', 'hello world')

結果圖如下,

tkinter messagebox.showwarning() 警告訊息對話框

tkinter 要顯示警告訊息對話框的話用 messagebox.showwarning(),用法如下,

python3-messagebox2.py
1
2
3
4
5
6
7
8
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk
from tkinter import messagebox

root = tk.Tk()
root.withdraw()
messagebox.showwarning('my messagebox', 'hello world')

結果圖如下,

tkinter messagebox.showerror() 錯誤訊息對話框

tkinter 要顯示錯誤訊息對話框的話用 messagebox.showerror(),用法如下,

python3-messagebox3.py
1
2
3
4
5
6
7
8
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk
from tkinter import messagebox

root = tk.Tk()
root.withdraw()
messagebox.showerror('my messagebox', 'hello world')

結果圖如下,

tkinter messagebox.askokcancel() 確定取消對話框

tkinter 要顯示確定取消訊息對話框的話用 messagebox.askokcancel(),用法如下,

python3-messagebox4.py
1
2
3
4
5
6
7
8
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk
from tkinter import messagebox

root = tk.Tk()
root.withdraw()
messagebox.askokcancel('my messagebox', 'hello world')

結果圖如下,

tkinter messagebox.askquestion() 是否問題對話框

tkinter 要顯示是否問題對話框的話用 messagebox.askquestion(),例如要問使用者是否要離開程式,用法如下,

python3-messagebox5.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 -*-
import tkinter as tk
from tkinter import messagebox

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

def button_event():
MsgBox = tk.messagebox.askquestion('my messagebox','Exit?')
if MsgBox == 'yes':
root.destroy()

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

root.mainloop()

結果圖如下,

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

其它參考
tkinter.messagebox — Tkinter message prompts — Python 3 documentation
https://docs.python.org/3/library/tkinter.messagebox.html

其它相關文章推薦
Python tkinter 選擇資料夾對話框
Python 新手入門教學懶人包
Python tkinter 新手入門教學

Python 檢查 str 字串是否為空

本篇介紹如何在 Python 檢查 str 字串是否為空,

使用 not operator 運算子

使用 not operator 運算子來檢查 str 字串是否為空,
同時也是官方推薦的作法,

1
2
3
4
5
6
7
8
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
s = [] # or s = str()
print(type(s))
print(s)

if not s:
print('s is empty')

結果輸出:

1
2
3
<class 'list'>
[]
s is empty

使用 len 判斷長度

使用 len() 函式來檢查 str 字串是否為空,

1
2
3
4
5
6
7
8
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
s = str() # or s = []
print(type(s))
print(len(s))

if len(s) == 0:
print('l is empty')

結果輸出:

1
2
3
<class 'str'>
0
l is empty

其它相關文章推薦
如果你想學習 Python 相關技術,可以參考看看下面的文章,
Python 新手入門教學懶人包
Python str 字串用法與範例