Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在双函数Tkinter python中使用root.after_Python_Tkinter_Tkinter Canvas - Fatal编程技术网

如何在双函数Tkinter python中使用root.after

如何在双函数Tkinter python中使用root.after,python,tkinter,tkinter-canvas,Python,Tkinter,Tkinter Canvas,我有下面的代码,问题是,当我选择“华氏度”时,它运行第二个函数,然后返回并运行第一个函数。我希望它运行一个函数,如果它满足条件,我想root.after是导致问题的原因,但我不确定如何修复它 我使用这个脚本来显示服务器的温度并定期更新它,我想创建一个下拉菜单,将温度值从摄氏度更改为华氏度 from tkinter import * import paramiko root = Tk() root.title('Raspberry Temperature') root.geometry(&qu

我有下面的代码,问题是,当我选择“华氏度”时,它运行第二个函数,然后返回并运行第一个函数。我希望它运行一个函数,如果它满足条件,我想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()

问题是,循环中既有
温度
又有
温度2
,但从不取消循环。因此,如果您首先启动
温度
循环,然后启动
温度2
循环,那么这两个循环都将运行

您可以通过在
之后保存
返回的标识符,并使用该标识符在\u cancel
之后调用
来停止现有循环

在您的情况下,您可能希望取消
回调中的现有循环:

def callback(*args):
    global after_id
    after_cancel(after_id)
    temperature2()
然后,还必须记住在_id
之后初始化
。例如:

def temperature():
    global after_id
    ...
    after_id = root.after(1000, temperature)

当然,您可能需要输入一些代码来处理未定义after\u id或调用
after\u cancel
失败的情况。然而,底线是,在开始新的循环之前,您需要停止任何现有的循环。

我更改了代码,但因为我是python新手,我不完全了解您的解决方案。您能看到我仍然缺少什么吗。很抱歉,这是我的第一个脚本。
after\u cancel(…)
内部
callback()
函数应该是
root。after\u cancel(…)
。实际上,您可以定期执行
temperature()
,并根据
OptionMenu
的选定值在函数内部执行任何操作。然后,您不需要取消退出的
after()
任务。