天天看點

python scale 視窗部件 使用_端口掃描器之python子產品tkinter

十步殺一人,千裡不留行;事了拂身去,深藏功與名。

《俠客行》 -- 李白

tkinter 簡介

python 有許多常用的 GUI 子產品,如:PyQt,wxPython,Pywin32,PyGTK,還有今天介紹的 tkinter。

問:為什麼有那麼多優秀的 GUI 子產品,你偏偏選擇 tkinter?

答(含情脈脈):幾許一人以偏愛,願盡餘生之慷慨。

python scale 視窗部件 使用_端口掃描器之python子產品tkinter

問(反手就是一拳):說人話!

python scale 視窗部件 使用_端口掃描器之python子產品tkinter

答(咳咳):嗯~ Tkinter 是使用 python 進行視窗視窗設計的子產品. 簡單的構造, 多平台, 多系統的相容性, 能讓它成為讓新手快速入門定制視窗檔案的好助手. 它在 python 視窗視窗子產品中是一款簡單型的. 是以用來入門, 熟悉 視窗視窗的使用, 非常有必要。

python scale 視窗部件 使用_端口掃描器之python子產品tkinter

問(不知從哪拿的一把西瓜刀架在我的脖子上):再給你最後一次機會說實話!

答(畢恭畢敬):我。。。我就會這個,别的,别的啥也不會。。。

python scale 視窗部件 使用_端口掃描器之python子產品tkinter

常用的元件

這裡就介紹 tkinter 會用到的幾個元件,分别是:标簽和按鈕,選擇按鈕,輸入和文本框,彈窗,尺度和放置位置。

1

建立一個空白的界面 

每一個 tkinter 應用的主體架構都可以包含下面這部分. 定義 window 視窗 和 window 的一些屬性, 然後書寫視窗内容(往視窗添加部件), 最後執行 window.mainloop 讓視窗活起來.

import tkinter as tkwindow = tk.Tk() # 初始化一個視窗執行個體window.title('Empty Window') # 視窗标題window.geometry("300x300") # 視窗大小# 這裡可以自定義控件,為視窗添加内容window.mainloop() # 進入消息循環,和 Cmd 類的 cmdloop() 類似
           
python scale 視窗部件 使用_端口掃描器之python子產品tkinter

2

Label&Button 标簽和按鈕 

① 先建立一個用來描述的标簽,使用 Label 控件。

I = tk.Label(window,             text='This is a label', # 标簽的文字             bg='yellow', # 背景顔色             font=('Arial',12), # 字型和字型大小             width=15,height=2 # 标簽長寬             )I.pack() # 每一個空間定義完都要 pack 才能成效
           
python scale 視窗部件 使用_端口掃描器之python子產品tkinter

② 接着定義一個按鈕,使用 Button 控件,值得注意的是,Button 控件點選之後會觸發一個函數 Scan ,這個可以是我們自定義的掃描函數,當我們點選 "掃描" 按鈕之後就會自動掃描某 IP 的端口了。

def Scan():    pass# 定義按鈕b = tk.Button(window,              text = '掃描',              width = 7,height=1,              command = Scan              )b.pack()
           
python scale 視窗部件 使用_端口掃描器之python子產品tkinter

3

Radiobutton 選擇按鈕

定義可選按鈕使用 radiobutton 控件,為便于示範,我們使用 Label 控件來配合。

定義一個 var 用來将 radiobutton 的值和 Label 的值聯系在一起,其中variable=var, value='A' 的意思就是,當我們滑鼠選中了其中一個選項,把 value 的值 A 放到變量 var 中,然後指派給 variable。

import tkinter as tkwindow = tk.Tk()  # 初始化一個視窗執行個體window.title('Empty Window')  # 視窗标題window.geometry("300x300")  # 視窗大小# 定義标簽I = tk.Label(window, bg='yellow', width=25, text='empty')I.pack()# 定義一個按鈕觸發函數def print_selection():    I.config(text='you have selected ' + var.get())var = tk.StringVar() # 定義一個 var 用來将 radiobutton 的值和 Label 的值聯系在一起# 定義按鈕r1 = tk.Radiobutton(window, text='TCP',                   variable=var, value='TCP',                   command=print_selection)r2 = tk.Radiobutton(window,text='UDP',                    variable=var,value='UDP',                    command=print_selection)r1.pack()r2.pack()window.mainloop()  # 進入消息循環,和 Cmd 類的 cmdloop() 類似
           
python scale 視窗部件 使用_端口掃描器之python子產品tkinter

4

Entry&Text 輸入和文本框 

① 文本輸入框使用控件 Entry

# 定義輸入框e = tk.Entry(window, show='')e.pack()
           

② 文本輸出框使用控件 Text

# 定義輸出框t = tk.Text(window, height=5)t.pack()
           

③ 定義一個按鈕,将在輸入框的内容輸出到輸出框中,整體代碼如下:

import tkinter as tkwindow = tk.Tk()  # 初始化一個視窗執行個體window.title('Empty Window')  # 視窗标題window.geometry("300x300")  # 視窗大小# 定義輸入框e = tk.Entry(window, show='')e.pack()# 定義輸出框t = tk.Text(window, height=5)t.pack()# 執行函數def insert():    var = e.get()    t.insert('end', var)  # end 屬性表示将 var 值添加在文本框的最後,insert 屬性表示将 var 值添加在 滑鼠指定的位置# 定義按鈕b = tk.Button(window, text='輸出', command=insert)b.pack()window.mainloop()  # 進入消息循環,和 Cmd 類的 cmdloop() 類似
           
python scale 視窗部件 使用_端口掃描器之python子產品tkinter

5

Messagebox 彈窗 

messagebox 就是平時所看到的彈窗,要先導入 messagebox 類,然後這裡定義一個按鈕來觸發彈窗。

import tkinter as tkimport tkinter.messageboxwindow = tk.Tk()  # 初始化一個視窗執行個體window.title('Empty Window')  # 視窗标題window.geometry("300x300")  # 視窗大小# 觸發函數def click():    tk.messagebox.showinfo(title='彈窗',message='這是一個彈窗')# 定義一個按鈕觸發彈窗b = tk.Button(window,text='click me',command=click)b.pack()window.mainloop()  # 進入消息循環,和 Cmd 類的 cmdloop() 類似
           
python scale 視窗部件 使用_端口掃描器之python子產品tkinter

還有其他的幾種彈框形式,可以将它們的結果列印出來看看

print(tk.messagebox.showwarning(title='Hi', message='nononono'))print(tk.messagebox.showerror(title='Hi', message='you are wrong'))print(tk.messagebox.askquestion(title='Hi', message='go ahead?'))print(tk.messagebox.askretrycancel(title='Hi',message='retry cancel?'))print(tk.messagebox.askokcancel(title='Hi',message='concel?'))print(tk.messagebox.askyesnocancel(title='Hi',message='cancel or no?'))print(tk.messagebox.askyesno(title='Hi',message='yes or no?')
           

6

Scale 尺度 

尺度條使用的控件是 Scale。

s = tk.Scale(window, label='Thread', from_=0, to=20, orient=tk.HORIZONTAL,             length=400, showvalue=1, tickinterval=4, resolution=0.01, command=print_selection)s.pack()
           

Scale 控件中,參數的解釋如下:

  • 參數 label 表示控件的名稱。
  • 參數 from_=5,to=11 的意思就是從 5 到 11,即這個滾動條最小值為 5,最大值為 11(這裡使用 from_ 是因為在 python 中有 from 這個關鍵詞)。
  • 參數 orient=tk.HORIZONTAL 在這裡就是設定滾動條的方向,如我們所看到的效果圖,這裡 HORIZONTAL 就是橫向。
  • 參數 length 這裡是指滾動條部件的長度,但注意的是和其他部件 width 表示不同,width 表示的是以字元為機關,比如 width=4,就是 4 個字元的長度,而此處的 length=200,是指我們常用的像素為機關,即長度為 200 個像素。
  • showvalue=0 表示不顯示遊标上面的值,0 表示上方無結果顯示,1 則會顯示遊标定位的值。
  • 參數 tickinterval 設定的就是坐标的間隔。
  • 參數 resolution=0.01 表示遊标上的數值保留到小數點後兩位。

這裡定義一個标簽用于顯示遊标指定的值。PS:在觸發函數 print_selection(v) 中出現了一個形參 v,這裡的形參 v 代表了遊标定位的值,和字母無關,将 v 換成 value 也行。

整體代碼如下:

import tkinter as tkwindow = tk.Tk()  # 初始化一個視窗執行個體window.title('Empty Window')  # 視窗标題window.geometry("400x300")  # 視窗大小I = tk.Label(window, bg='yellow', width=20, text='empty')I.pack()def print_selection(v):    I.config(text='Thread = ' + v)s = tk.Scale(window, label='Thread', from_=0, to=20, orient=tk.HORIZONTAL,             length=400, showvalue=1, tickinterval=4, resolution=0.01, command=print_selection)s.pack()window.mainloop()  # 進入消息循環,和 Cmd 類的 cmdloop() 類似
           
python scale 視窗部件 使用_端口掃描器之python子產品tkinter

7

Pack Grid Place放置位置 

"放置位置" 通俗地了解就是将控件置與某處嘛,這在 tkinter 中有一個官方的說法,就是 "幾何管理"。

tkinter 控件有特定的幾何狀态管理方法,管理整個控件區域組織,以下是 tkinter 公開的幾何管理類:包、網絡、位置。

幾何方法 描述
pack() 包裝
grid() 網絡
place() 位置

這裡隻介紹 place,前面兩種有興趣的童鞋自行參悟。place 比較容易了解,就是給精确的坐标 (x , y) 來定位,anchor=nw 就是将錨點定在西北角。(要有坐标的話,肯定得确定坐标系吧,要确定坐标系,得确定原點吧)

tk.Label(window,text=1).place(x=20,y=30,anchor='nw')
           
python scale 視窗部件 使用_端口掃描器之python子產品tkinter

8

總結 

到這裡,我們已經完全可以使用上面所學,将我們腦中所構思的 "端口掃描器" 的界面大緻畫出來了,下面是我的想法(正所謂一千個觀衆有一千個哈姆雷特)

# -*- coding: utf-8 -*-"""@Run by : [email protected]: [email protected]: 2020/6/28 19:[email protected]: tmp.py"""import tkinter as tk# 初始化一個視窗執行個體window = tk.Tk()  # 初始化一個視窗執行個體window.title('Port Scanner v1')  # 視窗标題window.geometry("500x350")  # 視窗大小tk.Label(window,text='配置如下:').place(x=10,y=20,anchor='nw')tk.Label(window,text='起始IP:').place(x=10,y=50,anchor='nw')tk.Entry(window,show='').place(x=60,y=50,anchor='nw')tk.Label(window,text='結束IP:').place(x=10,y=90,anchor='nw')tk.Entry(window,show='').place(x=60,y=90,anchor='nw')tk.Label(window,text='端口:').place(x=10,y=130,anchor='nw')tk.Entry(window,show='').place(x=60,y=130,anchor='nw')tk.Label(window,text='延時:').place(x=10,y=170,anchor='nw')tk.Entry(window,show='',width=5).place(x=60,y=170,anchor='nw')tk.Label(window,text='毫秒').place(x=110,y=170,anchor='nw')# tk.Label(window,text='線程:').place(x=10,y=210,anchor='nw')# tk.Entry(window,show='',width=5).place(x=60,y=210,anchor='nw')s = tk.Scale(window,label='線程',from_=0,to=20,orient=tk.HORIZONTAL,             length=200, showvalue=1, tickinterval=10, resolution=1)s.place(x=10,y=210,anchor='nw')var = tk.StringVar()tk.Radiobutton(window,text='TCP',variable=var,value='TCP').place(x=110,y=210,anchor='nw')tk.Radiobutton(window,text='UDP',variable=var,value='UDP').place(x=160,y=210,anchor='nw')tk.Button(window,text='掃描',width=9).place(x=30,y=310,anchor='nw')tk.Button(window,text='退出',width=9).place(x=140,y=310,anchor='nw')tk.Label(window,text='掃描結果:').place(x=250,y=20,anchor='nw')tk.Text(window,height=20,width=30).place(x=255,y=50,anchor='nw')window.mainloop()  # 進入消息循環,和 Cmd 類的 cmdloop() 類似
           
python scale 視窗部件 使用_端口掃描器之python子產品tkinter

尾聲

好了,這篇文章就寫到這裡,tkinter 還有許多很有意思的元件,所謂,工欲善其事必先利其器,"器" 已經有了,怎麼利用就在于各位的天馬行空 ,有待大家去探索了,這裡就不一一列舉了。主要是我不會。。。咋滴,愛怎怎,哈哈哈

python scale 視窗部件 使用_端口掃描器之python子產品tkinter

我是匠心,一個在清流旁默默磨劍的匠人,希望有一天能利刃出鞘,仗劍走江湖。

python scale 視窗部件 使用_端口掃描器之python子產品tkinter

喜歡就主動點,在看

繼續閱讀