利用tkinter寫一個簡易的端口掃描工具

  1. 效果圖預覽
  2. 涉及到的內容介紹
  3. 詳細代碼解析
  4. 附完整代碼
  5. 對tkinter的一些補充



一、效果圖預覽

使用nslookup命令查看baidu.com的IP地址
在這裏插入圖片描述
使用自己寫的端口掃描工具掃描該IP
在這裏插入圖片描述



回到頂部

二、涉及到的內容介紹

  1. 網絡編程socket
  2. threading多線程
  3. 正則表達式re
  4. tkinter基礎編程



回到頂部

三、詳細代碼解析

  1. 正則表達式對IP格式進行判斷,IPV4的地址是用點分十進制表示的,即114.114.144.144的形式。若格式正確,則執行端口掃描並輸出掃描結果;否則,彈出錯誤提示框,提示IP格式錯誤。
    def Judgment_IP(self):
        # 判斷輸入的IP格式是否正確(正則)
        reg = '^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$'
        ip = re.match(reg,self.IP.get())
        if ip is not None:
            action(ip.group())
            Port_open_content = Label(self.init_window_name, text=Port_is_open)
            Port_open_content.grid(row=4,column=1)
        else:
            print("IP格式錯誤")
            tkinter.messagebox.showerror('錯誤', 'IP格式錯誤')
  1. 編寫工具中寫tkinter窗體用到的方法
  • title():設置窗體的名稱
self.init_window_name.title('簡單的端口掃描工具')
  • geometry():設置窗體的大小,看下面四個值,寬、高、位置x,y
self.init_window_name.geometry('300x600+150+150')
  • iconbitmap():設置窗體的圖標
self.init_window_name.iconbitmap('./panda_128px_1227690_easyicon.net.ico')
  • Label:組件,用於在指定的窗口中顯示文本和圖像
label = Label(self.init_window_name,text ="IP:",anchor='c').grid(row=0)
  • Entry:組件,文本框用來讓用戶輸入一行文本字符串
self.IP = Entry(self.init_window_name)
self.IP.grid(row=0,column=1)



回到頂部

四、附完整代碼

# -*- conding: utf-8 -*-
from tkinter import *
import tkinter.messagebox
from socket import *
from threading import Thread,Lock
import sys,re


Port_is_open = ""

class Port_Scan():
    def __init__(self,init_window_name):
        self.init_window_name = init_window_name

    #設置窗口
    def set_init_window(self):
        #設置名稱
        self.init_window_name.title('簡單的端口掃描工具')
        #設置窗體大小
        self.init_window_name.geometry('300x600+150+150')
        #設置圖標
        self.init_window_name.iconbitmap('./panda_128px_1227690_easyicon.net.ico')
        # 設置輸入框 Entry
        label = Label(self.init_window_name,text ="IP:",anchor='c').grid(row=0)
        self.IP = Entry(self.init_window_name)
        self.IP.grid(row=0,column=1)
        #設置掃描按鈕
        Button(self.init_window_name,text="開始掃描",anchor='c',command=self.Judgment_IP).grid(row=0,column=2)

    def Judgment_IP(self):
        # 判斷輸入的IP格式是否正確(正則)
        reg = '^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$'
        ip = re.match(reg,self.IP.get())
        if ip is not None:
            action(ip.group())
            Port_open_content = Label(self.init_window_name, text=Port_is_open)
            Port_open_content.grid(row=4,column=1)
        else:
            print("IP格式錯誤")
            tkinter.messagebox.showerror('錯誤', 'IP格式錯誤')


class mythread(Thread):
    def __init__(self, fun, args):
        Thread.__init__(self)
        self.fun = fun
        self.args = args

    def run(self):
        self.fun(*self.args)

def action(ip):
    def scan(h, p):
        global Port_is_open
        try:
            tcpCliSock = socket(AF_INET, SOCK_STREAM)
            tcpCliSock.connect((host, p))
            if lock.acquire():
                Port_is_open += ""+ str(p) + " -> opened\n"
                lock.release()
        except error:
            if lock.acquire():
                Port_is_open +=""+ str(p) + " -> not open\n"
                lock.release()
        finally:
            tcpCliSock.close()
            del tcpCliSock

    lock = Lock()
    ports = [21, 23, 25, 53, 69, 80, 135, 137, 139, 1521, 1433, 3306, 3389]
    host = ip
    mt = []
    for p in ports:
        t = mythread(scan,(host, p))
        mt.append(t)
    for m in mt:
        m.start()
    for m in mt:
        m.join()

    print(Port_is_open)

if __name__ == '__main__':
    init_window = Tk()
    scan = Port_Scan(init_window)
    scan.set_init_window()
    init_window.mainloop()



回到頂部

五、對tkinter的一些補充

  • root.title(‘標題名’) 修改框體的名字,也可在創建時使用className參數來命名;
  • root.resizable(0,0) 框體大小可調性,分別表示x,y方向的可變性;
  • root.geometry(‘250x150’) 指定主框體大小;
  • root.quit() 退出;
  • root.update_idletasks()
  • root.update() 刷新頁面;
#設置窗體背景顏色
# self.init_window_name["background"] = "blue"
#設置透明度
# self.init_window_name.attributes("-alpha",0.8)
#設置全全屏:True全屏,Flase正常顯示(一般不設置)
# self.init_window_name.attributes("-fullscreen",False)
# 設置窗體置頂
# self.init_window_name.attributes("-topmost",True)
# 設置成脫離工具欄(一般不設置)
# self.init_window_name.overrideredirect(False)

# 獲取屏幕的大小
# screen_height = self.init_window_name.winfo_screenheight()
# screen_width = self.init_window_name.winfo_screenwidth()
# print("寬%d,高%d"%(screen_width,screen_height))

# 獲取窗體大小
# win_height = self.init_window_name.winfo_height()
# win_width = self.init_window_name.winfo_width()
# print("寬%d,高%d" % (win_width, win_height))

#獲取窗體的位置
# win_x = self.init_window_name.winfo_x()
# win_y = self.init_window_name.winfo_y()
# print("%d,%d" % (win_x, win_y))

回到頂部



在這裏插入圖片描述

知乎:叄貳壹

簡書:帶只拖鞋去流浪

關注我,帶你一起寫bug

warning :未經授權,不得轉載

有問題的小夥伴請在下方留言,喜歡就點個贊吧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章