목표 : main()에서 변수를 사용하고 코드에서 부분적으로 작동했지만 여전히 수정 방법을 모르는 여러 오류가 발생하는 임의의 메시지 목록을 만들려고했습니다.Python : main()에 정의 된 변수를 사용하거나 오류없이 두 클래스의 목록을 사용하는 방법은 무엇입니까?
질문 : 누군가 내 코드를 수정하여 오류가 사라지고 프로그램이 의도 한대로 작동 할 수 있습니까?
내 코드의 main() 섹션에서 나는 첫 번째 브레이크 타이머 이후에 내 프로그램의 타이머 섹션의 GUI를 엉망으로 만드는 몇 가지 버튼을 정의합니다. 객관적 상자는 창에 다시 나타나야하지만 그렇지 않습니다. 이것은 또한 .destroy() 명령과 관련이있을 수 있습니다. 레이블 및 입력 위젯이 초기 창에 다시 나타나도록 수정하는 방법은 무엇입니까?
이 질문의 다른 점 : 이러한 일반적인 오류에 관해 많은 질문이 있지만 제 코드가 고유하므로 다른 게시물이 필요하다는 것을 알고 있습니다.
코드 :
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()
다른 UI 요소가있는 "타이머"클래스에 버튼이 없다는 이유가 있습니까? 그렇다면 Timer 생성자가 존재하기 전에 Timer 생성자에 전달하려고하는 이유가 있습니까? –
그들이 사용하는 명령 : (tm.start, stop, reset 및 root.quit)은 main()을 통해서만 접근 할 수 있습니다. 반례를 보여줄 수 없다면. 한 친구가 Timer로 이동하도록 제안했지만, 작동하지 않을 때이를 포기하고 말하면서 그대로 두도록 노력했습니다. –
변수가 main에서 범위가 정해져있는 것처럼 보입니다. 모든 변수가 전역 변수가되도록하십시오. – cdarke