Python:main()で定義された変数を使用したり、エラーなしで2つのクラスを持つリストを使用したりするにはどうすればよいですか?

Rick_Roll

目的: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]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ