鱼C论坛

 找回密码
 立即注册
查看: 1491|回复: 1

[已解决]使用TKinter制作测速小窗口,报错name 'btn' is not defined

[复制链接]
发表于 2023-3-10 17:06:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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()
最佳答案
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模块需要访问互联网,因此在运行此代码之前,确保您的计算机已连接到互联网。


有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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模块需要访问互联网,因此在运行此代码之前,确保您的计算机已连接到互联网。


有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 12:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表