目的:main()で変数を使用し、コードでメッセージのランダムリストを作成しようとしましたが、部分的には機能しましたが、修正方法がわからない複数のエラーが発生しています。
質問:誰かが私のコードを修正してエラーがなくなり、プログラムが少なくとも意図したとおりに機能するようにすることはできますか?
コードのmain()セクションで、いくつかのボタンを定義します。これは、最初のブレークタイマーの後で、プログラムのタイマーセクションのGUIを台無しにすると思います。目的のボックスがウィンドウに再表示されるはずですが、表示されません。これは、.destroy()コマンドと関係がある場合もあります。ラベルとエントリウィジェットが最初のウィンドウに再表示されるように修正するにはどうすればよいですか?
この質問の違い:これらの一般的なエラーのいくつかに関して多くの質問があることを認識していますが、私のコードは一意であるため、別の投稿が必要です。
コード:(これはすべて正しくフォーマットされている必要があります。お気に入りのIDEにプルし、実行してデバッグします)
from Tkinter import *
import time
import random
class PopUp():
def __init__(self):
top = self.top = Toplevel()
self.inp = StringVar()
self.nth = 0
top.geometry("240x135+25+300")
Label(top, text="Suggestion:").pack(side=TOP)
self.message()
Label(top, textvariable=self.inp)
def message(self):
self.inp.set(random.choice(self.mess))
mess = ['Nice Job! Go take a walk outside!',
'Nice Job! Wiggle your toes, and get back on it!',
'Nice Job! Get up and walk around!',
'Nice Job! Go get a drink of water!',
'Good Work! Go take a walk outside!',
'Good Work! Wiggle your toes, and get back on it!',
'Good Work! Get up and walk around!',
'Good Work! Go get a drink of water!']
class Timer(Frame):
def __init__(self, stb, st, rb, qb, parent=None, **kw):
Frame.__init__(self, parent, background="white")
self.parent = parent
self.initUI()
self.inp = None
self.stb = stb
self.st = st
self.rb = rb
self.qb = qb
self.timer1 = 9
self.checkTimer1 = 1
self.timer1Run = 0
self.tempObj = 0
self.entdat = StringVar()
self.timestr = StringVar()
self.makeTimer()
self.makeWidgets()
def initUI(self):
self.parent.title("Timer")
def makeWidgets(self):
minutes = int(self.timer1/60)
seconds = int(self.timer1 - minutes*60.0)
self.timestr.set('%02d:%02d' % (minutes, seconds))
self.ol = Label(text="Objective:")
self.ol.pack(fill=X, expand=NO, pady=2, padx=2, side=TOP)
self.ew = Entry(textvariable=self.entdat)
self.ew.pack(fill=X, expand=NO, pady=2, padx=2, side=TOP)
self.b = Button(text="OK", command=self.clicked)
self.b.pack(side=TOP)
def makeTimer(self):
self.l = Label(self, textvariable=self.timestr)
self.l.pack(fill=X, expand=NO, pady=2, padx=2)
def makeButtons(self, st, stb, rb, qb):
self.destroy()
def updateTime(self):
self.elapsed = time.time() - self.startTime
self.curtim1 = self.timer1 - self.elapsed
if self.curtim1 <= 0:
self.stop()
self.checkValue()
else:
minutes = int(self.curtim1/60)
seconds = int(self.curtim1 - minutes*60.0)
self.timestr.set('%02d:%02d' % (minutes, seconds))
self.timer = self.after(1, self.updateTime)
def checkValue(self):
if self.checkTimer1 == 1:
self.distroy_Widget()
self.timer1 = 3
self.checkTimer1 -= 1
self.start()
else:
self.dat.destroy()
self.makeWidgets()
self.timer1 = 9
self.checkTimer1 += 1
pu = PopUp()
pu.message()
self.start()
def start(self):
if not self.timer1Run:
self.startTime = time.time()
self.updateTime()
self.timer1Run = 1
def stop(self):
if self.timer1Run:
self.after_cancel(self.timer)
self.timer1Run = 0
self.timer1 = self.curtim1
def reset(self):
self.timer1 = 900
minutes = int(self.timer1/60)
seconds = int(self.timer1 - minutes*60.0)
self.timestr.set('%02d:%02d' % (minutes, seconds))
def clicked(self):
self.distroy_Widget()
self.dat = Label(self, textvariable=self.entdat)
self.dat.pack(side=TOP)
def distroy_Widget(self):
self.ew.destroy()
self.ol.destroy()
self.b.destroy()
def main():
root = Tk()
root.geometry("240x235+25+50")
tm = Timer(root, stb, sb, rb, qb)
tm.pack(side=TOP)
sb = Button(root, text='Start', command=tm.start).pack(side=LEFT)
stb = Button(root, text='Pause', command=tm.stop).pack(side=LEFT)
rb = Button(root, text='Reset', command=tm.reset).pack(side=LEFT)
qb = Button(root, text='Quit', command=root.quit).pack(side=LEFT)
mainloop()
if __name__ == '__main__':
main()
申し訳ありませんが、質問のコードインデントは正しくありません。ただし、その比較的小さな問題と、次の修正バージョンではすべての質問に対応できないという事実を無視すると、変数をのmain()
すべての属性にすることで変数の使用に関するエラーを取り除くことができるので、それでも役立つ場合があります。Timer
クラス、それらが参照される唯一の場所、およびその__init__()
メソッドでそれらを初期化する-本質的には@MikeHouskyが彼のコメントで提案したものです。また、一貫性を保つためにいくつかの名前を変更しました。
これにより、GUIが十分に実行され、残りの問題に自分で対処できるようになります。
from Tkinter import *
import time
import random
class PopUp():
def __init__(self):
top = self.top = Toplevel()
self.inp = StringVar()
self.nth = 0
top.geometry("240x135+25+300")
Label(top, text="Suggestion:").pack(side=TOP)
self.message()
Label(top, textvariable=self.inp)
def message(self):
self.inp.set(random.choice(self.mess))
mess = ['Nice Job! Go take a walk outside!',
'Nice Job! Wiggle your toes, and get back on it!',
'Nice Job! Get up and walk around!',
'Nice Job! Go get a drink of water!',
'Good Work! Go take a walk outside!',
'Good Work! Wiggle your toes, and get back on it!',
'Good Work! Get up and walk around!',
'Good Work! Go get a drink of water!']
class Timer(Frame):
def __init__(self, parent=None, **kw):
Frame.__init__(self, parent, background="white")
self.initUI(parent)
self.inp = None
self.timer1 = 9
self.checkTimer1 = 1
self.timer1Run = 0
self.tempObj = 0
self.entdat = StringVar()
self.timestr = StringVar()
self.makeTimer()
self.makeWidgets()
def initUI(self, parent):
self.parent = parent
self.parent.title("Timer")
self.sb = Button(self.parent, text='Start',
command=self.start).pack(side=LEFT)
self.stb = Button(self.parent, text='Pause',
command=self.stop).pack(side=LEFT)
self.rb = Button(self.parent, text='Reset',
command=self.reset).pack(side=LEFT)
self.qb = Button(self.parent, text='Quit',
command=parent.quit).pack(side=LEFT)
def makeWidgets(self):
minutes = int(self.timer1/60)
seconds = int(self.timer1 - minutes*60.0)
self.timestr.set('%02d:%02d' % (minutes, seconds))
self.ol = Label(text="Objective:")
self.ol.pack(fill=X, expand=NO, pady=2, padx=2, side=TOP)
self.ew = Entry(textvariable=self.entdat)
self.ew.pack(fill=X, expand=NO, pady=2, padx=2, side=TOP)
self.b = Button(text="OK", command=self.clicked)
self.b.pack(side=TOP)
def makeTimer(self):
self.l = Label(self, textvariable=self.timestr)
self.l.pack(fill=X, expand=NO, pady=2, padx=2)
def updateTime(self):
self.elapsed = time.time() - self.startTime
self.curtim1 = self.timer1 - self.elapsed
if self.curtim1 <= 0:
self.stop()
self.checkValue()
else:
minutes = int(self.curtim1/60)
seconds = int(self.curtim1 - minutes*60.0)
self.timestr.set('%02d:%02d' % (minutes, seconds))
self.timer = self.after(1, self.updateTime)
def checkValue(self):
if self.checkTimer1 == 1:
self.destroyWidgets()
self.timer1 = 3
self.checkTimer1 -= 1
self.start()
else:
self.dat.destroy()
self.makeWidgets()
self.timer1 = 9
self.checkTimer1 += 1
pu = PopUp()
pu.message()
self.start()
def start(self):
if not self.timer1Run:
self.startTime = time.time()
self.updateTime()
self.timer1Run = 1
def stop(self):
if self.timer1Run:
self.after_cancel(self.timer)
self.timer1Run = 0
self.timer1 = self.curtim1
def reset(self):
self.timer1 = 900
minutes = int(self.timer1/60)
seconds = int(self.timer1 - minutes*60.0)
self.timestr.set('%02d:%02d' % (minutes, seconds))
def clicked(self):
self.destroyWidgets()
self.dat = Label(self, textvariable=self.entdat)
self.dat.pack(side=TOP)
def destroyWidgets(self):
self.ew.destroy()
self.ol.destroy()
self.b.destroy()
def main():
root = Tk()
root.geometry("240x235+25+50")
tm = Timer(root)
tm.pack(side=TOP)
mainloop()
if __name__ == '__main__':
main()
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加