A. 用python寫測試腳本,從本地傳文件至ftp遠程路徑
轉自:http://news.tuxi.com.cn/kf/article/jhtdj.htm
本文實例講述了python實現支持目錄FTP上傳下載文件的方法。分享給大家供大家參考。具體如下:
該程序支持ftp上傳下載文件和目錄、適用於windows和linux平台。
#!/usr/bin/envpython
#-*-coding:utf-8-*-
importftplib
importos
importsys
classFTPSync(object):
conn=ftplib.FTP()
def__init__(self,host,port=21):
self.conn.connect(host,port)
deflogin(self,username,password):
self.conn.login(username,password)
self.conn.set_pasv(False)
printself.conn.welcome
deftest(self,ftp_path):
printftp_path
printself._is_ftp_dir(ftp_path)
#printself.conn.nlst(ftp_path)
#self.conn.retrlines('LIST./a/b')
#ftp_parent_path=os.path.dirname(ftp_path)
#ftp_dir_name=os.path.basename(ftp_path)
#printftp_parent_path
#printftp_dir_name
def_is_ftp_file(self,ftp_path):
try:
ifftp_pathinself.conn.nlst(os.path.dirname(ftp_path)):
returnTrue
else:
returnFalse
exceptftplib.error_perm,e:
returnFalse
def_ftp_list(self,line):
list=line.split('')
ifself.ftp_dir_name==list[-1]andlist[0].startswith('d'):
self._is_dir=True
def_is_ftp_dir(self,ftp_path):
ftp_path=ftp_path.rstrip('/')
ftp_parent_path=os.path.dirname(ftp_path)
self.ftp_dir_name=os.path.basename(ftp_path)
self._is_dir=False
ifftp_path=='.'orftp_path=='./'orftp_path=='':
self._is_dir=True
else:
#thisuescallbackfunction,thatwillchange_is_dirvalue
try:
self.conn.retrlines('LIST%s'%ftp_parent_path,self._ftp_list)
exceptftplib.error_perm,e:
returnself._is_dir
returnself._is_dir
defget_file(self,ftp_path,local_path='.'):
ftp_path=ftp_path.rstrip('/')
ifself._is_ftp_file(ftp_path):
file_name=os.path.basename(ftp_path)
#如果本地路徑是目錄,下載文件到該目錄
ifos.path.isdir(local_path):
file_handler=open(os.path.join(local_path,file_name),'wb')
self.conn.retrbinary("RETR%s"%(ftp_path),file_handler.write)
file_handler.close()
#如果本地路徑不是目錄,但上層目錄存在,則按照本地路徑的文件名作為下載的文件名稱
elifos.path.isdir(os.path.dirname(local_path)):
file_handler=open(local_path,'wb')
self.conn.retrbinary("RETR%s"%(ftp_path),file_handler.write)
file_handler.close()
#如果本地路徑不是目錄,且上層目錄不存在,則退出
else:
print'EROOR:Thedir:%sisnotexist'%os.path.dirname(local_path)
else:
print'EROOR:Theftpfile:%sisnotexist'%ftp_path
defput_file(self,local_path,ftp_path='.'):
ftp_path=ftp_path.rstrip('/')
ifos.path.isfile(local_path):
file_handler=open(local_path,"r")
local_file_name=os.path.basename(local_path)
#如果遠程路徑是個目錄,則上傳文件到這個目錄,文件名不變
ifself._is_ftp_dir(ftp_path):
self.conn.storbinary('STOR%s'%os.path.join(ftp_path,local_file_name),file_handler)
#如果遠程路徑的上層是個目錄,則上傳文件,文件名按照給定命名
elifself._is_ftp_dir(os.path.dirname(ftp_path)):
print'STOR%s'%ftp_path
self.conn.storbinary('STOR%s'%ftp_path,file_handler)
#如果遠程路徑不是目錄,且上一層的目錄也不存在,則提示給定遠程路徑錯誤
else:
print'EROOR:Theftppath:%siserror'%ftp_path
file_handler.close()
else:
print'ERROR:Thefile:%sisnotexist'%local_path
defget_dir(self,ftp_path,local_path='.',begin=True):
ftp_path=ftp_path.rstrip('/')
#當ftp目錄存在時下載
ifself._is_ftp_dir(ftp_path):
#如果下載到本地當前目錄下,並創建目錄
#下載初始化:如果給定的本地路徑不存在需要創建,同時將ftp的目錄存放在給定的本地目錄下。
#ftp目錄下文件存放的路徑為local_path=local_path+os.path.basename(ftp_path)
#例如:將ftp文件夾a下載到本地的a/b目錄下,則ftp的a目錄下的文件將下載到本地的a/b/a目錄下
ifbegin:
ifnotos.path.isdir(local_path):
os.makedirs(local_path)
local_path=os.path.join(local_path,os.path.basename(ftp_path))
#如果本地目錄不存在,則創建目錄
ifnotos.path.isdir(local_path):
os.makedirs(local_path)
#進入ftp目錄,開始遞歸查詢
self.conn.cwd(ftp_path)
ftp_files=self.conn.nlst()
forfileinftp_files:
local_file=os.path.join(local_path,file)
#如果fileftp路徑是目錄則遞歸上傳目錄(不需要再進行初始化begin的標志修改為False)
#如果fileftp路徑是文件則直接上傳文件
ifself._is_ftp_dir(file):
self.get_dir(file,local_file,False)
else:
self.get_file(file,local_file)
#如果當前ftp目錄文件已經遍歷完畢返回上一層目錄
self.conn.cwd("..")
return
else:
print'ERROR:Thedir:%sisnotexist'%ftp_path
return
defput_dir(self,local_path,ftp_path='.',begin=True):
ftp_path=ftp_path.rstrip('/')
#當本地目錄存在時上傳
ifos.path.isdir(local_path):
#上傳初始化:如果給定的ftp路徑不存在需要創建,同時將本地的目錄存放在給定的ftp目錄下。
#本地目錄下文件存放的路徑為ftp_path=ftp_path+os.path.basename(local_path)
#例如:將本地文件夾a上傳到ftp的a/b目錄下,則本地a目錄下的文件將上傳的ftp的a/b/a目錄下
ifbegin:
ifnotself._is_ftp_dir(ftp_path):
self.conn.mkd(ftp_path)
ftp_path=os.path.join(ftp_path,os.path.basename(local_path))
#如果ftp路徑不是目錄,則創建目錄
ifnotself._is_ftp_dir(ftp_path):
self.conn.mkd(ftp_path)
#進入本地目錄,開始遞歸查詢
os.chdir(local_path)
local_files=os.listdir('.')
forfileinlocal_files:
#如果file本地路徑是目錄則遞歸上傳目錄(不需要再進行初始化begin的標志修改為False)
#如果file本地路徑是文件則直接上傳文件
ifos.path.isdir(file):
ftp_path=os.path.join(ftp_path,file)
self.put_dir(file,ftp_path,False)
else:
self.put_file(file,ftp_path)
#如果當前本地目錄文件已經遍歷完畢返回上一層目錄
os.chdir("..")
else:
print'ERROR:Thedir:%sisnotexist'%local_path
return
if__name__=='__main__':
ftp=FTPSync('192.168.1.110')
ftp.login('test','test')
#上傳文件,不重命名
#ftp.put_file('111.txt','a/b')
#上傳文件,重命名
#ftp.put_file('111.txt','a/112.txt')
#下載文件,不重命名
#ftp.get_file('/a/111.txt',r'D:\')
#下載文件,重命名
#ftp.get_file('/a/111.txt',r'D:112.txt')
#下載到已經存在的文件夾
#ftp.get_dir('a/b/c',r'D:\a')
#下載到不存在的文件夾
#ftp.get_dir('a/b/c',r'D:\aa')
#上傳到已經存在的文件夾
ftp.put_dir('b','a')
#上傳到不存在的文件夾
ftp.put_dir('b','aa/B/')
希望本文所述對大家的Python程序設計有所幫助。
以下轉自:http://blog.csdn.net/linda1000/article/details/8255771
Python中的ftplib模塊
Python中默認安裝的ftplib模塊定義了FTP類,其中函數有限,可用來實現簡單的ftp客戶端,用於上傳或下載文件
FTP的工作流程及基本操作可參考協議RFC959
ftp登陸連接
from ftplib import FTP #載入ftp模塊
ftp=FTP() #設置變數
ftp.set_debuglevel(2) #打開調試級別2,顯示詳細信息
ftp.connect("IP","port") #連接的ftp sever和埠
ftp.login("user","password")#連接的用戶名,密碼
print ftp.getwelcome() #列印出歡迎信息
ftp.cmd("xxx/xxx") #更改遠程目錄
bufsize=1024 #設置的緩沖區大小
filename="filename.txt" #需要下載的文件
file_handle=open(filename,"wb").write #以寫模式在本地打開文件
ftp.retrbinaly("RETR filename.txt",file_handle,bufsize) #接收伺服器上文件並寫入本地文件
ftp.set_debuglevel(0) #關閉調試模式
ftp.quit #退出ftp
ftp相關命令操作
ftp.cwd(pathname) #設置FTP當前操作的路徑
ftp.dir() #顯示目錄下文件信息
ftp.nlst() #獲取目錄下的文件
ftp.mkd(pathname) #新建遠程目錄
ftp.pwd() #返回當前所在位置
ftp.rmd(dirname) #刪除遠程目錄
ftp.delete(filename) #刪除遠程文件
ftp.rename(fromname, toname)#將fromname修改名稱為toname。
ftp.storbinaly("STOR filename.txt",file_handel,bufsize) #上傳目標文件
ftp.retrbinary("RETR filename.txt",file_handel,bufsize)#下載FTP文件
網上找到一個具體的例子:
#例:FTP編程
fromftplibimportFTP
ftp=FTP()
timeout=30
port=21
ftp.connect('192.168.1.188',port,timeout)#連接FTP伺服器
ftp.login('UserName','888888')#登錄
printftp.getwelcome()#獲得歡迎信息
ftp.cwd('file/test')#設置FTP路徑
list=ftp.nlst()#獲得目錄列表
fornameinlist:
print(name)#列印文件名字
path='d:/data/'+name#文件保存路徑
f=open(path,'wb')#打開要保存文件
filename='RETR'+name#保存FTP文件
ftp.retrbinary(filename,f.write)#保存FTP上的文件
ftp.delete(name)#刪除FTP文件
ftp.storbinary('STOR'+filename,open(path,'rb'))#上傳FTP文件
ftp.quit()#退出FTP伺服器
完整的模板:
#!/usr/bin/python
#-*-coding:utf-8-*-
importftplib
importos
importsocket
HOST='ftp.mozilla.org'
DIRN='pub/mozilla.org/webtools'
FILE='bugzilla-3.6.7.tar.gz'
defmain():
try:
f=ftplib.FTP(HOST)
except(socket.error,socket.gaierror):
print'ERROR:cannotreach"%s"'%HOST
return
print'***Connectedtohost"%s"'%HOST
try:
f.login()
exceptftplib.error_perm:
print'ERROR:cannotloginanonymously'
f.quit()
return
print'***Loggedinas"anonymously"'
try:
f.cwd(DIRN)
exceptftplib.error_perm:
print'ERRORLcannotCDto"%s"'%DIRN
f.quit()
return
print'***Changedto"%s"folder'%DIRN
try:
#傳一個回調函數給retrbinary()它在每接收一個二進制數據時都會被調用
f.retrbinary('RETR%s'%FILE,open(FILE,'wb').write)
exceptftplib.error_perm:
print'ERROR:cannotreadfile"%s"'%FILE
os.unlink(FILE)
else:
print'***Downloaded"%s"toCWD'%FILE
f.quit()
return
if__name__=='__main__':
main()
B. 怎麼用python進行web開發
HTML(超文本標記語言)是網頁的核心,學好HTML是成為Web開發人員的基本條件。HTML很容易學習的,但也很容易誤用,要學精還得費點功夫。
隨著HTML5的發展和普及,了解HTML5也將成為Web開發人員的必修課。
涉及到網頁外觀時,就需要學習CSS了,它可以幫你把網頁做得更美觀。
利用HTML和CSS模擬一些你所見過的網站的排版和布局(色彩,圖片,文字樣式等等)。
第二步:學習javascript,了解DOM
JavaScript是一種能讓你的網頁更加生動活潑的程序語言。學習JavaScript的基本語法,學會用javascript操作網頁中dom元素。
接著學習使用一些javascript庫,比如jquery是大部分WEB開發人員都喜歡用的,通過Jquery可以有效的提高JavaScript的開發效率。
第三步:了解Web伺服器
你不必在這上面花太多精力,但對IIS、Apache基本配置要掌握,這方面的知識學起來也相對容易,不會花多長時間。
學習一點Unix和Linux的基本知識,因為大部分Web伺服器都運行在Unix和Linux平台上。
第四步: 學好一門伺服器端腳本語言
伺服器端腳本編程(後台開發)也是Web開發人員的基本功之一,你只需挑選一個伺服器端腳本語言,然後學好它。
目前流行的伺服器腳本語言有:php、asp.net、jsp、ruby、python、等。
第五步:學習資料庫及SQL語法
要構建動態頁面通常會使用到資料庫,常用的資料庫有SQLServer、Oracle、MySQL 等,它們都會遵循標準的SQL原則。
通常asp.net 程序使用SqlServer資料庫,PHP、java使用Oracle、MySQL資料庫。
第六步:綜合實戰
選一個你喜歡的後台編程語言,結合之前學到的html,css,javascript 前端技術,實現一個簡單的留言本、論壇程序、進而實現一個簡單的CMS(內容管理系統)
第七步:學習使用Web框架
當你掌握了HTML,CSS,JavaScript和伺服器端腳本語言後,就應該找一個Web框架加快你的Web開發速度,使用框架可以節約你很多時間。
比如.net的MVC,JAVA 的SSH,php的cakephp、CodeIgniter、zend,ruby的ROR,python的dijango等等,其實裡面都有一些相通之處。
整個開發過程你還可能會學習到一些工具的使用:
Visio,Dreamweaver,Vistual Studio、elipse、(Vim, EditPlus, Notpad++)、sqlserver、phpmyadmin,各種瀏覽器以及FireBug的插件,IE下的WebDevelopmentHelper、IETester等。如果你足夠用心,你還發掘出很多不錯的資源,例如MSDN,W3cSchool,一些前輩的博客,一些技術論壇等等,這都是你未來前進道路上的財富。如還想深入研究,學學http協議,理解什麼是無狀態,不然你永遠做不好WEB開發,研究web程序服務端運行原理,還有tcp/ip,udp協議等。
從最簡單的HTML到Web框架,內容還是不少,要想精通這里的每一樣技術,都得下苦功夫才行。半年的時間,足夠你對web開發產生一個有效的認識,這個時候,再思考你進一步學習的方向吧。
C. 如何用Python開發一個簡單的Webkit瀏覽器
在這篇教程中,我們會用 Python 的 PyQt 框架編寫一個簡單的 web 瀏覽器。關於 PyQt ,你可能已經有所耳聞了,它是 Qt 框架下的一系列 Python 組件,而 Qt(發音類似「cute」)是用來開發GUI的 C++ 框架。嚴格來講, Qt 也可用於開發不帶圖形界面的程序,但是開發用戶界面應該是 Qt 框架最為廣泛的應用了。Qt 的主要優勢是可以開發跨平台的圖形界面程序,基於 Qt 的應用能夠藉助於各平台的原生性在不同類的設備上運行,而無須修改任何代碼庫。
Qt 附帶了webkit的介面,你可以直接使用 PyQt 來開發一個基於 webkit 的瀏覽器。
我們本次教程所開發的瀏覽器可以完成如下功能:
載入用戶輸入的url
顯示在渲染頁面過程中發起的所有請求
允許用戶在頁面中執行自定義的 JavaScript 腳本
牛刀小試
讓我們從最簡單的 PyQt 的 Webkit 用例開始吧:輸入 url,打開窗口並在窗口中載入頁面。
這個例子十分短小,連import語句和空行在內也只有 13 行代碼。
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
import sys
from PyQt4.QtWebKit import QWebView
from PyQt4.QtGui import QApplication
from PyQt4.QtCore import QUrl
app = QApplication(sys.argv)
browser = QWebView()
browser.load(QUrl(sys.argv[1]))
browser.show()
app.exec_()
當你通過命令行將 url 傳給腳本時,程序會載入 url 並且在窗口中顯示載入完成的頁面。
現在,看似你已經有一個「命令行瀏覽器」啦!至少比 python 的 requests 模塊強多了,甚至比Lynx還略高一籌,因為我們的瀏覽器還可以載入 JavaScript 腳本呢。但是目前為止還沒有跟 Lynx 拉開差距,因為在啟用瀏覽器的時候只能通過命令行傳入 url。那麼,必然需要通過某種方式把需要載入的 url 傳入瀏覽器。沒錯,就是地址欄!
添加地址欄
其實地址欄的實現非常簡單,我們只需要在窗口頂端加一個輸入框就夠了。用戶在文本框中輸入 url 之後,瀏覽器就會載入這個地址。下面,我們將用到 QLineEdit 控制項來實現輸入框。鑒於我們的瀏覽器現在有地址欄和瀏覽器顯示框兩部分,因此還要給我們的應用增加一個網格布局。
Python
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
import sys
from PyQt4.QtGui import QApplication
from PyQt4.QtCore import QUrl
from PyQt4.QtWebKit import QWebView
from PyQt4.QtGui import QGridLayout, QLineEdit, QWidget
class UrlInput(QLineEdit):
def __init__(self, browser):
super(UrlInput, self).__init__()
self.browser = browser
# add event listener on "enter" pressed
self.returnPressed.connect(self._return_pressed)
def _return_pressed(self):
url = QUrl(self.text())
# load url into browser frame
browser.load(url)
if __name__ == "__main__":
app = QApplication(sys.argv)
# create grid layout
grid = QGridLayout()
browser = QWebView()
url_input = UrlInput(browser)
# url_input at row 1 column 0 of our grid
grid.addWidget(url_input, 1, 0)
# browser frame at row 2 column 0 of our grid
grid.addWidget(browser, 2, 0)
# main app window
main_frame = QWidget()
main_frame.setLayout(grid)
main_frame.show()
# close app when user closes window
sys.exit(app.exec_())
到這里,我們已經有一個瀏覽器的雛形啦!看上去和當年的 Google Chrome 還有幾分相像呢,畢竟兩者採用了相同的渲染引擎。現在,你可以在輸入框中輸入 url ,程序便會將地址傳入瀏覽器,接著渲染出所有的 HTML 頁面和 JavaScript 腳本並展示出來。
添加開發工具
一個瀏覽器最有趣也最重要的部分是什麼?當然是各種各樣的開發工具了!一個沒有開發者控制台的瀏覽器怎麼能算是瀏覽器呢?所以,我們的 Python 瀏覽器當然也要有一些開發者工具才行。
現在,我們就來添加一些類似於 Chrome 的開發者工具中 「Network」 標簽的功能吧!這個功能就是簡單地追蹤瀏覽器引擎在載入頁面的時候所執行的所有請求。在瀏覽器主頁面的下方,我們將通過一個表來顯示這些請求。簡單起見,我們只會記錄登錄的 url、返回的狀態碼和響應的內容類型。
首先我們要通過 QTableWidget 組件創建一個表格,表頭包括需要存儲的欄位名稱,表格可以根據每次新插入的記錄來自動調整大小。
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class RequestsTable(QTableWidget):
header = ["url", "status", "content-type"]
def __init__(self):
super(RequestsTable, self).__init__()
self.setColumnCount(3)
self.setHorizontalHeaderLabels(self.header)
header = self.horizontalHeader()
header.setStretchLastSection(True)
header.setResizeMode(QHeaderView.ResizeToContents)
def update(self, data):
last_row = self.rowCount()
next_row = last_row + 1
self.setRowCount(next_row)
for col, dat in enumerate(data, 0):
if not dat:
continue
self.setItem(last_row, col, QTableWidgetItem(dat))
想要追蹤所有請求的話,我們還需要對 PyQt 的內部構件有更深入的了解。了解到,Qt 提供了一個 NetworkAccessManager類作為 API 介面,通過調用它可以監控應用載入頁面時所執行的請求。我們需要自己編寫一個繼承自 NetworkAccessManager 的子類,添加必要的事件監聽器,然後使用我們自己編寫的 manager 來通知 webkit 視圖執行相應的請求。
首先我們需要以 NetworkAccessManager 為基類創建我們自己的網路訪問管理器。
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Manager(QNetworkAccessManager):
def __init__(self, table):
QNetworkAccessManager.__init__(self)
# add event listener on "load finished" event
self.finished.connect(self._finished)
self.table = table
def _finished(self, reply):
"""Update table with headers, status code and url.
"""
headers = reply.rawHeaderPairs()
headers = {str(k):str(v) for k,v in headers}
content_type = headers.get("Content-Type")
url = reply.url().toString()
# getting status is bit of a pain
status = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute)
status, ok = status.toInt()
self.table.update([url, str(status), content_type])
在這里需要提醒大家的是, Qt 的某些實現並不像想像中那麼簡單明了,比如說從響應中獲取狀態碼就十分繁瑣。首先,你得把請求對象的類屬性作為參數傳入 response 的方法.attribute()中,.attribute()方法的返回值是 QVariant 類型而非 int 類型。接著,需要調用內置函數.toInt()將其轉換成一個包含兩個元素的元組,最終得到響應的狀態碼。
現在,我們終於有了一個記錄請求的表和一個監控網路的 manager,接下來只要把他們聚攏起來就可以了。
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
if __name__ == "__main__":
app = QApplication(sys.argv)
grid = QGridLayout()
browser = QWebView()
url_input = UrlInput(browser)
requests_table = RequestsTable()
manager = Manager(requests_table)
# to tell browser to use network access manager
# you need to create instance of QWebPage
page = QWebPage()
page.setNetworkAccessManager(manager)
browser.setPage(page)
grid.addWidget(url_input, 1, 0)
grid.addWidget(browser, 2, 0)
grid.addWidget(requests_table, 3, 0)
main_frame = QWidget()
main_frame.setLayout(grid)
main_frame.show()
sys.exit(app.exec_())
現在,運行瀏覽器程序,在地址欄鍵入 url,就可以看到在主頁面下方的記錄表中記錄下的所有請求。
如果你有興趣的話,還可以為瀏覽器添加很多新的功能:
通過content-type添加篩選功能
添加記錄表的排序功能
添加計時器
高亮顯示出錯的請求(比如說把錯誤信息置為紅色)
顯示出更為具體的請求內容,比如說完整的頭信息、響應內容、請求方法等。
增加一個重復發送請求並載入出來的選項。比如說用戶可以點擊在記錄表中的請求來重試請求。
其實還有太多的功能可以繼續完善和改進,你可以一一嘗試一下,這會是一個非常有趣而且收獲良多的學習過程。但是如果想把這些功能都說完,估計都能寫一本書了。所以限於篇幅,本文就不一一介紹了,感興趣的朋友可以參考其他書籍和網上教程。
增加解析自定義 JavaScript 腳本的功能
我們終於迎來最後一個功能了!就是解析在頁面中包含的 JavaScript 腳本。
基於我們之前已經打下的基礎,要完成這個功能非常簡單。我們只需要在添加一個 QLineEdit 組件,把它和頁面聯系起來,然後調用evaulateJavaScript方法就可以了。
Python
1
2
3
4
5
6
7
8
9
class JavaScriptEvaluator(QLineEdit):
def __init__(self, page):
super(JavaScriptEvaluator, self).__init__()
self.page = page
self.returnPressed.connect(self._return_pressed)
def _return_pressed(self):
frame = self.page.currentFrame()
result = frame.evaluateJavaScript(self.text())
下面是這個功能的示例。看,我們的開發者工具已經整裝待發了!
Python
1
2
3
4
5
6
7
8
9
10
11
if __name__ == "__main__":
# ...
# ...
page = QWebPage()
# ...
js_eval = JavaScriptEvaluator(page)
grid.addWidget(url_input, 1, 0)
grid.addWidget(browser, 2, 0)
grid.addWidget(requests_table, 3, 0)
grid.addWidget(js_eval, 4, 0)
現在唯一缺少的就是在頁面中不能執行 Python 腳本。你可以開發自己的瀏覽器,提供對 JavaScript 和 Python 的支持,這樣其他開發者就可以針對你的瀏覽器開發應用了。
後退、前進和其他頁面操作
我們在前面已經使用了 QWebPage 對象來開發瀏覽器,當然作為一個合格的瀏覽器,我們也需要為終端用戶提供一些重要功能。Qt 的網頁對象支持很多不同操作,我們可以把它們全都添加到瀏覽器中。
現在我們可以先嘗試著添加「後退」、「前進」和「刷新」這幾個操作。你可以在界面上添加這些操作按鈕,簡單起見,這里只加一個文本框來執行這些動作。
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class ActionInputBox(QLineEdit):
def __init__(self, page):
super(ActionInputBox, self).__init__()
self.page = page
self.returnPressed.connect(self._return_pressed)
def _return_pressed(self):
frame = self.page.currentFrame()
action_string = str(self.text()).lower()
if action_string == "b":
self.page.triggerAction(QWebPage.Back)
elif action_string == "f":
self.page.triggerAction(QWebPage.Forward)
elif action_string == "s":
self.page.triggerAction(QWebPage.Stop)
和之前一樣,我們要創建一個 ActionInputBox 的實例,把參數傳入頁面對象並把輸入框對象添加到頁面中。
For reference here』s code for final result 示例代碼看這里
[1]: Graphical User Interface,圖形用戶界面,又稱圖形用戶介面,是指採用圖形方式顯示的計算機操作用戶界面。
[2]: WebKit是一個開源的瀏覽器引擎,與之相對應的引擎有 Gecko(Mozilla Firefox 等使用)和 Trident(也稱 MSHTML ,IE 使用)。
D. python能做什麼游戲
Python是一門高級且有趣的編程語言,除了網路爬蟲、人工智慧、數據分析之外,Python還可以進行游戲開發,為大家介紹五個支持Python的2D、3D游戲開發庫。
1、Cocos2d:是一系列開源軟體框架,用於構建跨平台2D游戲和應用程序,由cocos2d-x、cocos2d-js、cocos2d-xna和cocos2d多種框架組成,像大魚賭場、城堡沖突等小游戲,就是用此框架開發出來的。
2、Panda3D:是由迪士尼開發的3D游戲引擎,一個用於Python和C++程序的3D渲染和游戲開發框架,並由卡內基梅隴娛樂技術中心負責維護,使用C++編寫的,針對Python進行了完全的封裝。
3、Pygame:它是一組Python模塊,用來編寫游戲,可支持Python3.7,游戲例子有:紙牌游戲、超級馬里奧、擊球等多種游戲。
4、Pyogre:ogre 3D渲染引擎的Python綁定,可以用來開發游戲和模擬程序等任何3D應用,它的API更加穩定,也非常快速靈活。
5、RenPy:一個視覺小說引擎,被世界各地的成千萬的創造者所使用,它可以幫助你使用文字、圖像和聲音來講述電腦和移動設備上的故事。RenPy是開放源碼的,可免費的商業用途,易於學習的腳本語言任何人都能有效地編寫大型視覺小說,它的Python腳本足以用來模擬游戲。
E. 如何用手機編程Python
1.QPython3:這是一個在安卓手機上運行python3的腳本引擎,整合了python3解釋器、控制台、QEdit編輯器和SLA4庫,可以在安卓手機上運行python開發的程序,下面我簡單介紹一下這個軟體的...
2.Termux:這是一個功能強大的高級終端,可以運行shell命令(ssh等),在線安裝python後,也可以編輯運行python代碼,下面我簡單介紹一下這個軟體: 安裝Termux,這個與上面的QPython...
F. 如何在windows上編寫python腳本
Python安裝好以後,在開始菜單會看到一個idle工具(一個增強的交互命令行解釋器窗口)以及一個自帶的編輯器。
在任意目錄新建一個.py文件或者保存的時候以.py結尾,用記事本、Python自帶的編輯器或者其他編輯器如Sublime Text或者NotePad++都行。
如果你使用的是idle,直接按F5就能在Python自帶的命令行查看結果
如果是用記事本或者其他編輯器,快捷鍵win+R調出運行目錄,輸入cmd,然後在命令行里進入這個目錄,輸入python [filename].py或者[filename].py就可以看到運行結果了
G. 如何使用python 語言來實現測試開發
對於各種驅動介面,Python來編寫測試用例的好處是:由於Python不需要編譯,你所執行的也就是你所編寫的,當發生異常的時候,你無須打開集成開發環境,載入測試工程、並調試,你能夠很方便的看到python測試腳本的內容,什麼地方出了異常可以立刻發現,例如:
from ctypes import *
rc =c_int(-12345);
dll = windll.LoadLibrary("dmodbc.dll");#載入被測試組件
#=================#
SQLHANDLE_env = pointer(c_long(0));
SQLHANDLE_cnn = pointer(c_long(0));
SQLHANDLE_stmt = pointer(c_long(0));
pdns = c_char_p("FASTDB");
puid = c_char_p("SYSDBA");
ppwd = c_char_p("SYSDBA");
#env handle
rc = dll.SQLAllocHandle(1,None,byref(SQLHANDLE_env));
print "result of henv handle alloc :%d" %rc;
#cnn handle
rc = dll.SQLAllocHandle(2,SQLHANDLE_env,byref(SQLHANDLE_cnn));
print "result of cnn handle alloc :%d" %rc;
#connect!
rc = dll.SQLConnect(SQLHANDLE_cnn,pdns,-3,puid,-3,ppwd,-3)
print "result of connect :%d" %rc;
#stmt handle
rc = dll.SQLAllocHandle(3,SQLHANDLE_cnn,byref(SQLHANDLE_stmt));
print "result of stmt handle alloc:%d" %rc;
#exec
rc = dll.SQLExecDirect(SQLHANDLE_stmt,"insert into t values(1)",-3);
print "result of exec:%d" %rc;
#free========================
rc = dll.SQLFreeHandle(3, SQLHANDLE_stmt);
print rc;
rc = dll.SQLDisconnect(SQLHANDLE_cnn);
print rc;
rc = dll.SQLFreeHandle(2, SQLHANDLE_cnn);
print rc;
rc = dll.SQLFreeHandle(1, SQLHANDLE_env);
print rc;
在上面我們可以看到,Python調用c/c++介面是十分容易的,只需要把動態庫載入進來,然後把這個動態庫當作一個對象實例來使用就可以了。下面將是一個使用ado.net介面的例子:
import System;
from Dm import *#Dm是DMDBMS提供的ado.Net的DataProvider
#print dir(Dm.DmCommand);
i =0;
cnn = Dm.DmConnection("server = 127.0.0.1; User ID = SYSDBA; PWD = SYSDBA; Database = SYSTEM; port = 12345");
cmd = Dm.DmCommand();
cmd.Connection = cnn;
cmd.CommandText = "insert into t values(1);";
cnn.Open();
i=cmd.ExecuteNonQuery();
print i;
cmd.Dispose();
cnn.Close();
可以看到,.net對象的使用與在VisualStdio上進行開發幾乎沒有任何區別。
通過使用Python進行測試用例的開發,最大的好處莫過於:學習成本非常低,測試工程師只需要學習Python,對於其他語言稍有了解就可以了。同時只需要少量的測試開發工程師對Python測試框架進行維護。
這樣的好處就是便於測試人員將精力專精在一個方向,免於「什麼都會一點,但什麼都不精」的情況。當然測試人員具備廣闊的知識面,會使用各種常見的開發工具與平台是好事情,並且也是必要的,不過在短時間內要求迅速能夠勝任大多數任務也是企業在人才培養上的期望目標。