[英]How to use root.after in two function Tkinter python
我有以下問題的代碼,當我選擇“華氏溫度”時,它運行第二個 function 然后它又返回並運行第一個 function。 我希望它運行一個 function 如果它滿足條件我認為 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
和temperature2
2,但你永遠不會取消循環。 因此,如果您先啟動temperature
循環,然后再啟動temperature2
2 循環,那么兩個循環都將運行。
您可以通過保存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
失敗的情況。 然而,底線是您需要在開始新的循環之前停止任何現有的循環。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.