PyQt5系列教程(10):老闆,這個打一下

打一下,打一下,列印一下。

上期我們學習了QColorDialog, QFontDialog, QFileDialog這三個對話框。主要是選擇顏色、選擇字體、文件的相關功能。

本期我們淺談列印文件相關的對話框。

在學習列印對話框之前,我們還將上期QFileDialog的部分內容再補充一下,主要涉及打開多個文件,以及保存文件。

本期的完成的效果如下:

要實現上述效果會包含上期的內容,為縮短篇幅,我們只會將涉及本期知識點的代碼放上。具體如下:

#conding=utf-8nnfrom PyQt5.QtWidgets import QWidget, QApplication, QPushButton, QTextEdit, QFileDialog, QDialognfrom PyQt5.QtPrintSupport import QPageSetupDialog, QPrintDialog, QPrinternimport sysnclass Example(QWidget):n def __init__(self):n super().__init__()n self.printer = QPrinter()n self.initUI()nn def initUI(self):nn self.setGeometry(300, 300, 500, 400)n self.setWindowTitle(關注微信公眾號:學點編程吧--保存、列印文件)nnn self.tx = QTextEdit(self)n self.tx.setGeometry(20, 20, 300, 270)nn self.bt1 = QPushButton(打開文件,self)n self.bt1.move(350,20)n self.bt2 = QPushButton(打開多個文件,self)n self.bt2.move(350,70)n self.bt5 = QPushButton(保存文件,self)n self.bt5.move(350,220)n self.bt6 = QPushButton(頁面設置,self)n self.bt6.move(350,270)n self.bt7 = QPushButton(列印文檔,self)n self.bt7.move(350,320)nn self.bt1.clicked.connect(self.openfile)n self.bt2.clicked.connect(self.openfiles)n self.bt5.clicked.connect(self.savefile)n self.bt6.clicked.connect(self.pagesettings)n self.bt7.clicked.connect(self.printdialog)nn self.show()n n def openfile(self):n fname = QFileDialog.getOpenFileName(self, 學點編程吧:打開文件,./)n if fname[0]:n with open(fname[0], r,encoding=gb18030,errors=ignore) as f:n self.tx.setText(f.read())n n def openfiles(self):n fnames = QFileDialog.getOpenFileNames(self, 學點編程吧:打開多個文件,./)n if fnames[0]: n for fname in fnames[0]:n with open(fname, r,encoding=gb18030,errors=ignore) as f:n self.tx.append(f.read())n n def savefile(self):n fileName = QFileDialog.getSaveFileName(self, 學點編程吧:保存文件,./,"Text files (*.txt)")n if fileName[0]:n with open(fileName[0], w,encoding=gb18030,errors=ignore) as f:n f.write(self.tx.toPlainText())n n def pagesettings(self):n printsetdialog = QPageSetupDialog(self.printer,self)n printsetdialog.exec_()n n def printdialog(self):n printdialog = QPrintDialog(self.printer,self)n if QDialog.Accepted == printdialog.exec_():n self.tx.print(self.printer)n nif __name__ == __main__:n app = QApplication(sys.argv)n ex = Example()n sys.exit(app.exec_())n

上述代碼我們可以知曉新增了QPageSetupDialog、QPrintDialog、QPrinter這三個類,它們均在QtPrintSupport模塊中。除了這個三個類還包含其他的類。

QFileDialog新增了getOpenFileNames(),getSaveFileName()這兩個知識點,下面我們慢慢解說。

from PyQt5.QtPrintSupport import QPageSetupDialog, QPrintDialog, QPrintern

從類的字面意思我們也可以了解到QPageSetupDialog涉及頁面設置的,QPrintDialog涉及列印,而QPrinter呢?QPrinter類是PyQt的列印主要使用,即列印類。大量和列印相關的函數均會涉及到該類。

根據Qt的官方文檔的介紹,QPrinter類與其他繪圖類(如QWidget和QPixmap)原理幾乎完全相同。提供了一組附加功能來管理設備的特定功能,例如方向和解析度等。

我個人覺得就是高度抽象的虛擬印表機,通過與這台列印交互達到控制本地實際印表機的功能。

class Example(QWidget):n def __init__(self):n super().__init__()n self.printer = QPrinter()n self.initUI()n

因為下面代碼中QPageSetupDialog、QPrintDialog涉及到QPrinter()對象,所以將其在類初始化的時候生成,便於函數的調用。

def openfiles(self):n fnames = QFileDialog.getOpenFileNames(self, 學點編程吧:打開多個文件,./)n if fnames[0]:n for fname in fnames[0]:n with open(fname, r,encoding=gb18030,errors=ignore) as f:n self.tx.append(f.read())n

QFileDialog.getOpenFileNames將返回用戶選擇的一個或多個現有文件,注意這裡返回值是元組。元組的第0個元素則是列表,例如fnames其實是這樣的:

([C:/Users/yangff/Desktop/PyQt5/10/美文.txt, C:/Users/yangff/Desktop/PyQt5/10/十九大(new).txt, C:/Users/yangff/Desktop/PyQt5/10/十九大.txt], )n

所以我們通過對fnames[0]進行遍歷,分別讀取每個文件的內容,然後在QTextEdit顯示出來。需要注意的是:我們使用了QTextEdit的append方法,讓每次顯示的內容均會存留在QTextEdit上。效果如下:

這個函數的第二個參數是對話框的標題,第三個參數是設置打開文件的目錄。當然我們還可以增加第四個,也就是增加一個過濾器,以便僅顯示與過濾器匹配的文件。 例如:

fnames = QFileDialog.getOpenFileNames(self, 學點編程吧:打開多個文件,./,"Text files (*.txt)")n

效果如下:

def savefile(self):n fileName = QFileDialog.getSaveFileName(self, 學點編程吧:保存文件,./,"Text files (*.txt)")n if fileName[0]:n with open(fileName[0], w,encoding=gb18030,errors=ignore) as f:n f.write(self.tx.toPlainText())n

getSaveFileName()具體的用法與getOpenFileNames()類似,只是用來保存文件的。最後我們使用write函數將QTextEdit的內容保存在文件中。獲取的QTextEdit的內容可以使用這個函數toPlainText()。效果如下:

def pagesettings(self):n printsetdialog = QPageSetupDialog(self.printer,self)n printsetdialog.exec_()n

QPageSetupDialog類為印表機上的頁面相關選項提供了一個配置對話框。這個就必須使用到QPrinter對象了。

printsetdialog.exec_()n

這句話就相當於我們執行確認的頁面設置信息。

def printdialog(self):n printdialog = QPrintDialog(self.printer,self) n if QDialog.Accepted == printdialog.exec_():n self.tx.print(self.printer)n

這個函數就是告訴我們調用QPrintDialog準備進行列印了。

QPrintDialog類提供了一個用於指定印表機配置的對話框。對話框允許用戶更改文檔相關設置,如紙張尺寸和方向,列印類型(顏色或灰度),頁面範圍和列印份數。

還提供控制以使用戶可以從可用的印表機中進行選擇,包括任何配置的網路印表機。通常,QPrintDialog對象使用QPrinter對象構造,並使用exec()函數執行。

if QDialog.Accepted == printdialog.exec_():n self.tx.print(self.printer)n

在我們選擇好印表機等等後,點擊列印(即對話框被用戶接受,則QPrinter對象被正確配置為列印),我們會調用QTextEdit中的print方法進行相關的列印。

由於我本地沒有印表機,但是在安裝pdf閱讀器的時候,給我安裝了一個pdf虛擬印表機, 即可以把任何內容列印成pdf文檔,所以可以選擇這個印表機也能進行測試。當然如果你有印表機的話可以在實際的印表機上測試一下。效果如下:

總結:

本次我們學習了如何打開多文件、保存文件以及列印文件

ok,今天就到這裡,我們下期再談談其他的對話框,本身對話框內容就比較多,會多分幾期講解。

如果你想要本次教程中的相關源碼,請關注微信公眾號:學點編程吧,發送pyqt510,會自動得到相應的百度網盤下載鏈接。


推薦閱讀:

Google Brain開源新的Python 庫:Tangent
Windows下MySQL 5.7.17壓縮版安裝過程的坑
優秀開源項目kombu源碼分析之registry和entrypoint
Python從零開始系列連載(14)——Python程序的基本控制流程(中)
你真的了解Python中的日期時間處理嗎?

TAG:Python | Python教程 | PyQt |