Python PyQt5 新手入門教學

本篇 Python PyQt5 視窗程式新手入門教學彙整了 ShengYu 過往學習 PyQt5 的知識,在此整理成 PyQt5 教學目錄以便日後的查詢與新手入門學習,在本篇 Python PyQt5 教學裡你可以快速地學習 PyQt5 GUI 圖形介面視窗程式設計。

以下 Python PyQt5 教學目錄將分為這幾部分,

  • Python PyQt5 基本視窗
  • Python PyQt5 QLabel 標籤
  • Python PyQt5 QPushButton 按鈕
  • Python PyQt5 QLineEdit 文字輸入框
  • Python PyQt5 QComboBox 下拉式選單
  • Python PyQt5 QRadioButton 單選框
  • Python PyQt5 QCheckBox 複選框
  • Python PyQt5 QMessageBox 訊息框

那我們開始吧!

Python PyQt5 基本視窗

在 Python 中要使用 PyQt5 需要先安裝 PyQt5 模組,使用 pip 安裝 PyQt5 模組的指令如下,

1
$ pip install PyQt5

確認有安裝 PyQt5 模組後,我們便可以開始來寫一個 PyQt5 基本視窗的程式了,以下我們示範建立一個 PyQt5 的基本視窗,一開始需要建立一個 PyQt5 應用程式所需要的 QApplication,QApplication 用來管理 Qt GUI 應用程式的控制流程與主要設定,之後建立一個 QWidget 的子類,如下例中 MyWidget 繼承 QWidget,不熟悉繼承的話可以參考 Python 繼承 inheritance 的用法這篇,在 MyWidget 的 initUI() 成員函式裡使用 setWindowTitle() 讓視窗名稱上顯示 hello world 字樣,使用 setGeometry() 將視窗設定在螢幕視窗座標位置 (50, 50) 上且視窗為 寬200x高150 的大小,之後使用 show() 便會將我們的視窗顯示出來,最後要使用 QApplication.exec_() 來進入 PyQt5 的主事件循環 (Event Loop),

python-pyqt-hello-world.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 sys
from PyQt5.QtWidgets import (QApplication, QWidget)

class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.setWindowTitle('hello world')
self.setGeometry(50, 50, 200, 150)

if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec_())

下圖為 PyQt5 基本視窗的呈現結果,

延伸閱讀:Python 物件導向:繼承 inheritance 的用法
這樣我們就完成的一個基本的 PyQt5 視窗程式囉!接著我們就來學習一下 PyQt5 裡常見的 UI 元件吧!

Python PyQt5 QLabel 標籤

QLabel 標籤是很基本的 UI 元件,主要是用來顯示文字的,也常常用來跟其它 UI 元件搭配,以下為 Python PyQt5 QLabel 按鈕的範例程式,

python-pyqt-qlabel2.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 sys
from PyQt5.QtWidgets import (QApplication, QWidget, QLabel)
from PyQt5.QtGui import QFont

class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.setWindowTitle('my window')
self.setGeometry(50, 50, 200, 150)

self.mylabel = QLabel('hello world', self)
self.mylabel.move(40, 50)
self.mylabel.setFont(QFont('Arial', 18))

if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec_())

下圖為 PyQt5 QLabel 標籤的呈現結果,

詳細的 PyQt5 QLabel 教學可以看 PyQt5 QLabel 標籤用法與範例 這篇。

Python PyQt5 QPushButton 按鈕

QPushButton 按鈕與按鈕事件是視窗程式設計的學習必學的 UI 元件,以下為 Python PyQt5 QPushButton 按鈕的範例程式,

python-pyqt-qpushbutton2.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 sys
from PyQt5.QtWidgets import (QApplication, QWidget, QPushButton)

class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.setWindowTitle('my window')
self.setGeometry(50, 50, 200, 150)

self.mybutton = QPushButton('button', self)
self.mybutton.move(60, 50)
self.mybutton.clicked.connect(self.onButtonClick)

def onButtonClick(self):
self.mybutton.setText('hello wolrd')

if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec_())

下圖為 PyQt5 QPushButton 按鈕的呈現結果,

詳細的 PyQt5 QPushButton 教學可以看 PyQt5 QPushButton 按鈕用法與範例 這篇。

Python PyQt5 QLineEdit 文字輸入框

要取得使用者的輸入就需要使用 QLineEdit 文字輸入框這個 UI 元件,以下為 Python PyQt5 QLineEdit 按鈕的範例程式,

python-pyqt-qlineedit5.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
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QGridLayout, QLineEdit,
QLabel)

class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.setWindowTitle('my window')
self.setGeometry(50, 50, 240, 60)

gridlayout = QGridLayout()
self.setLayout(gridlayout)

self.mylabel = QLabel('Name:', self)
gridlayout.addWidget(self.mylabel, 0, 0)
self.mylineedit = QLineEdit(self)
gridlayout.addWidget(self.mylineedit, 0, 1)

self.mylabel2 = QLabel('Password:', self)
gridlayout.addWidget(self.mylabel2, 1, 0)
self.mylineedit2 = QLineEdit(self)
self.mylineedit2.setEchoMode(QLineEdit.Password)
gridlayout.addWidget(self.mylineedit2, 1, 1)

if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec_())

下圖為 PyQt5 QLineEdit 文字輸入框的呈現結果,

詳細的 PyQt5 QLineEdit 教學可以看 PyQt5 QLineEdit 文字輸入框用法與範例 這篇。

Python PyQt5 QComboBox 下拉式選單

QComboBox 提供下拉式選單給使用者選取選項,跟 QListBox 相比 QComboBox 可以節省很多版面的空間,也讓使用者清楚知道目前的選取的項目,以下為 Python PyQt5 QComboBox 下拉式選單的範例程式,

python-pyqt-qcombobox2.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 sys
from PyQt5.QtWidgets import (QApplication, QWidget, QComboBox)

class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.setWindowTitle('my window')
self.setGeometry(50, 50, 200, 150)

self.mycombobox = QComboBox(self)
self.mycombobox.addItems(['apple', 'banana', 'orange', 'lemon', 'tomato'])
self.mycombobox.setCurrentIndex(1)
#self.mycombobox.setCurrentText('banana')
self.mycombobox.move(60, 50)

if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec_())

下圖為 PyQt5 QComboBox 下拉式選單的呈現結果,

詳細的 PyQt5 QComboBox 教學可以看 PyQt5 QComboBox 下拉式選單用法與範例 這篇。

Python PyQt5 QRadioButton 單選框

QRadioButton 單選框提供多選一的操作方式給使用者選取選項,以下為 Python PyQt5 QRadioButton 單選框的範例程式,

python-pyqt-qradiobutton.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
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QVBoxLayout,
QRadioButton)

class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.setWindowTitle('my window')
self.setGeometry(50, 50, 200, 150)

layout = QVBoxLayout()
self.setLayout(layout)

self.myradiobutton1 = QRadioButton('apple', self)
layout.addWidget(self.myradiobutton1)
self.myradiobutton2 = QRadioButton('banana', self)
layout.addWidget(self.myradiobutton2)
self.myradiobutton3 = QRadioButton('orange', self)
layout.addWidget(self.myradiobutton3)

if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec_())

下圖為 PyQt5 QRadioButton 單選框的呈現結果,

詳細的 PyQt5 QRadioButton 教學可以看 PyQt5 QRadioButton 單選框用法與範例 這篇。

Python PyQt5 QCheckBox 複選框

QCheckBox 複選框提供多選項選取的操作方式給使用者選取選項,以下為 Python PyQt5 QCheckBox 複選框的範例程式,

python-pyqt-qcheckbox3.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
36
37
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QVBoxLayout, QCheckBox)

class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.setWindowTitle('my window')
self.setGeometry(50, 50, 200, 150)

layout = QVBoxLayout()
self.setLayout(layout)

self.checkbox1 = QCheckBox('apple', self)
layout.addWidget(self.checkbox1)

self.checkbox2 = QCheckBox('banana', self)
self.checkbox2.toggle()
layout.addWidget(self.checkbox2)

self.checkbox3 = QCheckBox('orange', self)
self.checkbox3.setChecked(False)
layout.addWidget(self.checkbox3)

self.checkbox4 = QCheckBox('tomato', self)
self.checkbox4.setChecked(True)
layout.addWidget(self.checkbox4)

if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec_())

下圖為 PyQt5 QCheckBox 複選框的呈現結果,

詳細的 PyQt5 QCheckBox 教學可以看 PyQt5 QCheckBox 複選框用法與範例 這篇。

Python PyQt5 QMessageBox 訊息框

QMessageBox 訊息框是蠻常見的 UI 元件,經常被使用來顯示提示訊息給使用者,以下為 Python PyQt5 QMessageBox 訊息框的範例程式,

python-pyqt-qmessagebox.py
1
2
3
4
5
6
7
8
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QApplication, QMessageBox)

if __name__ == '__main__':
app = QApplication(sys.argv)
QMessageBox.information(None, 'my messagebox', 'hello world')

下圖為 PyQt5 QMessageBox 訊息框的呈現結果,

詳細的 QMessageBox 訊息框教學可以看 PyQt5 QMessageBox 用法與範例 這篇。

以上就是 Python PyQt5 新手入門教學介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

Python tkinter 新手入門教學

本篇 Python tkinter 視窗程式新手入門教學彙整了 ShengYu 過往學習 tkinter 的知識,在此整理成 tkinter 教學目錄以便日後的查詢與新手入門學習,在本篇 Python tkinter 教學裡你可以快速地學習 tkinter GUI 圖形介面視窗程式設計。

以下 Python tkinter 教學目錄將分為這幾部分,

  • Python tkinter 基本視窗
  • Python tkinter Label 標籤
  • Python tkinter Button 按鈕
  • Python tkinter Entry 文字輸入框
  • Python tkinter Combobox 下拉式選單
  • Python tkinter messagebox 訊息框

那我們開始吧!

Python tkinter 基本視窗

Python3 預設內建已經提供了 tkinter 模組,所以不需額外安裝什麼模組就可以開始寫成 tkinter 視窗程式囉!

接下來我們要先學習一下 tkinter 基本的視窗程式,一開始先使用 tk.Tk() 建立主視窗,之後用 title() 設定這個視窗的名稱,如果要改變視窗大小的話可以使用 geometry() 函式,例如下例中將視窗設定成 寬200x高150 的大小,最後呼叫 mainloop() 進入 tkinter 的主事件循環 (Event Loop),

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

root.mainloop()

下圖為 tkinter 基本視窗的呈現結果,

如果要寫成 class 類別的話可以這樣寫,如下範例所示,建立一個 MyApp 類別繼承 tk.Tk,不熟悉繼承的話可以參考 Python 繼承 inheritance 的用法這篇,之後在 MyApp 的 initUI() 成員函式裡使用 title() 讓視窗名稱上顯示 hello world 字樣,使用 geometry() 將視窗設定為 寬200x高150 的大小,最後要使用 mainloop() 來進入 tkinter 的主事件循環 (Event Loop),

python3-hello-world2.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

class MyApp(tk.Tk):
def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.title('hello world')
self.geometry('200x150')

if __name__ == '__main__':
app = MyApp()
app.mainloop()

延伸閱讀:Python 物件導向:繼承 inheritance 的用法
這樣我們就完成的一個基本的 tkinter 視窗程式囉!接著我們就來學習一下 tkinter 裡常見的 UI 元件吧!

Python tkinter Label 標籤

Label 標籤是很基本的 UI 元件,主要是用來顯示文字的,也常常用來跟其它 UI 元件搭配,以下為 Python tkinter Label 按鈕的範例程式,使用 tk.Label 建立一個標籤並給這個標籤一個顯示的文字 hello world,同時也可以設定該標籤的字型跟字型大小,

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 Label 標籤的呈現結果,

詳細的 tkinter Label 教學可以看 tkinter label 標籤用法與範例 這篇。

Python tkinter Button 按鈕

Button 按鈕與按鈕事件是視窗程式設計的學習必學的 UI 元件,以下為 Python tkinter Button 按鈕的範例程式,使用 tk.Button 建立一個按鈕後並指定 command=button_event 事件處理函式,而按鈕事件發生時就會呼叫到 button_event 以便處理按下該按鈕時要處理的邏輯,這個範例是按下按鈕時會把按鈕的文字改成 hello world

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()

下圖為 tkinter Button 按鈕按下後觸發事件的呈現結果,

詳細的 tkinter Button 教學可以看 tkinter button 按鈕用法與範例 這篇。

Python tkinter Entry 文字輸入框

要取得使用者的輸入就需要使用 Entry 文字輸入框這個 UI 元件,以下為 Python tkinter Entry 按鈕的範例程式,

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()

下圖為 tkinter Entry 文字輸入框的呈現結果,

詳細的 tkinter Entry 教學可以看 tkinter Entry 文字輸入框用法與範例 這篇。

Python tkinter Combobox 下拉式選單

Combobox 提供下拉式選單給使用者選取選項,跟 QListBox 相比 Combobox 可以節省很多版面的空間,也讓使用者清楚知道目前的選取的項目,以下為 Python tkinter Combobox 下拉式選單的範例程式,

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 下拉式選單的呈現結果,

詳細的 tkinter Combobox 教學可以看 tkinter Combobox 用法與範例 這篇。

Python tkinter messagebox 訊息框

messagebox 訊息框是蠻常見的 UI 元件,經常被使用來顯示提示訊息給使用者,以下為 Python tkinter messagebox 訊息框的範例程式,

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 訊息框的呈現結果,

詳細的 QMessageBox 訊息框教學可以看 tkinter messagebox 用法與範例 這篇。

以上就是 Python tkinter 新手入門教學介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

C++ std::floor 無條件捨去用法與範例

本篇 ShengYu 介紹 C++ 的 std::floor 用法與範例,C++ std::floor() 是用來無條件捨去或者也可以說向下取整的函式,

以下的 C++ std::floor 用法與範例將分為這幾部分,

  • C++ std::floor 基本用法
  • C++ std::floor 負數範例
  • C floor 用法

那我們開始吧!

C++ std::floor 基本用法

這邊介紹 C++ std::floor 無條件進位或者向上取整的用法,使用前要引用 <cmath> 標頭檔,在 std::floor() 傳入任何一個浮點數,都會回傳無條件進位的結果,例如:std::floor() 傳入 4.2 會回傳 4,std::floor() 傳入 6.1 會回傳 6。

std-floor.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
// g++ std-floor.cpp -o a.out
#include <iostream>
#include <cmath>

using namespace std;

int main() {
cout << std::floor(4.2) << "\n";
cout << std::floor(4.4) << "\n";
cout << std::floor(4.6) << "\n";
cout << std::floor(4.8) << "\n";
return 0;
}

C++ std::floor() 結果輸出如下,

1
2
3
4
4
4
4
4

那 C++ std::floor() 如果傳入 4.0 會回傳多少呢?答案是 4。

如果使用 float 或 double 變數帶入 std::floor() 的範例如下,

std-floor2.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// g++ std-floor2.cpp -o a.out
#include <iostream>
#include <cmath>

using namespace std;

int main() {
float f = 6.5f;
cout << std::floor(f) << "\n";

double d = 6.5;
cout << std::floor(d) << "\n";
return 0;
}

C++ std::floor() 結果輸出如下,

1
2
6
6

C++ std::floor 負數範例

這邊介紹 C++ std::floor 負數範例,

std-floor3.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
// g++ std-floor3.cpp -o a.out
#include <iostream>
#include <cmath>

using namespace std;

int main() {
cout << std::floor(-42.2) << "\n";
cout << std::floor(-42.4) << "\n";
cout << std::floor(-42.6) << "\n";
cout << std::floor(-42.8) << "\n";
return 0;
}

C++ std::floor() 負數結果輸出如下,

1
2
3
4
-43
-43
-43
-43

C floor 用法

在 C 語言中也有 floor 函式可以使用,使用前要引用 標頭檔,使用方法如下,floor() 可以傳入 double 也可以傳入 float,

cpp-floor.cpp
1
2
3
4
5
6
7
8
9
10
11
// g++ cpp-floor.cpp -o a.out
#include <stdio.h>
#include <math.h>

int main() {
printf("%f\n", floor(4.2));
printf("%f\n", floor(4.4));
printf("%f\n", floor(4.6f));
printf("%f\n", floor(4.8f));
return 0;
}

floor 輸出結果如下,

1
2
3
4
4.000000
4.000000
4.000000
4.000000

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

其它相關文章推薦
C/C++ 新手入門教學懶人包

Python tkinter Checkbutton 複選框用法與範例

本篇 ShengYu 將介紹 Python tkinter Checkbutton 複選框用法與範例,Checkbutton 可以作一些多選項的確認功能,例如代辦清單這種應用。

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

  • tkinter Checkbutton 基本用法
  • tkinter 設定 Checkbutton 選取或取消選取
  • tkinter Checkbutton 綁定事件

那我們開始吧!

tkinter Checkbutton 基本用法

tkinter 建立 Checkbutton 的基本用法如下,在建立 tk.Checkbutton 的同時設定 text 屬性,text 屬性就是複選框的顯示文字,設定 variablevar 屬性是可以綁定該 Checkbutton 的勾選狀態,例如 mycheckbutton1 綁定這個 var1 變數後,之後 var1.set(True) 就是將 mycheckbutton1 勾選,反之 var1.set(False) 就是將 mycheckbutton1 取消勾選,

python3-checkbutton.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
root = tk.Tk()
root.title('my window')
root.geometry('200x150')

var1 = tk.BooleanVar()
var2 = tk.BooleanVar()
var3 = tk.BooleanVar()

mycheckbutton1 = tk.Checkbutton(root, text='apple',
var=var1)
mycheckbutton1.pack()
mycheckbutton2 = tk.Checkbutton(root, text='banana',
var=var2)
mycheckbutton2.pack()
mycheckbutton3 = tk.Checkbutton(root, text='orange',
var=var3)
mycheckbutton3.pack()

var1.set(True)

root.mainloop()

結果圖如下,

如果覺得 Checkbutton 上下間距太小的話,你可以透過設定 tk.Checkbuttonheight 屬性來調整,例如:調整 Checkbutton 高度為 2,

1
2
3
mycheckbutton1 = tk.Checkbutton(root, text='apple',
variable=var1,
height=2)

tkinter 設定 Checkbutton 選取或取消選取

這邊介紹 tkinter 設定 Checkbutton 選取或取消選取的方法,也可以用來設定 Checkbutton 預設的選擇,建立 Checkbutton 後預設是不選取的狀態,有三種方式可以改變這個狀態,

第一種是使用 Checkbutton.select()Checkbutton.deselect()select() 就是勾選,select() 就是取消勾選,

第二種是使用 Checkbutton.toggle()toggle() 就是原本勾選的會變成不勾選,再使用一次 toggle() 的話原本不勾選的會變成勾選,範例如下,

python3-checkbutton2.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
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk
root = tk.Tk()
root.title('my window')
root.geometry('200x150')

var1 = tk.IntVar()
var2 = tk.IntVar()
var3 = tk.IntVar()

mycheckbutton1 = tk.Checkbutton(root, text='apple',
variable=var1,
onvalue=1, offvalue=0)
mycheckbutton1.pack()
mycheckbutton2 = tk.Checkbutton(root, text='banana',
variable=var2,
onvalue=1, offvalue=0)
mycheckbutton2.pack()
mycheckbutton3 = tk.Checkbutton(root, text='orange',
variable=var3,
onvalue=1, offvalue=0)
mycheckbutton3.pack()

mycheckbutton1.select()
mycheckbutton1.deselect()
mycheckbutton2.select()
mycheckbutton3.toggle()

root.mainloop()

結果圖如下,

第三種是在建立 tk.Checkbutton 時設定 variablevar 屬性,如下例中的 var1 ~ var3,使用 IntVar.set() 設定數值,然後 var1 ~ var3 變數的數值決定會不會勾選該 Checkbutton,範例如下,

python3-checkbutton3.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
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk
root = tk.Tk()
root.title('my window')
root.geometry('200x150')

var1 = tk.IntVar()
var2 = tk.IntVar()
var3 = tk.IntVar()

mycheckbutton1 = tk.Checkbutton(root, text='apple',
variable=var1,
onvalue=1, offvalue=0)
mycheckbutton1.pack()
mycheckbutton2 = tk.Checkbutton(root, text='banana',
variable=var2,
onvalue=1, offvalue=0)
mycheckbutton2.pack()
mycheckbutton3 = tk.Checkbutton(root, text='orange',
variable=var3,
onvalue=1, offvalue=0)
mycheckbutton3.pack()

var2.set(1)

root.mainloop()

例如 var2.set(1) 就是勾選 mycheckbutton2,

tkinter Checkbutton 綁定事件

這邊介紹 tkinter Checkbutton 綁定事件函式,你可以將不同的 Checkbutton 分別綁訂不同的事件處理函式,你也可以將不同的 Checkbutton 全部綁訂同一個事件處理函式,如下例所示,在 checkbutton_event() 處理函式裡透過用 IntVar.get() 去取得該 Checkbutton 的勾選狀態,勾選的話會得到 1,沒勾選的話會得到 0,這是當初在建立 tk.Checkbutton 所設定的 onvalueoffvalue 屬性的值,

python3-checkbutton4.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

def checkbutton_event():
print('checkbutton_event: ' + str(var1.get()) + ' '
+ str(var2.get()) + ' ' + str(var3.get()))

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

var1 = tk.IntVar()
var2 = tk.IntVar()
var3 = tk.IntVar()

mycheckbutton1 = tk.Checkbutton(root, text='apple',
variable=var1,
onvalue=1, offvalue=0,
command=checkbutton_event)
mycheckbutton1.pack()
mycheckbutton2 = tk.Checkbutton(root, text='banana',
variable=var2,
onvalue=1, offvalue=0,
command=checkbutton_event)
mycheckbutton2.pack()
mycheckbutton3 = tk.Checkbutton(root, text='orange',
variable=var3,
onvalue=1, offvalue=0,
command=checkbutton_event)
mycheckbutton3.pack()

var1.set(1)

root.mainloop()

程式啟動後,取消勾選 apple,之後又勾選了 banana、orange、apple,程式輸出如下,

1
2
3
4
checkbutton_event: 0 0 0
checkbutton_event: 0 1 0
checkbutton_event: 0 1 1
checkbutton_event: 1 1 1

結果圖如下,

在事件處理函式裡除了了解如何取得 Checkbutton 有無勾選外,有時也想要取得該 Checkbutton 顯示的文字,如下例所示,在 Checkbutton 綁訂事件函式時使用 lambda 運算式,將原本的 Checkbutton 變數傳遞進去,這樣我們在事件處理函式裡就可以取得該 Checkbutton 的 text 屬性了,

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

def checkbutton_event(widget):
print('checkbutton_event: ' + widget['text'])

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

var1 = tk.IntVar()
var2 = tk.IntVar()
var3 = tk.IntVar()

mycheckbutton1 = tk.Checkbutton(root, text='apple',
variable=var1,
onvalue=1, offvalue=0,
command=lambda: checkbutton_event(mycheckbutton1))
mycheckbutton1.pack()
mycheckbutton2 = tk.Checkbutton(root, text='banana',
variable=var2,
onvalue=1, offvalue=0,
command=lambda: checkbutton_event(mycheckbutton2))
mycheckbutton2.pack()
mycheckbutton3 = tk.Checkbutton(root, text='orange',
variable=var3,
onvalue=1, offvalue=0,
command=lambda: checkbutton_event(mycheckbutton3))
mycheckbutton3.pack()

var1.set(1)

root.mainloop()

結果圖如下,

程式輸出如下,

1
checkbutton_event: banana

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

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

Python 求最小值的 3 個方法

本篇 ShengYu 介紹 Python 求最小值的 3 個方法,Python 求最小值可使用內建 min 函式,Python min 函式可以求兩數最小值以外,Python min 函式也可以拿來計算 list 多組數字的最小值,最後也會順便介紹 Python numpy 的 argmin 函式來求最小值,

以下的 Python 求最小值的 3 個方法將分為這幾種,

  • Python 兩數求最小值的方法
  • Python list 求最小值的方法
  • Python numpy 求最小值的方法

Python 兩數求最小值的方法

以下為 Python 兩數中求最小值的方法,要自己寫一個 min 函式也不是不行,只是如果想快速開發的話,使用 Python 內建提供的 min() 函式會方便快速些,

python3-min-1.py
1
2
3
4
5
6
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

print(min(2, 4))
print(min(9, 5))
print(min(14.6, 16.1))

Python min 輸出結果如下,

1
2
3
2
5
14.6

Python list 求最小值的方法

這邊介紹 Python list 求最小值的方法,同時耶適用於三數求最小值,或者更多組數字以上求最小值,
python 內建提供的 min() 函式可以支援 list 作為輸入,所以這邊很快速地沿用上個範例的經驗,直接將 python 內建 min() 函式拿來用,

python3-min-2.py
1
2
3
4
5
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

mylist = [3,1,-7,4,0,2]
print(min(mylist))

Python min 輸出結果如下,

1
-7

或者是自己用 for 迴圈自己寫一個求最小值的函式,

python3-min-3.py
1
2
3
4
5
6
7
8
9
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

mylist = [3,1,-7,4,0,2]
min_val = mylist[0]
for i in range(len(mylist)):
if mylist[i] < min_val:
min_val = mylist[i]
print(min_val)

輸出結果同上,

Python numpy 求最小值的方法

這邊介紹 Python numpy 求最小值的方法,numpy 有個 numpy.argmin() 函式可以求最小值的索引值,所以要得到最小值的話就可以藉由最小值的索引值去取得,如下範例程式,

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

arr = np.array([3,1,-7,4,0,2])
print(arr)

min_index = np.argmin(arr)
print(min_index)

min_value = arr[min_index]
print(min_value)

numpy argmin 輸出結果如下,

1
2
3
[ 3  1 -7  4  0  2]
2
-7

以上就是 Python 求最小值的 3 個方法的介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

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

Python floor 向下取整用法與範例

本篇 ShengYu 介紹 Python floor 向下取整用法與範例,Python floor 也是無條件捨去的意思,Python 使用 math.floor() 前要 import math

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

  • Python math.floor() 基本範例
  • Python math.floor() 負數範例

那我們開始吧!

Python math.floor() 基本範例

這邊介紹 Python math.floor() 無條件捨去或者向下取整的用法,在 math.floor() 傳入任何一個浮點數,都會回傳無條件捨去的結果,例如傳入 3.2 會回傳 3,傳入 31.1 會回傳 31。

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

n1 = 3.2
n2 = 3.4
n3 = 3.6
n4 = 3.8
print(math.floor(n1))
print(math.floor(n2))
print(math.floor(n3))
print(math.floor(n4))

結果輸出如下,

1
2
3
4
3
3
3
3

math.floor() 如果傳入 3.0 會回傳多少呢?答案是 3。

Python math.floor() 負數範例

這邊示範 Python math.floor() 負數的範例,

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

n1 = -31.2
n2 = -31.4
n3 = -31.6
n4 = -31.8
print(math.floor(n1))
print(math.floor(n2))
print(math.floor(n3))
print(math.floor(n4))

Python floor 負數結果輸出如下,

1
2
3
4
-32
-32
-32
-32

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

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

Python tkinter Radiobutton 單選框用法與範例

本篇 ShengYu 介紹 Python tkinter Radiobutton 單選框用法與範例,Radiobutton 可以作一些多選項擇一的選取功能,例如性別選取、葷素食選取等等。

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

  • tkinter Radiobutton 基本用法
  • tkinter Radiobutton 多組選取
  • tkinter 設定 Radiobutton 選取選項或取消選取選項
  • tkinter Radiobutton 綁定事件

那我們開始吧!

tkinter Radiobutton 基本用法

這邊介紹 tkinter 建立 Radiobutton 的基本用法,Radiobutton 基本上也是個按鈕,在建構 Radiobutton 時帶入顯示的文字,多個 Radiobutton 在同一個父類視窗下是互斥的,也就是在同一個父類視窗下的多個 Radiobutton 只能一個選取一個,如果選取另一個 Radiobutton 的話,先前選取的 Radiobutton 則會被取消,Radiobutton 搭配 variable 屬性使用的話則可以實做出多群組 Radiobutton 的互斥選取,稍後會介紹到。

以下示範三個 Radiobutton 的建立以及使用 select() 來選取預設選項,

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

myradiobutton1 = tk.Radiobutton(root, text='apple', value=1)
myradiobutton1.select()
myradiobutton1.pack()
myradiobutton2 = tk.Radiobutton(root, text='banana', value=2)
myradiobutton2.pack()
myradiobutton3 = tk.Radiobutton(root, text='orange', value=3)
myradiobutton3.pack()

root.mainloop()

結果圖如下,所以實際操作時可以發現同一群裡的 Radiobutton 單選框是互斥的,只能選擇其中一個 Radiobutton,

那如果想要實作 Radiobutton 多組選取呢?在下節範例馬上為你介紹。

tkinter Radiobutton 多組選取

tkinter 如果想要做出 Radiobutton 多組選取要怎麼實作呢?

這時候可以使用 tk.Radiobuttonvariablevar 屬性,這邊示範兩群組 Radiobutton 選取,將二個群組 Radiobutton 的 variable 屬性各設定成二個 tk.StringVar,這邊我們建立二個 tk.StringVar 分別為 var1 跟 var2,把 myradiobutton1 ~ myradiobutton3 設定成 variable=var1,把 myradiobutton4 ~ myradiobutton6 設定成 variable=var2,同時也把 layout 改成 grid,左邊為第一群,右邊為第二群,方便示範說明,

python3-radiobutton2.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
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk
root = tk.Tk()
root.title('my window')
root.geometry('200x150')

var1 = tk.StringVar()
var2 = tk.StringVar()
var1.set(1)
var2.set(5)

myradiobutton1 = tk.Radiobutton(root, text='apple',
var=var1, value=1)
myradiobutton1.grid(column=0, row=0)
myradiobutton2 = tk.Radiobutton(root, text='banana',
var=var1, value=2)
myradiobutton2.grid(column=0, row=1)
myradiobutton3 = tk.Radiobutton(root, text='orange',
var=var1, value=3)
myradiobutton3.grid(column=0, row=2)

myradiobutton4 = tk.Radiobutton(root, text='lemon',
var=var2, value=4)
myradiobutton4.grid(column=1, row=0)
myradiobutton5 = tk.Radiobutton(root, text='strawberry',
var=var2, value=5)
myradiobutton5.grid(column=1, row=1)
myradiobutton6 = tk.Radiobutton(root, text='tomato',
var=var2, value=6)
myradiobutton6.grid(column=1, row=2)

root.mainloop()

程式啟動後,選取了 apple 與 strawberry,結果圖如下,第一群跟第二群的選取是互相不影響的,

這樣就學會 tkinter Radiobutton 多組選取了

tkinter 設定 Radiobutton 選取選項或取消選取選項

這邊介紹 tkinter 設定 Radiobutton 選取選項或取消選取選項的方法,也可以用來設定 Radiobutton 預設的選項,建立 Radiobutton 後預設是不勾選的狀態,tkinter 有兩種方式可以改變這個狀態,
第一種方法是使用 Radiobutton.select() 函式,Radiobutton.select() 就是選擇當前的 Radiobutton,原本同組的 Radiobutton 的選取會被取消,也可以使用來 Radiobutton.deselect() 取消選擇,範例如下,

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

myradiobutton1 = tk.Radiobutton(root, text='apple', value=1)
myradiobutton1.pack()
myradiobutton2 = tk.Radiobutton(root, text='banana', value=2)
myradiobutton2.pack()
myradiobutton3 = tk.Radiobutton(root, text='orange', value=3)
myradiobutton3.pack()

myradiobutton1.deselect()
myradiobutton2.select()

root.mainloop()

上述範例最後會看到被 myradiobutton2 選取,myradiobutton1 則是不會被選取,如下圖所示,

第二種方法是在建立 tk.Radiobutton 時設定 variablevar 屬性,如下例中的 var,使用 StringVar.set() 設定數值,然後 var 變數的數值決定選取哪個選項,範例如下,

python3-radiobutton4.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
root = tk.Tk()
root.title('my window')
root.geometry('200x150')

var = tk.StringVar()

myradiobutton1 = tk.Radiobutton(root, text='apple',
variable=var, value=1)
myradiobutton1.pack()
myradiobutton2 = tk.Radiobutton(root, text='banana',
variable=var, value=2)
myradiobutton2.pack()
myradiobutton3 = tk.Radiobutton(root, text='orange',
variable=var, value=3)
myradiobutton3.pack()

var.set(3)

root.mainloop()

上述範例使用 var.set(3) 就是選取 myradiobutton3,如下圖所示,

tkinter Radiobutton 綁定事件

這邊介紹 tkinter Radiobutton 如何綁定事件,這邊我們將第一群 Radiobutton 連結至 radiobutton_event(),第二群 Radiobutton 連結至 radiobutton_event2(),然後一個 Button 的事件連結至 button_event(),當每個群的 Radiobutton 被選取時就會在事件函式裡去紀錄當時選擇的水果名稱,最後按下 Button 時會印出這兩群的選取各是什麼水果,範例如下,

python3-radiobutton5.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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk


def radiobutton_event(widget):
print('radiobutton_event: ' + var1.get() + ' checked')
global fruit1
fruit1 = widget['text']


def radiobutton_event2(widget):
print('radiobutton_event2: ' + var2.get() + ' checked')
global fruit2
fruit2 = widget['text']


def button_event():
print(var1.get() + ' + ' + var2.get())
print(fruit1 + ' + ' + fruit2)

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

fruit1 = ''
fruit2 = ''
var1 = tk.StringVar()
var2 = tk.StringVar()

myradiobutton1 = tk.Radiobutton(root, text='apple',
variable=var1, value=1,
command=lambda: radiobutton_event(myradiobutton1))
myradiobutton1.grid(column=0, row=0)
myradiobutton2 = tk.Radiobutton(root, text='banana',
variable=var1, value=2,
command=lambda: radiobutton_event(myradiobutton2))
myradiobutton2.grid(column=0, row=1)
myradiobutton3 = tk.Radiobutton(root, text='orange',
variable=var1, value=3,
command=lambda: radiobutton_event(myradiobutton3))
myradiobutton3.grid(column=0, row=2)

myradiobutton4 = tk.Radiobutton(root, text='lemon',
variable=var2, value=4,
command=lambda: radiobutton_event2(myradiobutton4))
myradiobutton4.grid(column=1, row=0)
myradiobutton5 = tk.Radiobutton(root, text='strawberry',
variable=var2, value=5,
command=lambda: radiobutton_event2(myradiobutton5))
myradiobutton5.grid(column=1, row=1)
myradiobutton6 = tk.Radiobutton(root, text='tomato',
variable=var2, value=6,
command=lambda: radiobutton_event2(myradiobutton6))
myradiobutton6.grid(column=1, row=2)

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

var1.set(1)
var2.set(4)

root.mainloop()

結果圖如下,

程式輸出如下,

1
2
3
4
radiobutton_event: 2 checked
radiobutton_event2: 6 checked
2 + 6
banana + tomato

在這範例中我們已經學習到在事件函式裡如何取得 Radiobutton 設定的值 (value) 以及取得 Radiobutton 設定的文字 (text),

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

其它參考
python - Event triggered by Listbox and Radiobutton in Tkinter - Stack Overflow
https://stackoverflow.com/questions/26333769/event-triggered-by-listbox-and-radiobutton-in-tkinter

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

C++ std::ceil 無條件進位用法與範例

本篇 ShengYu 介紹 C++ 的 std::ceil 用法與範例,C++ std::ceil() 是用來無條件進位或者也可以說向上取整的函式。

以下的 C++ std::ceil 用法與範例將分為這幾部分,

  • C++ std::ceil 基本用法
  • C++ std::ceil 負數範例
  • C ceil 用法

那我們開始吧!

C++ std::ceil 基本用法

這邊介紹 C++ std::ceil 無條件進位或者向上取整的用法,使用前要引用 <cmath> 標頭檔,在 std::ceil() 傳入任何一個浮點數,都會回傳無條件進位的結果,例如:std::ceil() 傳入 2.2 會回傳 3,std::ceil() 傳入 4.1 會回傳 5。

std-ceil.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
// g++ std-ceil.cpp -o a.out
#include <iostream>
#include <cmath>

using namespace std;

int main() {
cout << std::ceil(2.2) << "\n";
cout << std::ceil(2.4) << "\n";
cout << std::ceil(2.6) << "\n";
cout << std::ceil(2.8) << "\n";
return 0;
}

C++ std::ceil() 結果輸出如下,

1
2
3
4
3
3
3
3

那 C++ std::ceil() 如果傳入 2.0 會回傳多少呢?答案是 2。

如果使用 float 或 double 變數帶入 std::ceil() 的範例如下,

std-ceil2.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// g++ std-ceil2.cpp -o a.out
#include <iostream>
#include <cmath>

using namespace std;

int main() {
float f = 4.5f;
cout << std::ceil(f) << "\n";

double d = 4.5;
cout << std::ceil(d) << "\n";
return 0;
}

C++ std::ceil() 結果輸出如下,

1
2
5
5

C++ std::ceil 負數範例

這邊介紹 C++ std::ceil 負數範例,

std-ceil3.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
// g++ std-ceil3.cpp -o a.out
#include <iostream>
#include <cmath>

using namespace std;

int main() {
cout << std::ceil(-22.2) << "\n";
cout << std::ceil(-22.4) << "\n";
cout << std::ceil(-22.6) << "\n";
cout << std::ceil(-22.8) << "\n";
return 0;
}

C++ std::ceil() 負數結果輸出如下,

1
2
3
4
-22
-22
-22
-22

C ceil 用法

在 C 語言中也有 ceil 函式可以使用,使用前要引用 <math.h> 標頭檔,使用方法如下,ceil() 可以傳入 double 也可以傳入 float,

cpp-ceil.cpp
1
2
3
4
5
6
7
8
9
10
11
// g++ cpp-ceil.cpp -o a.out
#include <stdio.h>
#include <math.h>

int main() {
printf("%f\n", ceil(2.2));
printf("%f\n", ceil(2.4));
printf("%f\n", ceil(2.6f));
printf("%f\n", ceil(2.8f));
return 0;
}

ceil 輸出結果如下,

1
2
3
4
3.000000
3.000000
3.000000
3.000000

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

其它相關文章推薦
C/C++ 新手入門教學懶人包

Python tkinter Listbox 用法與範例

本篇 ShengYu 介紹 Python tkinter Listbox 列表框用法與範例,Listbox 列表框是可以顯示一些選項的 UI Widget,這些選項可以讓使用者單選的方式選取也可以複選的方式選取。

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

  • tkinter Listbox 基本用法
  • tkinter Listbox 新增/插入選項
  • tkinter Listbox 刪除選項
  • tkinter Listbox 單選與複選模式
  • tkinter 取得目前 Listbox 的選項
  • tkinter Listbox 綁定事件

那我們開始吧!

tkinter Listbox 基本用法

這邊示範 tkinter Listbox 基本用法,建立一個基本的 Listbox 後,我們就來新增 Listbox 裡的選項,這邊是使用 Listbox.insert() 來插入選項,tk.END 是指向尾端插入,要向頭端插入的話就改成 0,

python3-listbox.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

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

mylistbox = tk.Listbox(root)
mylistbox.insert(tk.END, 'apple')
mylistbox.insert(tk.END, 'banana')
mylistbox.insert(tk.END, 'orange')
mylistbox.insert(tk.END, 'lemon')
mylistbox.insert(tk.END, 'tomato')
mylistbox.pack()

root.mainloop()

結果圖如下,

tkinter Listbox 新增/插入選項

上述範例已經介紹了 tkinter Listbox 基本用法以及插入選項的用法了,插入選項除了上述範例的寫法外,你也可以在 Listbox.insert() 裡一次把要插入的選項都放進去,像這樣寫,

1
2
3
mylistbox = tk.Listbox(root)
mylistbox.insert(tk.END, 'apple','banana','orange','lemon','tomato')
mylistbox.pack()

如果要從 list 裡來初始化的話,可以搭配 for 迴圈來 insert 像這樣寫,

1
2
3
4
5
mylistbox = tk.Listbox(root)
mylist = ['apple','banana','orange','lemon','tomato']
for i in mylist:
mylistbox.insert(tk.END, i)
mylistbox.pack()

要按下按鈕就新增/插入一個選項的話,可以在按鈕事件裡寫 Listbox.insert() 要插入什麼選項,這邊示範按下按鈕就插入一個 1-100 隨機的數字,

python3-listbox2.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
from random import randint

def button_event():
mylistbox.insert(tk.END, str(randint(1, 100)))

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

mylistbox = tk.Listbox(root)
mylistbox.insert(tk.END, 'hello world')
mylistbox.pack()
tk.Button(root, text='insert', command=button_event).pack()

root.mainloop()

結果圖如下,

tkinter Listbox 插入元素時預設不會自動滾到底,如果想要 Listbox 插入元素自動滾動到底的話需要搭配 Scrollbar,這部份以後有機會再來作介紹。

tkinter Listbox 刪除選項

tkinter Listbox 要刪除選項的話是使用 Listbox.delete() 函式,在 Listbox.delete() 函式裡放入要刪除選項的索引值,以下示範按下按鈕時如果 Listbox 裡還有選項就刪除第一個選項,

python3-listbox3.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

def button_event():
if mylistbox.size() > 0:
mylistbox.delete(0)

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

mylistbox = tk.Listbox(root)
for i in ['apple','banana','orange','lemon','tomato']:
mylistbox.insert(tk.END, i)
mylistbox.pack()
tk.Button(root, text='delete', command=button_event).pack()

root.mainloop()

如果要刪除使用者選取的選項時,可以透過 Listbox.curselection() 函式取得目前 Listbox 的選項再刪除該選項即可,取得目前 Listbox 的選項這部份在後面會介紹到。

tkinter Listbox 單選與複選模式

tkinter Listbox 預設是單選模式,單選模式有兩種,分別為 tk.BROWSEtk.SINGLE,預設是使用 tk.BROWSE,在 selectmode 裡指定 tk.BROWSE 即可,使用下面兩種寫法是一樣的效果,tk.BROWSE 在滑鼠拖曳時會改變單選的選項,

1
2
3
mylistbox = tk.Listbox(root)
# or
mylistbox = tk.Listbox(root, selectmode=tk.BROWSE)

tkinter Listbox 另一種單選模式 tk.SINGLE 是滑鼠拖曳時會不會改變單選選項,

1
mylistbox = tk.Listbox(root, selectmode=tk.SINGLE)

tkinter Listbox 複選的話有兩種,一種是滑鼠單擊選項就會複選,這種為 tk.MULTIPLE,寫法如下,

1
mylistbox = tk.Listbox(root, selectmode=tk.MULTIPLE)

tkinter Listbox 另一種複選模式是滑鼠單擊選項是單選,滑鼠拖曳選項才會是複選,這種為 tk.EXTENDED,這也是我們比較熟悉的複選模式,寫法如下,

1
mylistbox = tk.Listbox(root, selectmode=tk.EXTENDED)

tkinter 取得目前 Listbox 的選項

tkinter 要取得目前 Listbox 的選項的話,可以用 Listbox.curselection() 函式來取得使用者目前在 Listbox 中選擇的選項索引值 index,而 Listbox.curselection() 回傳的變數型態是 tuple,例如:如果選擇了第一個選項會得到 (0,),選擇了第二個選項會得到 (1,),依此類推,如果都沒有選擇的話會得到一個空的 tuple (),以下範例是按下按鈕時印出 Listbox 目前的選項,

python3-listbox4.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

def button_event():
# print(type(mylistbox.curselection()))
print(mylistbox.curselection())

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

mylistbox = tk.Listbox(root)
for i in ['apple','banana','orange','lemon','tomato']:
mylistbox.insert(tk.END, i)
mylistbox.pack()
tk.Button(root, text='get current selection', command=button_event).pack()

root.mainloop()

輸出結果如下,

1
(2,)

結果圖如下,

Listbox 如果是複選的話 Listbox.curselection() 會回傳複選的 tuple,例如:如果選擇了第一個選項跟第二個選項會得到 (0, 1),如果選擇了第一個選項跟第三個選項跟第五個選項會得到 (0, 2, 4),以此類推,這也就是 Listbox.curselection() 為什麼回傳的變數型態是 tuple 的原因,複選模式在建立 Listbox 時就可以指定 selectmode=tk.EXTENDEDselectmode=tk.MULTIPLE 選項,

python3-listbox5.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

def button_event():
# print(type(mylistbox.curselection()))
print(mylistbox.curselection())

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

mylistbox = tk.Listbox(root, selectmode=tk.EXTENDED)
for i in ['apple','banana','orange','lemon','tomato']:
mylistbox.insert(tk.END, i)
mylistbox.pack()
tk.Button(root, text='get current selection', command=button_event).pack()

root.mainloop()

輸出結果如下,

1
(0, 2, 4)

結果圖如下,

tkinter Listbox 如果要取得選項的文字的話,可以使用 Listbox.get(index) 帶入索引值,例如:Listbox.get(0) 是取得 Listbox 第一個選項文字,如果 Listbox.get() 不帶入任何索引值的話就會取得所有選項的文字列表 list,以下範例示範按下按鈕取得 Listbox 目前所有複選選項的文字並印出來,

python3-listbox6.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

def button_event():
# print(type(mylistbox.curselection()))
print(mylistbox.curselection())
for i in mylistbox.curselection():
print(mylistbox.get(i))

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

mylistbox = tk.Listbox(root, selectmode=tk.EXTENDED)
for i in ['apple','banana','orange','lemon','tomato']:
mylistbox.insert(tk.END, i)
mylistbox.pack()
tk.Button(root, text='get current selection', command=button_event).pack()

root.mainloop()

tkinter Listbox 綁定事件

如果希望 tkinter Listbox 改變選擇選項時獲得通知的話就需要 Listbox 綁定事件,使用 Listbox.bind() 設定 <<ListboxSelect>> 事件對應的事件處理函式即可,如下範例中的 listbox_event() 函式,當改變 Listbox 選項時就可以在 listbox_event() 函式裡取得事件的 widget 也就是 Listbox,再將該選項的文字設定到 Label 上,完整範例如下,

python3-listbox7.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 listbox_event(event):
object = event.widget
# print(type(object.curselection()))
print(object.curselection())
index = object.curselection()
mylabel.configure(text=object.get(index))

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

mylabel = tk.Label(root)
mylabel.pack()

mylistbox = tk.Listbox(root)
for i in ['apple','banana','orange','lemon','tomato']:
mylistbox.insert(tk.END, i)
mylistbox.bind("<<ListboxSelect>>", listbox_event)
mylistbox.pack()

root.mainloop()

結果圖如下,

listbox_event() 裡不從 event.widget 裡取得 Listbox 的話,直接改用我們例子中的 mylistbox 來操作也是可以的,如下範例所示,

1
2
3
4
def listbox_event(event):
print(mylistbox.curselection())
index = mylistbox.curselection()
mylabel.configure(text=mylistbox.get(index))

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

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

Python base64 編碼用法與範例

本篇 ShengYu 介紹 Python base64 編碼用法與範例,

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

  • Python base64 encode 編碼用法
  • Python base64 decode 解碼用法
  • 為什麼 python base64 跟 linux base64 的結果輸出不一樣?

那我們開始吧!

Python base64 encode 編碼用法

Python base64 編碼要使用 base64.b64encode()base64.b64encode() 是傳入 bytes object,所以輸入是字串的話會需要先透過 encode('UTF-8') 轉成 bytes object,base64.b64encode() 回傳的結果是 bytes object,範例如下,

1
2
3
4
5
6
7
8
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import base64

s = 'Hello World'
b = s.encode('UTF-8')
bytes_encode = base64.b64encode(b)
print(bytes_encode)

Python base64 編碼後輸出如下,

1
b'SGVsbG8gV29ybGQ='

上述範例你也可以簡化成這樣寫,

1
print(base64.b64encode('Hello World'.encode('UTF-8')))

如果資料來源已經是 bytes object 不是 str,就可以直接傳入 base64.b64encode() 使用,

1
print(base64.b64encode(b'Hello World'))

編碼後輸出同上。

如果要將編碼後的 b'SGVsbG8gV29ybGQ=' byte 轉換成 ASCII 字串的話可以用 decode('UTF-8') 像這樣寫,

1
print(bytes_encode.decode('UTF-8'))

將 byte 轉換成 ASCII 字串的輸出結果如下,

1
SGVsbG8gV29ybGQ=

Python base64 decode 解碼用法

Python base64 解碼的話要使用 base64.b64decode()base64.b64decode() 可以傳入 bytes object 也可以傳入 ASCII string,回傳的結果都是 bytes object,所以會需要透過 decode('UTF-8') 轉成字串,這邊我們將上述範例編碼後的輸出當成本範例的輸入,範例如下,

1
2
3
4
5
6
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import base64

print(base64.b64decode(b'SGVsbG8gV29ybGQK').decode('UTF-8'))
print(base64.b64decode('SGVsbG8gV29ybGQK').decode('UTF-8'))

Python base64 解碼後輸出如下,

1
Hello World

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

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

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

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