python - 如何在两个函数 Tkinter python 中使用 root.after
问题描述
我有下面的代码,问题是当我选择“华氏温度”时,它运行第二个函数,然后它又返回并运行第一个函数。如果它满足条件,我希望它运行一个功能我认为 root.after 是导致问题的原因,但我不确定如何解决它。
我正在使用这个脚本来显示我的服务器的温度并定期更新它,我想创建一个下降来将值从摄氏温度更改为华氏温度。
from tkinter import *
import paramiko
root = Tk()
root.title('Raspberry Temperature')
root.geometry("250x250")
lab = Label(root)
lab.pack(pady=10)
lab.place(x=140, y=15)
label1 = Label(root, text="Core Temperature :", font=('Segoe', 10))
label1.pack(pady=10)
label1.place(x=20, y=15)
def temperature():
global after_id
p = paramiko.SSHClient()
p.set_missing_host_key_policy(
paramiko.AutoAddPolicy())
p.connect("pi", port=22, username="user", password="pass")
stdin, stdout, stderr = p.exec_command("vcgencmd measure_temp")
opt = stdout.readlines()
opt = "".join(opt)
print(opt)
lab.config(text=opt, font=('Segoe', 11, 'bold'))
after_id = root.after(1000, temperature)
return after_id
def temperature2():
global after_id
p2 = paramiko.SSHClient()
p2.set_missing_host_key_policy(
paramiko.AutoAddPolicy()) # This script doesn't work for me unless this line is added!
p2.connect("pi", port=22, username="user", password="pass")
stdin, stdout, stderr = p2.exec_command("vcgencmd measure_temp")
opt2 = stdout.readlines()
opt2 = "".join(opt2)
print(opt2)
lab.config(text=(opt2,"temp2"), font=('Segoe', 11, 'bold'))
#
after_id = root.after(1000, temperature2)
return after_id
import tkinter as tk
OptionList = [
"fahrenheit",
]
variable = tk.StringVar(root)
variable.set(OptionList[0])
opt = tk.OptionMenu(root, variable, *OptionList)
opt.config(width=10, font=('Helvetica', 12))
opt.pack(side="top")
opt.place(x= 10,y=50)
labelTest = tk.Label(text="", font=('Helvetica', 12), fg='red')
labelTest.pack(side="top")
temperature()
def callback(*args):
global after_id
after_cancel(after_id)
temperature2()
variable.trace("w", callback)
root.mainloop()
解决方案
问题是你同时拥有temperature
andtemperature2
在一个循环中,但你永远不会取消循环。因此,如果您先启动temperature
循环,然后再启动temperature2
循环,那么两个循环都将运行。
您可以通过保存返回的标识符来停止现有循环after
,并使用该标识符进行调用after_cancel
。
在您的情况下,您可能希望取消以下现有循环callback
:
def callback(*args):
global after_id
after_cancel(after_id)
temperature2()
然后,您还必须记住初始化after_id
. 例如:
def temperature():
global after_id
...
after_id = root.after(1000, temperature)
当然,您可能需要添加一些代码来处理未定义 after_id 或调用after_cancel
失败的情况。然而,底线是您需要在开始新的循环之前停止任何现有的循环。
推荐阅读
- regex - 正则表达式匹配开始和结束,同时在方括号之间大写字符串的中间部分
- spring-webflux - WebClient中响应体的通用处理/验证
- c# - 在 C# .NET Controller 类中使用 React 表单提交
- mqtt - Mosquitto brocker 仅用于本地主机?
- tensorflow - 如何在 Tensorflow CNN 模型中修剪权重(无需将模型迁移到 Keras)
- excel - 命名范围以隐藏/显示列
- android - 未解决的参考,在错误的测试范围内 - Android Studio 3.5
- python - 表单对 django 无效,为什么
- unity3d - Platform Grills Scroll Animation - 2D 游戏
- c# - 如何配置 ASP.NET MVC 以使用 ADFS oAuth 作为授权服务器?