<p>您可以使用线程,而不是使用<code>after</code>方法,这允许您的GUI与while循环同时运行。你知道吗</p>
<pre><code>import threading
from tkinter import *
import serial
from time import strftime
conexao = serial.Serial('COM3', 9600, timeout=0.5)
cont=0
janela = Tk()
def ligar():
global cont
cont=cont+1
if cont==1:
valor=bytes(('1'),'utf-8')
conexao.write(valor)
ligar['text']='Desligar led'
elif cont==2:
valor=bytes(('2'),'utf-8')
conexao.write(valor)
ligar['text']='Ligar led'
cont=0
def agendar():
global start,limit
comeco= start.get()
final= limit.get()
while 1>0:
if comeco == strftime('%H:%M:%S'):
valor=bytes(('1'),'utf-8')
conexao.write(valor)
elif final == strftime('%H:%M:%S'):
valor=bytes(('2'),'utf-8')
conexao.write(valor)
break
global start,limit
ligar=Button(janela,command=ligar,text='ligar',width="60")
ligar.grid(row=1)
texto=Label(text='Defina o começo:').grid(row=2)
start=Entry(janela)
start.grid(row=3)
texto2=Label(text='Defina o fim:').grid(row=4)
limit=Entry(janela)
limit.grid(row=5)
salvar=Button(janela,width="30",text='Salvar Horarios',command=lambda: threading.Thread(target=agendar).start())
salvar.grid(row=6)
</code></pre>
<p>下面是一个简短的分类:</p>
<ol>
<li>按下按钮执行lambda函数(使用lambda函数很有用,因为它允许您避免使用包装器函数)</li>
<li>lambda函数为agendar函数创建一个单独的线程</li>
<li>线程开始<br/></li>
</ol>
<p><em>注意:我将limit和start定义为全局变量,但我不确定您是否需要它。<br/>另外,我还没有测试过它,但我很肯定它能用。</em></p>