Python批量测试IP端口GUI程序(Tkinter)

一、实现样式

批量IP与端口中间用","分割,点击Telnet进行测试,前提是你电脑安装了telnet客户端,Clear按钮用来清空文本框。

二、核心点

1、使用Tkinter来制作桌面GUI页面

2、使用telnetlib模块测试telnet端口

三、困难点

1、测试结果陆续输出到文本框里面去 ,最开始使用重定向将print打印结果输出到文本框,当时结果会一下子全出现在页面上,如果数据量大就会导致程序一直无响应,半天结果不会出来,用户体验感异常不好,这里采用text.insert()将结果输出到文本框,使用延迟sleep,文本框更新的方式将数据一条一条的输出到页面上。

python 复制代码
 output_text.insert(INSERT,f"{host} {port}端口开放 \n")
 time.sleep(0.1)
 output_text.update()

2、文本框键盘无法输入 ,最开始想到是文本框直接 disabled,只读,但是这样的话text.insert()就无法将结果输出到文本框里面去,这里采用禁止键盘输入

python 复制代码
# 键盘无法输入
output_text.bind("<Key>",lambda event:"break")

四、完整代码

python 复制代码
from tkinter import *
import telnetlib
import time

root = Tk()
root.title("telnet批量测试")
# root.iconbitmap("telnet.ico")
root.geometry("800x540")
root.resizable(False, False)
# 保存端口不通的ip:ports
notopenport = []


def telnet(host, port):
    # redirect_stdout_to_tkinter(output_text)
    try:
        #  timeout单位s
        telnetlib.Telnet(host=host, port=port, timeout=1)
        output_text.insert(INSERT,f"{host} {port}端口开放 \n")
        time.sleep(0.1)
        output_text.update()
        output_text.focus_force()
        # print(f"{host} {port}  端口开放")       
    except:
        output_text.insert(INSERT,f"{host} {port}端口未开放 \n")
        notopenport.append(f"{host}:{port}")
        time.sleep(0.1)
        output_text.update()
        output_text.focus_force()
# 测试端口
def for_port():
    hosts = ipInput.get().split(',')
    port_list = portsInput.get().split(',')
    # print('需要测试的端口:')
    # print(hosts)
    output_text.insert(INSERT,'----------开始进行端口测试--------- \n')  
    for host in hosts:
        for port in port_list:
            telnet(host, port)
    output_text.insert(END,'------------端口测试完成----------- \n') 
    output_text.insert(END,'不通的ip地址与端口为: \n')
    output_text.insert(END,notopenport )
      

def clear():
    output_text.delete('1.0', END)

# 布局框架
fr = Frame(root).pack(anchor = 'nw')
# ip输入框
ipLab = Label(fr,text='IP Address:').place(x=30,y=30)
ipInput = Entry(fr,width=70)
ipInput.place(x=110,y=32)
# 端口输入框
portsLab = Label(fr,text='Ports:').place(x=30,y=70)
portsInput = Entry(fr,width=70)
portsInput.place(x=110,y=72)
# 按钮
telnetButton = Button(fr,text='Telnet',command=for_port).place(x=110,y=128)
clearButton = Button(fr,text='Clear',command=clear).place(x=170,y=128)

fr1 = Frame(root,width=72,height=200,bd=4).place(x=110,y=160)
output_text = Text(fr1,width=72)
output_text.place(x=110,y=160)
# 键盘无法输入
output_text.bind("<Key>",lambda event:"break")
# 滑块绑定
scroll = Scrollbar(fr1)
scroll.pack(side=RIGHT,fill=Y)
# 两个控件关联
scroll.config(command=output_text.yview)
output_text.config(yscrollcommand=scroll.set)

# redirect_stdout_to_tkinter(output_text)

mainloop()
相关推荐
羲云网络1 小时前
GPT Image 2.6 接入指南:Flare、Sunburst 怎么选,编辑失败如何排查
人工智能·python·aigc·图像生成·acedatacloud
承渊政道3 小时前
Linux网络学习【Reactor反应堆模式】
linux·网络·学习·ubuntu·reactor
橙橙笔记4 小时前
具身智能的学习 - 完成一个机械臂 第1节
python·学习·机械臂·具身智能
小小张说故事4 小时前
Python 的 class 语句到底执行了什么?拆开 __prepare__、metaclass.__new__ 和那个被讲反的 __set_name__ 顺序
python
天天被压力6 小时前
【A股分钟级高频数据完全手册 #07】北交所历史分钟K线接口:京市Pro版分时批量
java·人工智能·python
天天被压力7 小时前
【A股分钟级高频数据完全手册 #08】股票日、分时数据接口对比:普通分时与Pro版差异实测
java·人工智能·python
特立独行的猫A7 小时前
AI 时代,我为什么推荐用 cj-tauri 开发桌面应用
java·后端·python
小lo想吃棒棒糖7 小时前
把机器人训练从 GPU 搬到昇腾 NPU:启元 Q1 起身动作 PPO 训练全记录
python·机器人·昇腾·启元机器人
Thanks_ks7 小时前
【第 006 讲】搭建 PyCharm 开发环境:PyCharm 的下载与安装 | 初始设置与常用配置
ide·python·pycharm·开发工具·jetbrains·开发环境·集成开发环境
爱和冰阔落7 小时前
【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork
linux·运维·服务器·网络