首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tkinter e Adafruit IO为什么循环不工作?

tkinter e Adafruit IO为什么循环不工作?
EN

Stack Overflow用户
提问于 2020-12-16 22:09:51
回答 2查看 59关注 0票数 0

我最近一直在使用python……我不明白为什么while循环阻止了tkinter窗口的创建。

如果我将while循环移到move循环之前,我会显示tkinter窗口,但循环会停止。

代码语言:javascript
复制
import tkinter as tk
import time
from Adafruit_IO import Client, Feed, RequestError

ADAFRUIT_IO_USERNAME = "***********"
ADAFRUIT_IO_KEY = "**********************"
aio = Client(ADAFRUIT_IO_USERNAME, ADAFRUIT_IO_KEY)
loop_delay = 5
temp = 25

try:
    temperature = aio.feeds('temperature')
except RequestError: 
    feed = Feed(name="temperature")
    temperature = aio.create_feed(feed)
    
def sendtemp(temp):  
    aio.send_data(temperature.key,temp) 
    data = aio.receive(temperature.key)
    print(data.value)
    
window = tk.Tk()
window.title ("Thermometer")
window.geometry("300x100")
label = tk.Label(window, text = temp)
label.pack()

window.mainloop 

while True:
    sendtemp(temp)
    time.sleep(loop_delay)
EN

回答 2

Stack Overflow用户

发布于 2020-12-17 21:03:54

我是这样解决的,你觉得呢?

代码语言:javascript
复制
import tkinter as tk

from Adafruit_IO import Client, Feed, RequestError

ADAFRUIT_IO_USERNAME = "**********"
ADAFRUIT_IO_KEY = "***************"

aio = Client(ADAFRUIT_IO_USERNAME, ADAFRUIT_IO_KEY)

try:
    temperature = aio.feeds('temperature')
except RequestError: 
    feed = Feed(name="temperature")
    temperature = aio.create_feed(feed)
    
class Timer:
    
     def __init__(self, parent):
         self.temp = 25
         self.label = tk.Label(text="--,- °C", font="Arial 30", width=10)
         self.label.pack()
         self.label.after(5000, self.sendtemp)

     def sendtemp(self):
         aio.send_data(temperature.key,self.temp) 
         data = aio.receive(temperature.key)
         print(data.value)
         self.label.configure(text="%i°C" % self.temp)
         self.temp +=1
         self.label.after(5000, self.sendtemp)       

if __name__ == "__main__":
     window = tk.Tk()
     window.title ("Thermometer")
     window.geometry("300x100")
     timer = Timer(window)
     window.mainloop()
票数 1
EN

Stack Overflow用户

发布于 2020-12-17 20:21:34

你的while循环阻塞了程序。从字面上看,它除了调用sendtemp并休眠之外什么也不做。

代码语言:javascript
复制
while True:
    sendtemp(temp)
    time.sleep(loop_delay)

在TK窗口上没有响应事件的空间,Python正忙于做这两件事。

要定期执行操作,您需要设置一个计时器,该计时器在TK的主事件循环(使用.mainloop()启动的循环)上运行。这是通过the .after() method完成的。

这个方法需要一个毫秒的延迟和一个你想要调用的函数。

代码语言:javascript
复制
window = tk.Tk()
window.title ("Thermometer")
window.geometry("300x100")
timer_id = None
timer_delay = 5000

def sendtemp(temp):  
    aio.send_data(temperature.key,temp) 
    data = aio.receive(temperature.key)
    print(data.value)
    if timer_id is not None:
        start_timer()

def start_timer():
    global timer_id
    timer_id = window.after(timer_delay, sendtemp)

def stop_timer():
    global timer_id
    if timer_id is not None:
        window.after_cancel(timer_id)
        timer_id = None

start_timer()
window.mainloop()

您可以将停止和启动计时器绑定到一个按钮上。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65324882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档