python - Tkinter 每次都冻结导致 Python 没有响应
问题描述
我正在尝试将 tkinter 用于一个基本的弹出窗口,让您开始和停止记录数据。但是,每次我运行它时,窗口都会冻结并且我得到“Python 没有响应”。
我用谷歌搜索它,发现使用 sleep() 是一个常见原因,但由于我没有在我的代码中使用它,我不确定问题可能是什么。
import serial
import numpy as np
import msvcrt as m
import time
import os
from tkinter import *
moment = time.strftime("%Y-%b-%d_%H%M%S",time.localtime())
class Application(Frame):
def __init__(self,master):
sd = "Data"
try:
os.mkdir(sd)
except Exception:
pass
global f
f= open(os.path.join(sd, "data"+ moment +".txt"),"w+")
self.f = f
super(Application,self).__init__(master)
self.pack()
self.createWidgets()
self._alarm_id = None
self._paused = False
def createWidgets(self):
self.someFrame = Frame(self)
self.startButton = Button(self.someFrame, text="Start Recording",command=self.startRecord)
self.startButton.pack(side=LEFT)
self.stopButton = Button(self.someFrame, text="Stop Recording", command=self.stopRecord)
self.stopButton.pack(side=LEFT)
self.resetButton = Button(self.someFrame, text="Reset", command=self.resetRecord)
self.resetButton.pack(side=LEFT)
self.someFrame.pack(side=TOP)
self.labelvariable = StringVar()
self.labelvariable.set("Waiting")
self.thelabel = Label(self,textvariable = self.labelvariable,font=('Helvetica',50))
self.thelabel.pack(side=TOP)
def startRecord(self):
""" Start/Resume """
self._paused = False
app.labelvariable.set("Recording")
if self._alarm_id is None:
self.record()
def stopRecord(self):
""" Stop/Pause """
app.labelvariable.set("Paused")
if self._alarm_id is not None:
self._paused = True
def resetRecord(self):
""" Resets and creates new file"""
app.labelvariable.set("Cleared")
f = self.f
f.close()
sd = "Data"
try:
os.mkdir(sd)
except Exception:
pass
moment = time.strftime("%Y-%b-%d_%H%M%S",time.localtime())
f= open(os.path.join(sd, "data"+ moment +".txt"),"w+")
if self._alarm_id is not None:
self.master.after_cancel(self._alarm_id)
self._alarm_id = None
self._paused = False
self.record()
self._paused = True
def record(self, start=True):
if start:
arduinoData = serial.Serial('com3', 9600)
while self._paused is False:
while (arduinoData.inWaiting()==0):
pass
arduinoString = arduinoData.readline()
vlt = float(arduinoString)
f.write("%d\r\n" %(vlt))
if self._paused:
self._alarm_id = self.master.after(1000, self.record, False)
else:
app.labelvariable.set("")
self._alarm_id = self.master.after(1000, self.record, False)
if __name__ == '__main__':
root = Tk()
root.title("EMG")
app = Application(root)
root.mainloop()
解决方案
不要使用while
声明!
使用这个: root.after()
:如何使用 root.after()
推荐阅读
- react-native - 如何在本机反应中设置视图的自动高度
- angular - 如果数据相对较小,Kendo 柱形图的栏不显示 -- Kendo Angular Chart
- c# - 从不同的表创建 ASP Net Core Entity Framework 实体
- html - 禁用angularjs多选中的选项
- compiler-errors - Xcode 10 编译时错误:分段错误 11
- c++ - 如何使用 Kmean 中心来测试新数据?
- python - 在自定义异常中使用 super 和 __init__
- regex - 我如何检查字符是否出现两次
- angular - ng-fullcalendar - Angular 6 - ngFor 循环中的外部事件
- android - 自定义 AppCompatAutoCompleteTextView 下拉大小更改