簡體   English   中英

如何在兩個 function Tkinter python 中使用 root.after

[英]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()

問題是你在一個循環中有temperaturetemperature2 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM