2015-01-10 1 views
0

목표 : 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() 
+0

다른 UI 요소가있는 "타이머"클래스에 버튼이 없다는 이유가 있습니까? 그렇다면 Timer 생성자가 존재하기 전에 Timer 생성자에 전달하려고하는 이유가 있습니까? –

+0

그들이 사용하는 명령 : (tm.start, stop, reset 및 root.quit)은 main()을 통해서만 접근 할 수 있습니다. 반례를 보여줄 수 없다면. 한 친구가 Timer로 이동하도록 제안했지만, 작동하지 않을 때이를 포기하고 말하면서 그대로 두도록 노력했습니다. –

+0

변수가 main에서 범위가 정해져있는 것처럼 보입니다. 모든 변수가 전역 변수가되도록하십시오. – cdarke

답변

0

죄송합니다 (이 모두 좋아하는 IDE로를 끌어와 디버그를 실행, 제대로 포맷해야합니다),하지만 귀하의 질문에 들여 쓰기 코드가 매우 옳지 않다. 그러나 —은 비교적 사소한 문제는 아니며 다음 수정 된 버전이 모든 질문을 해결하지 못한다는 사실을 알고 있습니다. — main()의 변수 사용에 대한 오류를 없애기 때문에 유용 할 수 있습니다. Timer 클래스, 참조 된 유일한 장소, __init__() 메소드 — essentialy에서 @Mikke Housky가 제안한 에서 초기화하는 클래스입니다. 좀 더 일관성있게하기 위해 몇 가지 이름을 변경했습니다.

이렇게하면 남은 문제를 직접 처리 할 수 ​​있도록 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() 
+0

작은 들여 쓰기 오류를 수정 해 주셔서 감사합니다. 나는 어딘가에서 엉망이되었다는 것을 알았다. :) –

+0

그리고 그 외에, 나를 도와 줘서 고마워! 나는 프로그래밍 현장에 새로운 사람이되었으며,이 사이트는 나에게 매우 고무적이다. –

+0

당신을 진심으로 환영합니다. FWIW, 나는 내 자신이나 다른 사람들의 문제를 고쳐서 새로운 것을 배우거나 내가 이미 알고 있거나 들었다고 생각하는 것들에 대한 나의 이해를 다듬을 훌륭한 변명이라고 발견했습니다. – martineau

관련 문제