Python作為一門易學易用的語言,因其開放性、可擴展性等特點而備受歡迎。在Python的應用領域中,GUI編程也越來越被人們所關注。藉助於Python的強大生態系統,我們能夠很容易地從中選取合適的庫來進行GUI編程,其中比較流行的庫有Tkinter、PyQt、wxPython等等。本文將從Python GUI編程的背景和歷史、GUI編程的基本框架、以及GUI設計中的常見場景等方面進行講解,以幫助讀者更好地入門Python GUI編程。
一、Tkinter
1、Tkinter的背景和歷史
Tkinter是Python的標準GUI庫之一,是一個用於創建GUI應用程序的工具包。Tkinter工具包是由Tcl/Tk GUI工具包改進而來的,Tcl/Tk是一種流行的跨平台腳本語言,在開源軟體領域有著廣泛的應用和影響。Tkinter提供了很多組件,如標籤、按鈕、滑塊、菜單等等,同時也支持自定義組件,通過繼承Tkinter的Frame類等方式,開發者可以創建自己的複雜組件。
2、Tkinter的基本框架
Tkinter的基本框架是一個主窗口(root), 可以把其他的組件如標籤(Label)、按鈕(Button)、文本框(Entry)等組合在一起。可以理解為Tkinter程序從根節點開始遞歸地生成出控制項樹。在Tkinter中每個控制項都是一個對象,這個對象可以包含其他對象。每個控制項都有自己的事件。Tkinter中所有的控制項都有相應的方法,如綁定事件的方法、刷新組件的方法等。下面是一段Tkinter的代碼:
import tkinter as tk
window = tk.Tk()
window.title("Hello Tkinter")
window.geometry("300x200")
lbl = tk.Label(window, text="This is a label", font=('Arial', 12))
lbl.pack()
btn = tk.Button(window, text="This is a button")
btn.pack()
window.mainloop()
在上面的示例中,我們創建了一個主窗口,並在窗口中添加了一個標籤和一個按鈕。代碼中的window.mainloop()函數是主程序循環,它會一直等待有事件發生並響應用戶的操作。
3、Tkinter的常見場景
在GUI編程中常見的場景與需求有很多,下面我們將結合Tkinter的常見示例和特性進行展開。
1)窗口布局和多窗口切換
使用Tkinter創建窗口之後,需要對窗口中的元素進行布局,可以使用pack、grid以及place等方法。同時,多個窗口之間的切換通常是非常頻繁的,可以通過建立一個父窗口,然後通過按鈕的點擊事件來控制切換不同的子窗口來實現。
下面是一個簡單的窗口切換和布局的示例代碼:
import tkinter as tk
class Application(tk.Tk):
def __init__(self):
super().__init__()
self.title("My Application")
self.menu = tk.Menu(self)
self.menu.add_command(label="Window 1", command=self.show_frame_1)
self.menu.add_command(label="Window 2", command=self.show_frame_2)
self.option_add("*tearOff", False)
self.config(menu=self.menu)
self.frames = {}
for F in (Frame1, Frame2):
frame = F(self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame_1()
def show_frame_1(self):
self.frames[Frame1].tkraise()
def show_frame_2(self):
self.frames[Frame2].tkraise()
class Frame1(tk.Frame):
def __init__(self, master):
super().__init__(master)
self.config(background='white')
tk.Label(self, text="This is Frame 1").pack()
class Frame2(tk.Frame):
def __init__(self, master):
super().__init__(master)
self.config(background='grey')
tk.Label(self, text="This is Frame 2").pack()
app = Application()
app.mainloop()
在上面的示例中,我們創建了一個基本的多窗口布局並實現了窗口的切換。使用menu回調不同的show_frame_x方法,通過self.frames[F]來訪問子窗口的實例並提升到前景實現窗口的切換。
2)組件交互
在GUI編程中,組件交互是一個比較常見的需求,例如當我們在一個文本框中輸入內容時,希望下方的標籤實時顯示文本框中的內容。為了達到這樣的效果,我們可以使用Tkinter的綁定機制,使用bind方法將組件的事件與特定的回調函數綁定,這樣組件事件觸發時便會自動調用相應的回調函數。
下面是一個簡單的組件交互的示例代碼:
import tkinter as tk
class Application(tk.Tk):
def __init__(self):
super().__init__()
self.title("Component Interaction")
self.var = tk.StringVar()
tk.Label(self, text="Enter something: ").pack(pady=10)
entry = tk.Entry(self, textvariable=self.var)
entry.pack(pady=10)
entry.bind('', self.show_var)
tk.Label(self, text="You entered: ").pack(pady=10)
self.lbl = tk.Label(self, text="")
self.lbl.pack()
def show_var(self, event):
self.lbl.config(text=self.var.get())
app = Application()
app.mainloop()
在上面的示例中,我們創建了一個簡單的互動式組件,當用戶在entry中輸入內容時,響應的show_var方法會在label中實時顯示出enter的內容。
二、PyQt
1、PyQt的背景和歷史
PyQt是一個受歡迎的Python GUI編程工具庫,是Python語言的跨平台GUI編程解決方案之一。PyQt是Python的綁定庫,將Qt C++庫綁定到Python的解釋器上,使Python程序員可以使用C++的函數和類庫。
2、PyQt的基本框架
PyQt的基本框架建立在Qt的基礎上,其具有豐富的界面設計特性和GUI的快捷鍵等特色功能。在PyQt中,我們可以使用繼承的方式來自定義組件,還可以通過PyQt的模型/視圖框架,輕鬆地建立使用模型數據來驅動的數據視圖,如列表、表格等等。
下面是一個簡單的PyQt的代碼示例:
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel
class App(QWidget):
def __init__(self):
super().__init__()
self.title = 'PyQt5 - Simple window'
self.left = 10
self.top = 10
self.width = 640
self.height = 480
self.initUI()
def initUI(self):
self.setWindowTitle(self.title)
self.setGeometry(self.left, self.top, self.width, self.height)
label = QLabel(self)
label.setText("Hello World!")
label.move(50,50)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = App()
sys.exit(app.exec_())
在上面的示例中,我們創建了一個簡單的窗口並在窗口中添加了一個標籤。在PyQt中,我們使用QLabel來創建標籤,並通過move方法將標籤放置在窗口中的指定位置。
3、PyQt的常見場景
在PyQt中,靈活的界面設計和數據視圖是其常見的一些功能,下面將著重介紹這些。
1)使用Qt Designer和UI文件來快速創建GUI界面
PyQt中,我們可以使用Qt Designer來創建和設計我們的GUI界面。Qt Designer是Qt的一個可視化工具,我們可以通過可視化界面輕鬆地快速設計出我們需要的GUI界面,拖拽組件實現布局,同時還可以使用Qt Designer的信號和槽工具來管理創建和管理組件的事件。
Qt Designer的另一個常見功能是支持導出UI文件和代碼文件,我們可以直接將UI文件轉換為Python代碼文件或將其與Python代碼進行集成。
下面是一個使用Qt Designer和UI文件快速創建GUI界面的示例代碼:
from PyQt5 import QtWidgets, uic
import sys
class Ui(QtWidgets.QMainWindow):
def __init__(self):
super(Ui, self).__init__()
uic.loadUi('my_gui.ui', self)
self.show()
app = QtWidgets.QApplication(sys.argv)
window = Ui()
app.exec_()
在上面的示例中,「my_gui.ui」是我們使用Qt Designer創建的GUI界面文件,uic.loadUi(‘my_gui.ui’, self) 用於將GUI布局載入到UI上並展示出來。
2)使用QDataWidgetMapper來創建數據視圖
在基於數據的GUI應用中,我們需要使用模型和視圖來在界面中呈現數據。PyQt中,我們可以使用Model / View架構來實現這個目的,主要是通過QAbstractItemModel、QTableView等API來實現。QDataWidgetMapper是Qt的一個組件,它可以將模型數據轉換為視圖,將更改轉換為模型和視圖數據。
下面是一個使用QDataWidgetMapper來創建數據視圖的示例代碼:
from PyQt5.QtGui import QStandardItem, QStandardItemModel
from PyQt5.QtWidgets import QApplication, QWidget, QDataWidgetMapper, \
QPushButton, QVBoxLayout, QHBoxLayout, QLineEdit, QTableView, QLabel
from PyQt5.QtCore import Qt
class MainWindow(QWidget):
def __init__(self, parent=None):
QWidget.__init__(self, parent)
self.resize(600, 400)
self.setWindowTitle('Data mapper example')
# Model
self.model = QStandardItemModel()
# Set Data
for row in range(5):
item1 = QStandardItem('Item %s' % row)
item2 = QStandardItem(str(row))
self.model.setItem(row, 0, item1)
self.model.setItem(row, 1, item2)
# View
self.view = QTableView()
self.view.setModel(self.model)
# Mapper
self.mapper = QDataWidgetMapper(self)
self.mapper.setModel(self.model)
self.mapper.addMapping(self.name_edit, 0)
self.mapper.addMapping(self.value_edit, 1)
# Buttons
button_previous = QPushButton(self)
button_previous.setText("Previous")
button_previous.clicked.connect(self.mapper.toPrevious)
button_next = QPushButton(self)
button_next.setText("Next")
button_next.clicked.connect(self.mapper.toNext)
# Edit views
self.name_edit = QLineEdit()
self.value_edit = QLineEdit()
# QVBoxLayout
vbox = QVBoxLayout()
vbox.addWidget(self.view)
hbox = QHBoxLayout()
hbox.addWidget(QLabel("Name"))
hbox.addWidget(self.name_edit)
hbox2 = QHBoxLayout()
hbox2.addWidget(QLabel("Value"))
hbox2.addWidget(self.value_edit)
vbox.addLayout(hbox)
vbox.addLayout(hbox2)
vbox.addWidget(button_previous)
vbox.addWidget(button_next)
# Set Layout
self.setLayout(vbox)
app = QApplication([])
gui = MainWindow()
gui.show()
app.exec_()
在上面的示例代碼中,我們將模型數據中的數據項映射到相應的視圖組件上,編輯視圖組件子為模型數據提供了自然的入口,同時通過組合多個控制項和QHBoxLayout / QVBoxLayout,實現了一個典型的數據視圖功能。
三、wxPython
1、wxPython的背景和歷史
wxPython是一個Python GUI應用程序開發框架,其中的wxWidgets提供了一個跨平台抽象層,為開發
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/259289.html
微信掃一掃
支付寶掃一掃