【问题标题】:tkinter freezing despite threading尽管有线程,tkinter仍冻结
【发布时间】:2020-10-15 16:41:03
【问题描述】:

我目前正在开发一个网络扫描器,它会持续扫描易受攻击的 URL。 我想为我的程序提供一个 GUI,因此选择使用 tkinter。

目前我面临一个问题,当我通过按下其他脚本的按钮从主程序(GUI)调用时,GUI 将冻结,并且仅在程序完成扫描整个单词列表时才会加载。

我知道线程并尝试将其应用到我的程序中。但它似乎不起作用,我不确定为什么。

我已经浏览了几个小时的许多 stackoverflow 页面并实施了它们,但它似乎仍然没有成功。我试过的一个例子是python running task in the background while allowing tkinter to be active

我的代码如下:

主界面

from Tkinter import *
from URLFuzzerNonRecursive import nonrecursiveURL
import threading

def thread(value):
   t = threading.Thread(target=nonrecursiveURL(value))
   t.start()
   #t.join()

def main():
   master = Tk()
   master.title("Web Fuzzer")

   master.geometry("700x400")
   urllabel = Label(master, text="Input URL to Fuzz")
   urllabel.place(relx=0.35, rely=0.05)
   urlinput = Entry(master, bd =5)
   urlinput.place(relx=0.35, rely=0.10)
   urlinput.insert(END,"http://")

   nonrecursionURL = Button(master, text="Non-Recursive URL Fuzzer", command=lambda: thread(urlinput.get()),width=20, height=2)
   nonrecursionURL.place(relx=0.35, rely=0.30)

   master.mainloop()

if __name__ == '__main__':
   main()

主 GUI 调用的 Python 脚本:

import requests
import tkinter.messagebox as tkmb
import tkinter as tk
import threading

def nonrecursiveURL(URLtoTake):
   root = tk.Tk()

   ybar = tk.Scrollbar(root)
   T = tk.Text(root)
   ybar.config(command=T.yview)
   T.config(yscrollcommand=ybar.set)
   T.grid(row=0, column=0, columnspan=5)
   ybar.grid(row=0, column=5, sticky="ns")
   try:
    with open('wordlist.txt') as f:
        for line in f:
            website = URLtoTake.strip('\n')+"/" + line
            URL = requests.get(website)
            if URL.status_code == 200:
                foundsites.append(website)
                info_message = "Status code: "+ str(URL.status_code) + " Found :" + website
                T.insert(tk.END,info_message)

            else:
                info_message = "Status code: "+ str(URL.status_code) +" Not Found :" + website
                T.insert(tk.END,info_message)

        for i in foundsites:
            T.insert(tk.END,"\n")
            T.insert(tk.END,"Found : ")
            T.insert(tk.END, i)
   except requests.exceptions.RequestException:
       info_message = "Please enter a valid URL ( inclusive of http:// )"
       tkmb.showinfo("Output", info_message)

【问题讨论】:

    标签: python multithreading python-2.7 tkinter


    【解决方案1】:

    问题中发布的thread 函数是直接调用 nonrecursiveURL 函数,然后将其作为线程目标传递。

    
    def thread(value):
       t = threading.Thread(target=nonrecursiveURL(value)) <-- here nonerecursiveURL is being called
    
    

    要在不同的线程中调用函数,threading.Thread 实例需要函数引用,以及要传递给该函数的可选参数列表。

    t = threading.Thread(target=nonrecursiveURL, args=(value,))
    

    现在nonrecursiveURL在这里没有被调用,而只是传递给Thread,当t.start()被调用时会在不同的线程中被调用。

    您可以确认这个问题,只需从 Python REPL 调用 thread 函数,将 Tkinter 排除在调试会话之外。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多