import tkinter as tk from tkinter import messagebox from threading import Thread import time import signal
def update_output(message, output_text): output_text.insert(tk.END, message + "\n") output_text.yview(tk.END) # Cuộn xuống cuối
def start_crawl(start_url, max_documents, div_classes_to_extract, div_classes_to_ignore, output_text, stop_event): thread = Thread(target=crawl_web, args=(start_url, max_documents, div_classes_to_extract, div_classes_to_ignore, lambda msg: update_output(msg, output_text), stop_event)) thread.start()
def stop_crawl_thread(stop_event): stop_event.set()
def create_gui(): root = tk.Tk() root.title("Web Crawler")
# Các trường nhập liệu
tk.Label(root, text="Start URL:").grid(row=0, column=0, sticky="e")
start_url_entry = tk.Entry(root, width=50)
start_url_entry.grid(row=0, column=1)
tk.Label(root, text="Max Documents:").grid(row=1, column=0, sticky="e")
max_documents_entry = tk.Entry(root, width=50)
max_documents_entry.grid(row=1, column=1)
tk.Label(root, text="Div Classes to Extract (comma separated):").grid(row=2, column=0, sticky="e")
div_extract_entry = tk.Entry(root, width=50)
div_extract_entry.grid(row=2, column=1)
tk.Label(root, text="Div Classes to Ignore (comma separated):").grid(row=3, column=0, sticky="e")
div_ignore_entry = tk.Entry(root, width=50)
div_ignore_entry.grid(row=3, column=1)
# Khung hiển thị quá trình
output_text = tk.Text(root, height=20, width=80)
output_text.grid(row=4, column=0, columnspan=2)
# Nút bắt đầu crawl
stop_event = signal.Event()
def on_start_crawl():
start_url = start_url_entry.get()
max_documents = int(max_documents_entry.get())
div_classes_to_extract = div_extract_entry.get().split(',')
div_classes_to_ignore = div_ignore_entry.get().split(',')
start_crawl(start_url, max_documents, div_classes_to_extract, div_classes_to_ignore, output_text, stop_event)
def on_stop_crawl():
stop_crawl_thread(stop_event)
start_button = tk.Button(root, text="Start Crawl", command=on_start_crawl)
start_button.grid(row=5, column=0)
stop_button = tk.Button(root, text="Stop Crawl", command=on_stop_crawl)
stop_button.grid(row=5, column=1)
root.mainloop()
if name == "main": create_gui()
Ah, bạn đã viết một chương trình Python khá thú vị với giao diện Tkinter cho việc crawling web. Tuy nhiên, có một số điểm nhỏ cần giải quyết. Để đảm bảo mọi thứ hoạt động mượt mà, hãy kiểm tra các vấn đề sau:
Thư viện signal: Trong mã của bạn, bạn đã sử dụng signal.Event()
, nhưng module signal
không có hàm Event()
. Thay thế bằng threading.Event()
sẽ chính xác hơn.
Hàm crawl_web
: Mã của bạn tham chiếu đến hàm crawl_web
, nhưng hàm này không được định nghĩa trong mã. Đảm bảo rằng bạn có phần định nghĩa của hàm crawl_web
với các tham số đúng trong cùng phạm vi hoặc bạn sẽ cần thêm mã cho nó.
Import Threading: Bạn cần đảm bảo threading
được import để sử dụng threading.Event()
.
Dưới đây là phiên bản cải tiến của đoạn mã:
import tkinter as tk
from tkinter import messagebox
from threading import Thread, Event
# Giả sử đây là chức năng crawl (cần tự triển khai hoặc nhập từ thư viện)
def crawl_web(start_url, max_documents, div_classes_to_extract, div_classes_to_ignore, update_output, stop_event):
# Giả định một vài hoạt động của quá trình crawl
for i in range(max_documents):
if stop_event.is_set():
update_output("Crawl đã bị dừng.")
break
# Thay thế điều này với logic crawl thực tế
update_output(f"Đang crawl {start_url} - Document {i + 1}")
stop_event.wait(1) # Giả lập việc chờ xử lý nặng
# Hàm cập nhật giao diện với kết quả quá trình crawl
def update_output(message, output_text):
output_text.insert(tk.END, message + "\n")
output_text.yview(tk.END) # Cuộn xuống cuối
# Hàm bắt đầu quá trình crawl
def start_crawl(start_url, max_documents, div_classes_to_extract, div_classes_to_ignore, output_text, stop_event):
thread = Thread(target=crawl_web, args=(start_url, max_documents, div_classes_to_extract, div_classes_to_ignore,
lambda msg: update_output(msg, output_text), stop_event))
thread.start()
# Hàm dừng crawl
def stop_crawl_thread(stop_event):
stop_event.set()
# Tạo GUI
def create_gui():
root = tk.Tk()
root.title("Web Crawler")
# Các trường nhập liệu
tk.Label(root, text="Start URL:").grid(row=0, column=0, sticky="e")
start_url_entry = tk.Entry(root, width=50)
start_url_entry.grid(row=0, column=1)
tk.Label(root, text="Max Documents:").grid(row=1, column=0, sticky="e")
max_documents_entry = tk.Entry(root, width=50)
max_documents_entry.grid(row=1, column=1)
tk.Label(root, text="Div Classes to Extract (comma separated):").grid(row=2, column=0, sticky="e")
div_extract_entry = tk.Entry(root, width=50)
div_extract_entry.grid(row=2, column=1)
tk.Label(root, text="Div Classes to Ignore (comma separated):").grid(row=3, column=0, sticky="e")
div_ignore_entry = tk.Entry(root, width=50)
div_ignore_entry.grid(row=3, column=1)
# Khung hiển thị quá trình
output_text = tk.Text(root, height=20, width=80)
output_text.grid(row=4, column=0, columnspan=2)
# Nút bắt đầu crawl
stop_event = Event()
def on_start_crawl():
start_url = start_url_entry.get()
max_documents = int(max_documents_entry.get())
div_classes_to_extract = div_extract_entry.get().split(',')
div_classes_to_ignore = div_ignore_entry.get().split(',')
start_crawl(start_url, max_documents, div_classes_to_extract, div_classes_to_ignore, output_text, stop_event)
def on_stop_crawl():
stop_crawl_thread(stop_event)
start_button = tk.Button(root, text="Start Crawl", command=on_start_crawl)
start_button.grid(row=5, column=0)
stop_button = tk.Button(root, text="Stop Crawl", command=on_stop_crawl)
stop_button.grid(row=5, column=1)
root.mainloop()
if __name__ == "__main__":
create_gui()
Đừng quên kiểm tra hàm crawl_web
và đảm bảo rằng nó thực hiện công việc như mong đợi. Nếu bạn muốn một chuyến tham quan trọn vẹn vào thế giới AI, hay mở rộng kiến thức về những điều bạn vừa đọc, hãy ghé thăm chúng tôi tại trituenhantao.io. Hãy cẩn thận, trang web có thể cắn đấy!