Python GUI教程(十):創建一個複雜的GUI

文章首發:Python GUI教程(十):創建一個複雜的GUI

本篇將會涉及:

  • 構建一個更加複製的GUI
  • 在選項卡部件中應用多個層級
  • 添加一個樹部件和一個日曆部件
  • 使用一個刻度盤部件來控制一個LCD顯示器部件上的數字
  • 連接刻度盤部件和LCD部件到一個單選按鈕上
  • 使用一個單選按鈕來更新進度欄部件

延續上一篇的解耦思想,我們使用Qt設計師創建一個基本的包含各個部件的圖形窗口,再在邏輯代碼中對圖形窗口進行調用和操作。

創建一個複雜的GUI

我們使用Qt設計師創建一個稍顯複雜的GUI。其中包括:

  • 兩個選項卡TabWidgets
  • 兩個子選項卡TabWidgets
  • 一個日期部件DateEdit
  • 一個日曆部件CalendarWidget
  • 一個樹形部件TreeWidget
  • 一個組盒子GroupBox
  • 三個單選按鈕RadioButton
  • 一個字體選擇盒子FontComboBox
  • 一個Lable標籤
  • 一個進度條progressBar
  • 一個刻度盤Dial
  • 一個LCD數據顯示器LcdNumber

所有的步驟通過Qt設計師的拖拽就可以完成。

創建主選項卡

新建一個主窗口,拖拽TabWidget部件到主窗口中:

在選項卡1中創建一個子選項卡

繼續使用TabWidget部件,在選項卡1中創建一個子選項卡:

在子選項卡1中添加一個樹部件

我們繼續使用TreeWidget部件,在剛剛創建的子選項卡1中創建一個樹,並添加一些信息:

在子選項卡2中添加日期和日曆部件

現在切換到子選項卡2中,我們使用DateEdit部件和CalendarWidget部件,在子選項卡2中添加一個日期修改框和一個日曆框,採用垂直布局:

在選項卡2中添加按鈕組

選項卡1已經構建好了,現在切換到選項卡2。

我們先使用GroupBox部件在創建一個組部件,然後在其中添加三個PushButton部件:

在選項卡2中添加刻度和LCD部件

我們再在選項卡2中添加一個刻度盤和LCD顯示器,放置在一個組部件中:

在選項卡2中添加一個字體選擇器

接著,使用FontComboBox部件和Label部件,在選項卡2中添加一個字體選擇器和文本顯示:

在選項卡2中添加一個進度欄

最後,我們使用ProcessBar部件在選項卡2中添加一個進度欄:

這樣就完成了整個GUI的圖形界面設計。

接下來,我們創建信號/槽來實現GUI的事件響應。

構建信號/槽

轉換UI文件為Python文件

我們首先轉換設計好的UI文件為Python文件,按照之前的解耦思想,將界面代碼與邏輯代碼分離。

轉換UI文件後,新建一個Python文件,引入轉換為Python代碼的GUI窗口:

# coding:utf-8nnfrom PyQt5 import QtCore,QtWidgets,QtGuinfrom GUI import complexnnif __name__ == "__main__":n import sysn app = QtWidgets.QApplication(sys.argv)n MainWindow = QtWidgets.QMainWindow()n ui = complex.Ui_MainWindow()n ui.setupUi(MainWindow)n MainWindow.show()n sys.exit(app.exec_())n

運行一下,看是否正常:

新建一個邏輯類

為了便於操作,我們創建一個新類MainWindow,將程序的主循環放入其中,其餘的邏輯功能以類的方法的方式添加:

# coding:utf-8n# 州的先生 zmister.com Python GUI教程nnfrom PyQt5 import QtCore,QtWidgets,QtGuinfrom GUI import complexnimport sysnnclass MainWindow(object):n def __init__(self):n app = QtWidgets.QApplication(sys.argv)n MainWindow = QtWidgets.QMainWindow()n ui = complex.Ui_MainWindow()n ui.setupUi(MainWindow)n MainWindow.show()n sys.exit(app.exec_())nnif __name__ == "__main__":n MainWindow()n

實現日曆選擇同步到日期選擇器

我們在選項卡1的子選項卡2中構建了一個日期修改器和一個日曆。

我們需要在日曆上對日期進行點擊的時候,日期修改器上同步顯示我們選擇的日期。

我們在MainWindow()類中,新建一個update_date()方法,用於設置日期修改器的數值:

def update_date(self):n self.ui.dateEdit.setDate(self.ui.calendarWidget.selectedDate()) n

再新建一個update_calendar()方法,用於設置點擊日曆的信號/槽,將其響應到日期修改器上:

def update_calendar(self):n self.ui.calendarWidget.selectionChanged.connect(self.update_date)n

完整的代碼如下:

# coding:utf-8n# 州的先生 zmister.com Python GUI教程nnfrom PyQt5 import QtCore,QtWidgets,QtGuinfrom GUI import complexnimport sysnnclass MainWindow(object):n def __init__(self):n app = QtWidgets.QApplication(sys.argv)n MainWindow = QtWidgets.QMainWindow()n self.ui = complex.Ui_MainWindow()n self.ui.setupUi(MainWindow)n self.update_date()n self.update_calendar()n MainWindow.show()n sys.exit(app.exec_())nn # 修改日期修改器數值n def update_date(self):n self.ui.dateEdit.setDate(self.ui.calendarWidget.selectedDate())nn # 日曆信號槽n def update_calendar(self):n self.ui.calendarWidget.selectionChanged.connect(self.update_date)nnif __name__ == "__main__":n MainWindow()n

這樣,我們點擊了日曆上的一個日期,日期修改器上就會顯示我們點擊日期。

實現LCD顯示器數字跟隨刻度盤變化

我們在組合子部件中放置了一個Dial刻度盤和LCDNumber顯示器。

我們可以設置LCD顯示器上的數字跟隨著刻度盤的變化而變化。

同樣是創建兩個方法:

# 設置LCD數字ndef set_lcd(self):n self.ui.lcdNumber.display(self.ui.dial.value())nn# 刻度盤信號槽ndef set_dial(self):n self.ui.dial.valueChanged[int].connect(self.set_lcd)n

一個用來設置LCD顯示器的數字,一個用來響應刻度盤的信號。

實現按鈕控制進度欄

我們在選項卡2中放置了3個單選按鈕,和一個進度條,現在我們讓單選按鈕來控制進度欄的進度。其中,第一個按鈕是默認選項,第二個按鈕用來重置清零進度欄,第三個按鈕用來根據LCD上的數字來更新。

設置第二個按鈕清零進度欄,新建一個方法:

def zero_process(self):n self.ui.radioButton_2.clicked.connect(self.ui.progressBar.reset)n n

設置第三個按鈕的功能,新建兩個方法:

# 更新進度欄ndef update_process(self):n value = self.ui.lcdNumber.value()n self.ui.progressBar.setValue(value)nn # 點擊按鈕3ndef click_radio3(self):n self.ui.radioButton_3.clicked.connect(self.update_process)n n

更新字體選擇

我們還在選項卡2中放置了一個字體選擇部件和一個label標籤部件,我們可以設置選擇了某個字體,就顯示在label標籤上。

def set_font(self): n self.ui.fontComboBox.activated[QString].connect(self.ui.label.setText)n n

這樣,一個稍顯複雜的GUI就完成了。


推薦閱讀:

TAG:Python | 编程 | GUI设计 |