xiaoxiaosen 发表于 2023-3-10 17:06:16

使用TKinter制作测速小窗口,报错name 'btn' is not defined

import threading
import tkinter as tk
from tkinter import ttk

import speedtest

root = tk.Tk()
root.geometry("300x233")
#root.iconbitmap("favicon.ico")
root.title("网络测速--森")

frm = tk.LabelFrame(root,text="测试结果")
frm.pack(padx=10, pady=10, fill=tk.X)

lbl_d = tk.Label(frm,text="下载速度:", font=("DS-Digital", 20))
lbl_d.grid(row=0, column=0, sticky=tk.W, padx=10)

lbl_u = tk.Label(frm,text="上传速度:", font=("DS-Digital", 20))
lbl_u.grid(row=1, column=0, sticky=tk.W, padx=10)

lbl_ul = tk.Label(frm,text=":", font=("DS-Digital", 20))
lbl_ul.grid(row=1, column=1, sticky=tk.W, padx=10)

def start_text():
    def action():
      sen = speedtest.Speedtest()
      sen.get_servers()
      pb.pack(padx = 10, pady = 10)
      pb.start()
      dl = sen.download()
      ul = sen.upload()
      lbl_dl.config(text=f"{dl/1024/1024:.2f}Mbits")
      lbl_ul.config(text=f"{ul/1024/1024:.2f}Mbits")
btn.config(state=tk.NORMAL)
btn.config(state=tk.DISABLED)
threading.Thread(target=action).start()


pb = ttk.Progressbar(root,test="开始测速", height=2, command=start_text)
btn.pack(padx=5,pady=5,fill=tk.X,expand=True)


root.mainloop()

wanglyndon 发表于 2023-3-10 17:33:50

这段代码有一些语法错误和逻辑错误。以下是我做了一些修改后的代码:

import threading
import tkinter as tk
from tkinter import ttk

import speedtest

root = tk.Tk()
root.geometry("300x233")
#root.iconbitmap("favicon.ico")
root.title("网络测速--森")

frm = tk.LabelFrame(root,text="测试结果")
frm.pack(padx=10, pady=10, fill=tk.X)

lbl_d = tk.Label(frm,text="下载速度:", font=("DS-Digital", 20))
lbl_d.grid(row=0, column=0, sticky=tk.W, padx=10)

lbl_u = tk.Label(frm,text="上传速度:", font=("DS-Digital", 20))
lbl_u.grid(row=1, column=0, sticky=tk.W, padx=10)

lbl_dl = tk.Label(frm,text="", font=("DS-Digital", 20))
lbl_dl.grid(row=0, column=1, sticky=tk.W, padx=10)

lbl_ul = tk.Label(frm,text="", font=("DS-Digital", 20))
lbl_ul.grid(row=1, column=1, sticky=tk.W, padx=10)

def start_test():
    def action():
      sen = speedtest.Speedtest()
      sen.get_servers()
      pb.start()
      dl = sen.download()
      ul = sen.upload()
      pb.stop()
      lbl_dl.config(text=f"{dl/1024/1024:.2f} Mbits")
      lbl_ul.config(text=f"{ul/1024/1024:.2f} Mbits")
      btn.config(state=tk.NORMAL)
    btn.config(state=tk.DISABLED)
    threading.Thread(target=action).start()

pb = ttk.Progressbar(root, mode='indeterminate', length=280)
pb.pack(padx=10, pady=10)

btn = ttk.Button(root, text="开始测速", command=start_test)
btn.pack(padx=5,pady=5,fill=tk.X,expand=True)

root.mainloop()


修改的内容包括:

将start_text()改为start_test(),以便与按钮命令一致。
将pb的test参数改为mode参数,并将command参数从start_text()改为start_test()。
在action()函数中,加入pb.stop()以停止进度条的动画。
将下载速度和上传速度的显示标签(lbl_dl和lbl_ul)中的文本格式化字符串更正为正确的格式。
将按钮启用和禁用的语句放入start_test()函数中,以确保在测速时禁用按钮,在测速完成后启用按钮。
注意,由于speedtest模块需要访问互联网,因此在运行此代码之前,确保您的计算机已连接到互联网。

有用请设置最佳答案
页: [1]
查看完整版本: 使用TKinter制作测速小窗口,报错name 'btn' is not defined