2016-05-25 3 views
0

タイマー実行時に問題が発生しているプログラムを実行しています。 "start"がヒットするたびに、アプリケーションがクラッシュします。何かご意見は?TKinterアプリケーションでクラッシュする問題

##-- Imports --## 

import time 
import openpyxl as xl 
from Tkinter import * 

##-- Classes --## 

class App(Frame): 

    def startTimer(self): 
     self.check = True 
     self.now = time.strftime("%H:%M:%S") 

     while self.check == True: 
      self.timer.configure(text = self.now) 
      time.sleep(1) 

    def initUI(self): 
     self.parent.title("Emma's Time Manager") 
     self.pack(fill = BOTH, expand = 1) 

    def initWidget(self): 

     ##Create button definitions## 
     self.buttonwidth = 12 
     self.quit = Button(self, text = "Quit", comman = self.quit, width = self.buttonwidth) 
     self.newClient = Button(self, text = "Add Client", command = lambda:self.newClientFunc(), width = self.buttonwidth) 
     self.timeStart = Button(self, text = "Start", command = lambda:self.startTimer(), width = self.buttonwidth) 
     self.timeEnd = Button(self, text = "End", command = lambda:self.endTimer(), width = self.buttonwidth) 
     self.saveBut = Button(self, text = "Save", command = lambda:self.saveFunc(), width = self.buttonwidth) 
     self.viewClient = Button(self, text = "View Client", command = lambda:self.viewCliFunc(), width = self.buttonwidth) 


     ##Create lable definitions## 
     self.timer = Label(self, text = "00:00:00") ##self.timer used as display for timer## 

     ##Create the listbox for Client Selection## 
     self.wb = xl.load_workbook("clients.xlsx") 
     self.clientNames = self.wb.get_sheet_names() 
     self.clivar = StringVar(self) 
     self.clivar.set(self.clientNames[0]) 
     self.clilist = apply(OptionMenu, (self, self.clivar) + tuple(self.clientNames)) 

     ##Create Entry Box to describe work information## 
     self.info = Entry(self, width = 50) 


     ##Create GUI for widgets## 
     self.clilist.grid(row = 0, column = 0) 
     self.timer.grid(row = 0, column = 1) 
     self.timeStart.grid(row = 0, column = 2) 
     self.timeEnd.grid(row = 0, column = 3) 
     self.info.grid(row = 1, column = 0, columnspan = 4) 
     self.newClient.grid(row = 2, column = 0) 
     self.viewClient.grid(row = 2, column = 1) 
     self.saveBut.grid(row = 2, column = 2) 
     self.quit.grid(row = 2, column = 3) 


    def __init__(self, parent): 
     Frame.__init__(self, parent, background = "light blue") 
     self.parent = parent 
     self.initUI() 
     self.initWidget() 

def main(): 
    try: 
     xl.load_workbook("clients.xlsx") 
    except: 
     temp = xl.Workbook() 
     temp.save("clients.xlsx") 
     temp.remove_sheet(temp.get_sheet_by_name("Sheet")) 

    root = Tk()  
    bob = App(root) 
    root.mainloop() 

main() 

ほとんどのプログラムはまだ完了していませんのでご注意ください。私はちょうどこのタイマーが正しく動作するように見えることができません。

+0

どのように「クラッシュする」?エラーメッセージが表示されますか?アプリはフリーズしますか?他に何か? –

+0

@BryanOakleyクラッシュで私はそれがちょうど凍っていることを意味し、その後数秒後にウィンドウが閉じる必要があると言います。 –

+1

あなたは無限ループをしているので、フリーズしています。あなたが眠っている間、そしてあなたがループしている間、 'mainloop'はウィンドウを再描画するなどのシステムイベントを含むどんなイベントも処理することができません。 –

答えて

0

あなたのループwhileの方法がないようですね。 self.checkFalseに設定するか、ループの外にbreakを設定する必要があります。

while self.check == True: 
    self.timer.configure(text = self.now) 
    time.sleep(1) 
+0

しかし、それはほとんどの設定でフリーズすることはありません。 –

+0

@NoahPotvin:コントロールをイベントループに戻さない場合は、guiをフリーズします(単一のスレッドがあります)。 'time.sleep(1)'は制御を生成しません。 loop in tkinter](https://gist.github.com/zed/74f62de8a4d99e4e9c399808c6e004e1)をクリックします。 – jfs

関連する問題