from Tkinter import *
import tkFileDialog
import tkMessageBox
import os
import ttk
import serial
import timeit
import time
######################################################################################
class MyApp:
def __init__(self, parent):
########################################################
#Setup Frames
self.MiddleFrame = Frame(parent) #Middle Frame
self.MiddleFrame.pack()
#GLOBAL VARIABLES
self.chip_number = 0 #number of chip testing
###########################################
#Middle Frame setup
Label(self.MiddleFrame, text='Done').grid(row=8, column=1, sticky = E)
self.Done = Canvas(self.MiddleFrame, bg="yellow", width=10, height=10)
self.Done.grid(row=8, column=2)
Label(self.MiddleFrame, text='Chip Number:').grid(row=9, column=1, sticky = E)
#start button
self.button1 = Button(self.MiddleFrame,state=NORMAL, command= self.start_pre)
self.button1["text"]= "START"
self.button1.grid(row=1, column=2, sticky = E)
###########################################
#Action of Start Button
def start_pre(self):
x = 0
while x<10000:
self.start_button()
x=x+1
#Talking to Board
def start_button(self):
#increase chip count number and update
self.chip_number += 1
Label(self.MiddleFrame, text=str(self.chip_number)).grid(row=9, column=2, sticky = E)
#reset-yellow
self.reset_color()
print "Still Working", self.chip_number
self.Done.configure(background="green")
self.Done.update_idletasks()
###############################################################
#Color Boxes
#Reset
def reset_color(self):
self.Done.configure(background="yellow")
self.Done.update_idletasks()
###############################################################################################################
#Start Programs
root = Tk() #makes window
root.title("Interface")
myapp = MyApp(root) #this really runs program
root.mainloop() #keep window open
在我的程序中,我首先按下开始按钮。 我将打印“仍在工作”和图形用户界面将更新芯片号和闪烁完成灯一遍又一遍。“开始”按钮转到将执行10000次的函数。然而经过3000次迭代,gui冻结,但程序仍然打印“仍在工作”。如何防止gui崩溃?
我建议你从下面的代码开始?如果需要,您可以移植回Python 2,但是您的程序已经被重写为使用Python 3,并且已经被设计为使用
tkinter
的能力来使用after
方法调度将来的事件。希望您会发现代码更容易遵循。你的代码有很多问题。首先,这是有根本缺陷的:
你不能指望一个GUI在处理这样的代码时能正常工作。作为一般经验法则,您永远不应该拥有GUI调用的主线程
sleep
。导致sleep
阻止事件循环处理任何事件,包括刷新屏幕的请求等低级事件。stackoverflow上多次询问并回答了
sleep
的用法。你可能会发现其中一些问题很有用。例如还有一个问题属于内存泄漏的范畴。从while循环中,可以无限期地调用
self.start_button()
。这种情况大约每秒发生一次,因为在循环中调用sleep的时间是半秒,而在start_button
中调用sleep的时间是半秒。每次调用
start_button
时,都会创建另一个标签小部件,该小部件堆叠在第9行第2列的所有先前小部件之上。最终这会导致你的程序崩溃。我很惊讶它会导致你的程序很快失败,但这与重点无关。我的建议是从一个简单的例子开始,它只会每秒更新一个标签。让它工作,这样你就能理解基本的机制。然后,一旦它开始工作,你就可以添加从串行端口读取的代码。
相关问题 更多 >
编程相关推荐