質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

0回答

394閲覧

変数が生成された場所

yutaka_1213

総合スコア7

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/05/25 04:51

todoitem.pyとtodocontainer.pyをインポートしてtodoapp.pyでtkを使って
todoリストを表示するプログラムです。

動かすことはできたのですが、todosという変数がどこで生成されたのかが
わかりませんでした。
説明が足りないと思いますが、もし可能であればtodosがどのタイミングで
生成されたのか教えていただけないでしょうか。
よろしくお願いいたします。


todoitem.py

from datetime import datetime, timedelta

class ToDoItem(object):

#ToDo項目を保存 def __init__(self, title, description, duedate, addeddate=None): #ToDo項目初期化 if not addeddate: addeddate = datetime.now() self.title = title self.description = description self.duedate = duedate self.addeddate = addeddate self.finished = False self.finisheddate = None def finish(self, date=None): #ToDo項目を終了 self.finished = True if not date: date = datetime.now() self.finisheddate = date def __repr__(self): #ToDo項目の表示形式文字列を作る return "<ToDoItem {}, {}>".format( self.title, self.duedate.strftime('%Y/%m/%d %H:%M'))

todocontainer.py

from datetime import datetime, timedelta

class ToDoContainer(object):
#ToDo項目のリストを保存
def init(self):

#ToDo項目のリストのインスタンスを初期化 self.todos = [] def __len__(self): #ToDo項目の数を返す return len(self.todos) def sort(self): #ToDoを締め切り日でソート self.todos.sort(key=lambda x : x.duedate) #!!! def __add__(self, item): #「+」演算子をエミュレートして,ToDo項目を追加 self.todos.append(item) self.sort() def __iadd__(self, item): """ 「+=」演算子をエミュレートして,ToDo項目を追加 """ self.__add__(item) return self def __getitem__(self, idx): """ インデックスアクセスをエミュレート """ return self.todos[idx] def __setitem__(self, idx, item): """ インデックスの代入ををエミュレート """ self.todos[idx] = item self.sort() def __delitem__(self, idx): """ インデックスを指定したdelをエミュレート """ del self.todos[idx] def get_remaining_todos(self): """ 終了していないToDo項目をリストとして返す """ return [t for t in self.todos if not t.finished]

todoapp.py

from datetime import datetime
from pickle import dump, load

from tkinter import *
import tkinter.messagebox

from todoitem import ToDoItem
from todocontainer import ToDoContainer

DUMPFILE = 'todo.dat'

class ToDoApp(Frame):

#ToDo GUIアプリ用のクラス def __init__(self, master=None): Frame.__init__(self, master, padx=8, pady=4) self.pack() self.createwidgets() t = self.winfo_toplevel() t.resizable(False, False) self.load() sec = datetime.now().second self.after((60-sec)*1000, self.refreshitems) self.sel_index = -1 def createwidgets(self): #ボタンなどウインドウの部品を作る self.frame1 = Frame(self) frame = self.frame1 self.listbox = Listbox(frame, height=10, width=30, selectmode=SINGLE, takefocus=1) self.yscroll = Scrollbar(frame, orient=VERTICAL) # 配置 self.listbox.grid(row=0, column=0, sticky=NS) self.yscroll.grid(row=0, column=1, sticky=NS) # 動きとコードをつなげる self.yscroll.config(command=self.listbox.yview) self.listbox.config(yscrollcommand=self.yscroll.set) self.listbox.bind("<ButtonRelease-1>", self.selectitem) self.frame1.grid(row=0, column=0) self.frame2 = Frame(self) frame = self.frame2 self.title_l = Label(frame, text="タイトル") self.description_l = Label(frame, text="詳細") self.duedate_l = Label(frame, text="締め切り") self.title_e = Entry(frame, justify=LEFT, width=20) self.description_e = Entry(frame, justify=LEFT, width=20) self.duedate_e = Entry(frame, justify=LEFT, width=20) self.finished_v = IntVar() self.finished_c = Checkbutton(frame, justify=LEFT, text="終了", variable=self.finished_v) self.update_button = Button(frame, text="更新", state=DISABLED, command=self.updateitem) self.delete_button = Button(frame, text="削除", state=DISABLED, command=self.deleteitem) self.new_button = Button(frame, text="新規", command=self.createitem) # 配置 self.title_l.grid(row=0, column=0, columnspan=2) self.title_e.grid(row=1, column=0, columnspan=2) self.description_l.grid(row=2, column=0, columnspan=2) self.description_e.grid(row=3, column=0, columnspan=2) self.duedate_l.grid(row=4, column=0, columnspan=2) self.duedate_e.grid(row=5, column=0, columnspan=2) self.finished_c.grid(row=6, column=0, columnspan=2) self.update_button.grid(row=7, column=0) self.delete_button.grid(row=7, column=1) self.new_button.grid(row=8, column=0, columnspan=2) self.frame2.grid(row=0, column=1) def load(self): #ToDoのデータをファイルから読み込む try: f = open(DUMPFILE, 'rb') #!!! self.todos = load(f) except IOError: self.todos = ToDoContainer() def save(self): """ ToDoのデータをファイルに書き出す """ f = open(DUMPFILE, 'wb') #!!! dump(self.todos, f) def setlistitems(self): """ ToDoのうち未消化分をリストに表示する """ self.listbox.delete(0, END) for todo in self.todos.get_remaining_todos(): d = todo.duedate t = todo.title.ljust(20) if todo.duedate < datetime.now(): t = '* '+t # ToDoの期限が過ぎていたら*を前につける item = "{} {:4}/{:02}/{:02} {:02}:{:02}".format( t, d.year, d.month, d.day, d.hour, d.minute) self.listbox.insert(END, item) def refreshitems(self): """ タイマーで定期的に呼び出されるメソッド ToDoのうち時間になったものがあればダイアログで知らせる """ dirty = False for todo in self.todos.get_remaining_todos(): td = datetime.now() d = todo.duedate if (d.year == td.year == td.year and d.month == td.month and d.day == td.day and d.hour == td.hour and d.minute == td.minute): msg = "{}の時間です。\n {}\n {}".format( todo.title, todo.description, todo.duedate.strftime('%Y/%m%d %H:%M')) tkinter.messagebox.showwarning("時間です", msg) dirty = True sec = datetime.now().second self.after((60-sec)*1000, self.refreshitems) if dirty: self.setlistitems() def clearentries(self): """ 予定入力フィールドを消去する """ self.title_e.delete(0, END) self.description_e.delete(0, END) self.duedate_e.delete(0, END) self.finished_c.deselect() def selectitem(self, event): #Listboxで項目が選択されたときに呼ばれるメソッド #入力フィールドに選択された項目を反映 self.delete_button.config(state=NORMAL) self.update_button.config(state=NORMAL) for idx in self.listbox.curselection(): i = int(idx) self.sel_index = i td = self.todos.get_remaining_todos()[i] self.clearentries() self.title_e.insert(0, td.title) self.description_e.insert(0, td.description) ddtxt = td.duedate.strftime('%Y/%m/%d %H:%M') self.duedate_e.insert(0, ddtxt) if td.finished: self.finished_c.select() else: self.finished_c.deselect() def refrectententries(self, todo): #フィールドに入力された文字列をToDoItemインスタンスに反映する todo.title = self.title_e.get() todo.description = self.description_e.get() dt = datetime.strptime(self.duedate_e.get()+':00', '%Y/%m/%d %H:%M:%S') todo.duedate = dt if self.finished_v.get() != 0: todo.finish() def createitem(self): #新しいToDOアイテムを作る todo = ToDoItem('', '', datetime.now()) self.refrectententries(todo) self.todos += todo self.clearentries() self.setlistitems() self.sel_index = -1 self.save() def updateitem(self): #入力フィールドの情報を選択中のToDOアイテムに反映 if self.sel_index != -1: i = self.sel_index todo = self.todos.get_remaining_todos()[i] self.todos.sort() self.refrectententries(todo) self.sel_index = -1 self.clearentries() self.setlistitems() self.save() def deleteitem(self): #Listboxで選択されているToDoのアイテムを消去 for idx in self.listbox.curselection(): i = int(idx) todo = self.todos.get_remaining_todos()[i] real_idx = self.todos.todos.index(todo) del self.todos[real_idx] self.todos.sort() self.clearentries() self.setlistitems() self.save()

def main():

root = Tk() app = ToDoApp() app.setlistitems() app.mainloop() root.destroy()

if name == 'main':
main()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問