【发布时间】:2015-07-23 15:01:20
【问题描述】:
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
在我的程序中,我首先按下开始按钮。 我将打印“仍在工作”,GUI 将更新芯片编号并一遍又一遍地闪烁完成指示灯。开始按钮转到将执行 10000 次的功能。然而,经过 3000 次迭代,gui 冻结,但程序仍然打印“仍在工作”。如何防止 gui 崩溃?
【问题讨论】:
-
可能你应该把方法放在一个单独的线程中。见这里stackoverflow.com/questions/16745507/…
-
尝试使用 Tkinter 的
after而不是sleep -
FWIW,您应该使用
time.time()而不是timeit.default_timer()。这两个名称都指代同一个函数,但time.time()对阅读您的代码的人来说更有意义。 -
我不确定如何使用 after 方法
-
我更新了我的代码并摆脱了睡眠。仍在尝试找出解决方案