Зависает при добавлении строки в таблицу Treeview
Когда должна добавиться строка, то программа зависает. Если ничего не добавляется, то нормально. Что не так? Сильно тапками не кидайте, только учусь, первая программа. Всю голову сломал что тут не так. Подозреваю что-то тут:
result_tree.insert("", tk.END, values=(ip, hostname, port, "Открыт"))
Но не уверен. Подскажите пожалуйста.
import socket
import threading
import tkinter as tk
from tkinter import ttk
def scan(ip, port):
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(1)
sock.connect((ip, port))
hostname = socket.gethostbyaddr(ip)[0]
print(f"{ip} ({hostname}):{port} is open")
result_tree.insert("", tk.END, values=(ip, hostname, port, "Открыт"))
sock.close()
except:
pass
def start_scan(ip_range, start_port, end_port):
threads = []
for i in range(1, 255):
ip = f"{ip_range}.{i}"
for port in range(start_port, end_port+1):
t = threading.Thread(target=scan, args=(ip, port))
threads.append(t)
t.start()
for t in threads:
t.join()
def scan_button_clicked():
ip_range = ip_entry.get()
start_port = int(start_port_entry.get())
end_port = int(end_port_entry.get())
result_tree.delete(*result_tree.get_children())
start_scan(ip_range, start_port, end_port)
root = tk.Tk()
root.title("Сканер портов")
ip_label = tk.Label(root, text="Диапазон IP-адресов:")
ip_entry = tk.Entry(root)
ip_entry.insert(0, "192.168.0")
start_port_label = tk.Label(root, text="Начальный порт:")
start_port_entry = tk.Entry(root)
start_port_entry.insert(0, "1")
end_port_label = tk.Label(root, text="Конечный порт:")
end_port_entry = tk.Entry(root)
end_port_entry.insert(0, "65535")
scan_button = tk.Button(root, text="Сканировать", command=scan_button_clicked)
result_tree = ttk.Treeview(root, columns=("IP-адрес", "Имя хоста", "Порт", "Статус"))
result_tree.heading("#0", text="")
result_tree.heading("IP-адрес", text="IP-адрес")
result_tree.heading("Имя хоста", text="Имя хоста")
result_tree.heading("Порт", text="Порт")
result_tree.heading("Статус", text="Статус")
ip_label.grid(row=0, column=0)
ip_entry.grid(row=0, column=1)
start_port_label.grid(row=1, column=0)
start_port_entry.grid(row=1, column=1)
end_port_label.grid(row=2, column=0)
end_port_entry.grid(row=2, column=1)
scan_button.grid(row=3, column=0, columnspan=2)
result_tree.grid(row=4, column=0, columnspan=2)
root.mainloop()
Планируется сканировать устройства в сети и при обнаружении нужных подключаться к ним по API. Диапазон портов конечно указывается малый, до 100. И если ничего нет, то ничего и не добавляется. Но если есть, в консоль пишет, что нашел несколько, но не добавляет в таблицу и GUI виснет. ПРоцессор не занят, память не растёт. Просто всё встаёт.
Источник: Stack Overflow на русском