PyQt5系列教程(26): 日曆(QCalendarWidget)
上期我們介紹了工具箱的小部件(QToolBox),這期我們將介紹一下日曆(QCalendarWidget)。
總體介紹
QCalendarWidget類提供了一個基日曆小部件,允許用戶選擇一個日期。
該小部件使用當前的月份和年份進行初始化,但是QCalendarWidget提供了幾個公共槽函數來更改顯示的年份和月份。
默認情況下,選擇今天的日期,用戶可以使用滑鼠和鍵盤選擇日期。當前選擇的日期可以使用selectedDate()函數進行檢索。通過設置minimumDate和maximumDate屬性,可以將用戶選擇約束到給定的日期範圍。或者,可以使用setDateRange()函數一次性設置這兩個屬性。將selectionMode屬性設置為NoSelection以禁止用戶選擇。請注意,還可以使用setSelectedDate()可以讓程序選擇日期。
當前顯示的月份和年份可分別使用monthShown()和yearShown()函數進行檢索。
新創建的日曆小部件使用縮短的日期名稱,星期六和星期日都標記為紅色。日曆網格不可見。顯示星期編號,第一個列。日是日曆區域設置的第一天。
通過將horizontalHeaderFormat屬性設置為QCalendarWidget.SingleLetterDayNames,可以將日期的符號更改為單個字母縮寫(「M」代表「Monday」)。將相同的屬性設置為QCalendarWidget.LongDayNames將使標題顯示完整的日期名稱。可以通過將verticalHeaderFormat屬性設置為QCalendarWidget. NoVerticalHeader來刪除周數。日曆網格可以通過使用setGridVisible()函數將gridVisible屬性設置為True來開啟。
calendar = QCalendarWidget(self)calendar.setGridVisible(True)
最後,可以使用setFirstDayOfWeek()函數更改第一列中的日期。
QCalendarWidget類還提供了三個信號,selectionChanged(),activated()和currentPageChanged(),可以響應用戶交互。
通過設置QTextCharFormat的一些特殊的工作日,特殊的日期或頭文件的渲染,可以在很大程度上定製標題,工作日或單日的渲染。
日曆小部件只使用QTextCharFormat中的一部分屬性。目前,使用前景,背景和字體屬性來確定窗口小部件中單個單元格的渲染。
一些QCalendarWidget設置的介紹
QCalendarWidget.HorizontalHeaderFormat
定義了水平頭可以顯示的各種格式。
QCalendarWidget.SelectionMode
描述了提供給用戶在日曆中選擇日期的選擇類型
QCalendarWidget.VerticalHeaderFormat
定義了垂直標題可以顯示的各種格式。
更多詳細的介紹,請見官方文檔:QCalendarWidget Class
類的歸屬
PyQt5->QtWidgets->QCalendarWidget
繼承:QWidget
小例子
我們先通過一個小動畫來看一下今天的完成效果:
要是我們使用eric6運行程序的時候如果出現這樣的情況,請大家選擇同意執行,不是病毒啊!
核心代碼
程序的界面是由Qt設計師完成的,具體的設計大家可以自行去看源碼就知道了,這裡主要把功能介紹一下。
class Dialog_selected(QDialog, Ui_Dialog): """ Class documentation goes here. """ def __init__(self, parent=None): """ Constructor @param parent reference to the parent widget @type QWidget """ super(Dialog_selected, self).__init__(parent) self.setupUi(self) self. appkey = "你的appkey" @pyqtSlot(QDate) def on_calendarWidget_clicked(self, date): """ Slot documentation goes here. @param date DESCRIPTION @type QDate """ date = self.calendarWidget.selectedDate().toString("yyyy-MM-dd dddd") self.request1(self.appkey, date) def request1(self, appkey, date): url = "http://v.juhe.cn/laohuangli/d" params = { "key" : appkey, #應用APPKEY(應用詳細頁查詢) "date" : date #日期,格式2014-09-09 } f = requests.get(url, params=params) content = f.text res = json.loads(content) if res: error_code = res["error_code"] data = res["result"] if error_code == 0: #成功請求 self.label.setText("陽曆:" + date) self.label_2.setText("陰曆:" + data["yinli"]) self.label_3.setText("忌:" + data["ji"]) self.label_4.setText("宜:" + data["yi"]) else: QMessageBox.Warning(self, "警告", "錯誤代碼:" + res["error_code"] + "錯誤原因:" + res["reason"]) else: QMessageBox.Warning(self,"警告","API請求失敗")
這段代碼有一半是有eric6自動生成的。on_calendarWidget_clicked(self, date)的部分和request1(self, appkey, date)是我自己改寫的。主要功能就是我們單擊日曆上的日期然後會出現對應的陽曆、陰曆、忌、宜等黃曆信息。這只是一個示常式序,實現上也比較簡單。
@pyqtSlot(QDate)def on_calendarWidget_clicked(self, date): """ Slot documentation goes here. @param date DESCRIPTION @type QDate """ date = self.calendarWidget.selectedDate().toString("yyyy-MM-dd dddd") self.request1(self.appkey, date)
為什麼要加上@pyqtSlot(QDate)可以參考
學點編程吧:PyQt5番外篇(2-2):沖頂大會語音答題輔助小工具之解析篇——界面搭建理解起來差不多。
date = self.calendarWidget.selectedDate().toString("yyyy-MM-dd dddd")self.request1(self.appkey, date)
- 第一句就是將我們選擇的日期格式轉換成字元串,並將它的格式設置為:2018-02-11 周日。
- 第二句就是調用request1()這個函數,並將appkey和date傳值過去。
def request1(self, appkey, date): url = "http://v.juhe.cn/laohuangli/d" params = { "key" : appkey, #應用APPKEY(應用詳細頁查詢) "date" : date #日期,格式2014-09-09 } f = requests.get(url, params=params) content = f.text res = json.loads(content) if res: error_code = res["error_code"] data = res["result"] if error_code == 0: #成功請求 self.label.setText("陽曆:" + date) self.label_2.setText("陰曆:" + data["yinli"]) self.label_3.setText("忌:" + data["ji"]) self.label_4.setText("宜:" + data["yi"]) else: QMessageBox.Warning(self, "警告", "錯誤代碼:" + res["error_code"] + "錯誤原因:" + res["reason"]) else: QMessageBox.Warning(self,"警告","API請求失敗")
這個就是根據我們選擇的日期得到對應的黃曆信息。那麼這個黃曆信息怎麼來的呢?我不知道!
我確實不知道。但是有人知道啊!
我這裡使用的聚合數據的API:
https://www.juhe.cn/。你們可以註冊之後選擇合適的API進行查詢,同時提供了Python語言的調用方式(我看了一下是Python2的),對於測試而言使用比較方便。但是要經常使用的只能付費了,但是對我們來說夠用了。
url = "http://v.juhe.cn/laohuangli/d"params = { "key" : appkey, #應用APPKEY(應用詳細頁查詢) "date" : date #日期,格式2014-09-09}f = requests.get(url, params=params)content = f.textres = json.loads(content)
這裡我使用requests這個優秀的第三方庫進行HTTP請求,它的返回值是json格式的,我們可以將其轉換成Python的字典。
關於requests庫的使用,網上的教程太多了,請自行百度,這裡不浪費大家時間。
if res: error_code = res["error_code"] data = res["result"] if error_code == 0: #成功請求 self.label.setText("陽曆:" + date) self.label_2.setText("陰曆:" + data["yinli"]) self.label_3.setText("忌:" + data["ji"]) self.label_4.setText("宜:" + data["yi"]) else: QMessageBox.Warning(self, "警告", "錯誤代碼:" + res["error_code"] + "錯誤原因:" + res["reason"])else: QMessageBox.Warning(self,"警告","API請求失敗")
這裡我們根據返回值的情況將其與界面上的4個Label標籤關聯並加以顯示出來。如果遇到問題則彈出相應的對話框加以顯示。
最後
這裡有一個小問題,算是給大家留一個作業吧!
我們開始打開程序的時候是這樣的,什麼陽曆、陰曆、忌、宜這些信息都沒有。
那麼我們如何讓它們一打開程序就能顯示出來呢?歡迎大家留言提出自己的解決方案,或者發郵件給我也行(xdbcb8@qq.com)
ok,今天的介紹暫時就到這裡吧,下期我們再見。如果你喜歡本篇文章,請給我
點贊
讚賞
分享給你的好友們吧!
如果你想要本次教程中的相關源碼,請關注微信公眾號:學點編程吧,發送:pyqt526,會自動得到相應的百度網盤下載鏈接。
推薦閱讀:
※用例1: CVE-2014-6271
※國慶回家避免不了相親,使用python抓取婚戀網妹子決策點快速脫單
※Python網路爬蟲(二)- urllib爬蟲案例
※Python面向對象編程(OOP)
※PyQt5系列教程(14):複選框