2016-11-02 6 views
-1

私はstackoverflowでも同様の回答を見ましたが、私は問題を解決できません。これは私の最初のプログラムです。 Windowsユーザーのみ(Windows 7以上)最初のEntry入力時に起動し、STARTボタンを押します。これがカウントを開始します。 2番目のエントリはパスワード用です。 「ダーク」とSTOPを押すとシャットダウンが停止します。そして時にXボタンでイム決算アプリケーション、それは私にこれを与える:tkinterのタイマー - "更新プログラムを呼び出せません"というエラーが表示される:アプリケーションが破棄されました。

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "C:\Python34\lib\tkinter\__init__.py", line 1482, in __call__ 
    return self.func(*args) 
    File "C:\MyWorld\newIdea.py", line 26, in startCount 
    root.update() 
    File "C:\Python34\lib\tkinter\__init__.py", line 965, in update 
    self.tk.call('update') 
_tkinter.TclError: can't invoke "update" command: application has been destroyed 

は、あなたは私がこの例外を扱う助けることができますか?または、このエラーを回避するために私のコードを編集するか?

import sys, time, os 
from tkinter import * 
import tkinter as tk 

def change_1(): 
    B1['state'] = tk.DISABLED 
    B2['state'] = tk.NORMAL 

def change_2(): 
    B1['state'] = tk.NORMAL 
    B2['state'] = tk.DISABLED 

def change_3(): 
    B1['state'] = tk.DISABLED 
    B2['state'] = tk.DISABLED 

def startCount(): 
    setTime = setMinutes.get() * 60 
    strTime = str(setTime) 
    timeSet = ("\""+"shutdown /s /f /t " +strTime+"\"") 
    os.system(timeSet) 
    change_1() 
    for t in range(setTime, -1, -1): 
     lcd = "{:02d}:{:02d}".format(*divmod(t, 60)) 
     timeString.set(lcd) 
     root.update() 
     time.sleep(1) 
    return 

def stopCount(): 
    passwd = "dark" 
    passwdGet = getPass.get() 
    if passwd != passwdGet: 
     messagebox.showinfo('Wrong', 'Its not correct password') 
     change_3() 
    else: 
     messagebox.showinfo('Good', 'Turn off canceled') 
     os.system("shutdown /a") 
     change_2() 
    return 

root = tk.Tk() 
setMinutes = IntVar() 
getPass = StringVar() 
timeString = StringVar() 
label_font = ('Verdana', 30) 
root.geometry('260x150+200+200') 
root.title('Timer v1.4') 
root.resizable(0, 0) 

L1 = Label(root, text='How much time You have?').grid(row=0, column=1) 

L2 = Label(root, textvariable=timeString, font=label_font, bg='white', 
     fg='orange', relief='raised', bd=3) 
L2.grid(row=1, columnspan=3, sticky='WE', padx=5, pady=5) 

E1 = Entry(root, textvariable=setMinutes).grid(row=2, column=1, padx=5, pady=5) 

B1 = Button(root, text='S T A R T', fg='green', bg='black', command=startCount) 
B1.grid(row=2, rowspan=2, sticky='NS', column=0, padx=5, pady=5) 

E2 = Entry(root, textvariable=getPass).grid(row=3, column=1, padx=5, pady=5) 

B2 = Button(root, text='S T O P', fg='red', bg='black', command=stopCount, 
      state=tk.DISABLED) 
B2.grid(row=2, rowspan=2, sticky='NS', column=2, padx=5, pady=5) 

root.mainloop() 
+0

タイマーを行う方法は、無限のルックと「スリープ」よりも優れています。このサイトには多くの例があります。単に[tkinter]タイマーを探してください。例:http://stackoverflow.com/q/2400262/7432 –

+0

あなたは正しいですし、前にこの例を見ましたが、クラスなしでこのコードを書く方法はわかりません。 OOPは重要ですが、初心者の学習者はすべて関数から始まります – guest013

+0

誰かが私にこのように正しいことを教えてもらえますか?私のプログラムの他のすべては大丈夫です、タイマーは修正する必要があります – guest013

答えて

0

相続人の答え:

def startCount(): 
    setTime = setMinutes.get() * 60 
    strTime = str(setTime) 
    timeSet = ("\""+"shutdown /s /f /t " +strTime+"\"") 
    os.system(timeSet) 
    change_1() 
    for t in range(setTime, -1, -1): 
     lcd = "{:02d}:{:02d}".format(*divmod(t, 60)) 
     timeString.set(lcd) 
     try: 
      root.update() 
     except TclError: 
      messagebox.showinfo('Info', 'Application terminated') 
      return 
     time.sleep(1) 
    return 

今すぐエラーが表示されません。しかし、新しいクリーンなtkウィンドウが表示されます:)次回は自分自身で正しい答えを得るでしょう

関連する問題