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

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

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

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1309閲覧

【python】Tkinterでリストの中身を表示したい。

EgyptianMau

総合スコア11

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/03/27 15:10

実現したい動作: リストに含まれる番号を表示させたい。

具体的には、空欄に番号を入力して、「追加」をクリックすると、リストにすでに含まれていなければリストに追加して表示。逆に空欄に番号を入力して、「削除」をクリックすると、リストにあればリストから削除して表示。
現状:空欄に番号を入力して、その番号をリストの中に追加したり、番号をリストから削除するように、プログラムを書きましたが、リストの中身をTkinterで表示させる方法が思いつきませんでした。

python

1import datetime 2import tkinter 3 4def show_time(win,Ttext): #現在時刻を表示 5 NOW=datetime.datetime.today() 6 Ttext.set('現在時刻:'+str(NOW.year)+"/"+str(NOW.month).zfill(2)+"/"+str(NOW.day).zfill(2)+"-"+str(NOW.hour).zfill(2)+":"+str(NOW.minute).zfill(2)+":"+str(NOW.second).zfill(2)) 7 win.after(5, lambda : show_time(win, Ttext)) 8 9def add_list(LIST,NUM): 10 if NUM in LIST: 11 pass 12 elif NUM=='': 13 pass 14 else: 15 LIST.append(NUM) 16 print(LIST) 17 18def delete_list(LIST,NUM): 19 if NUM in LIST: 20 list = [x for x in LIST if x != NUM] 21 elif NUM=='': 22 list=LIST 23 else: 24 list=LIST 25 print(list) 26 27def main(): 28 win = tkinter.Tk() 29 win.title("WINDOW") 30 win.geometry("500x300") 31 32 Ttext = tkinter.StringVar() 33 TIME=tkinter.Label(win, textvariable=Ttext) 34 TIME.pack() 35 TIME.after(5,lambda :show_time(win,Ttext)) 36 37 label = tkinter.Label(win, text='番号を入力してください:') 38 label.pack() 39 40 text = tkinter.Entry(win) 41 text.pack() 42 43 LIST=[] 44 Button = tkinter.Button( win , text='追加' , command=lambda : [add_list(LIST,text.get()),text.delete(0, tkinter.END)]) 45 Button.pack() 46 47 Button = tkinter.Button( win , text='削除' , command=lambda : [delete_list(LIST,text.get()),text.delete(0, tkinter.END)]) 48 Button.pack() 49 50 def QUITE(): 51 win.quit() 52 Button = tkinter.Button(win, text='画面を閉じる') 53 Button["command"]=QUITE 54 Button.pack() 55 56 win.mainloop() 57 58 59main()

stringvarを使えばできるかなと考えましたが、自分で考えたり、現状のまま調べても進展がなかったので質問しました。何かヒントになることでも構わないので、教えていただけるとありがたいです。よろしくお願いします。

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

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

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

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

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

guest

回答2

0

stringvarを使えばできるかなと考えましたが、

python

1import datetime 2import tkinter 3 4def show_time(win, Ttext): #現在時刻を表示 5 Ttext.set(f'現在時刻:{datetime.datetime.today():%Y/%-m/%-d-%H:%M:%S}') 6 win.after(1000, lambda : show_time(win, Ttext)) 7 8def add_list(LIST, NUM): 9 if NUM and NUM not in LIST['lst']: 10 LIST['lst'].append(NUM) 11 LIST['var'].set(' '.join(LIST['lst'])) 12 13def delete_list(LIST, NUM): 14 if NUM and NUM in LIST['lst']: 15 LIST['lst'].remove(NUM) 16 LIST['var'].set(' '.join(LIST['lst'])) 17 18def main(): 19 win = tkinter.Tk() 20 win.title("WINDOW") 21 win.geometry("500x300") 22 23 Ttext = tkinter.StringVar() 24 TIME = tkinter.Label(win, textvariable=Ttext, font=(None, 12, 'bold')) 25 TIME.pack() 26 show_time(win, Ttext) 27 28 numbers = tkinter.StringVar() 29 numbers_list = tkinter.Label(win, textvariable=numbers) 30 numbers_list.pack() 31 32 label = tkinter.Label(win, text='番号を入力してください:') 33 label.pack() 34 35 text = tkinter.Entry(win) 36 text.pack() 37 38 LIST = {'lst': [], 'var': numbers} 39 Button = tkinter.Button( 40 win, text='追加', 41 command=lambda : (add_list(LIST, text.get()), text.delete(0, tkinter.END))) 42 Button.pack() 43 44 Button = tkinter.Button( 45 win, text='削除', 46 command=lambda : (delete_list(LIST, text.get()), text.delete(0, tkinter.END))) 47 Button.pack() 48 49 Button = tkinter.Button(win, text='画面を閉じる', command=win.quit) 50 Button.pack() 51 52 win.mainloop() 53 54if __name__ == '__main__': 55 main()

投稿2022/03/27 18:58

melian

総合スコア19805

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

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

EgyptianMau

2022/03/28 14:34

時刻表示の部分でエラーが出ましたが、手直ししたら、まさに私が思い描いていたように動作しました!感動です。 私の拙く醜いコードを踏襲したうえでの回答をしてくださり、理解しやすかったです。 辞書を使うと実現できるのは驚きでした。辞書をこのように使えるなんて、ここで教えてもらえなければ知らないままだったと思います。 ”if __name__ == '__main__':”というのも初めて知りました。使い方はまだマスターできていませんが、どんなものかは何となく理解できました。 本当にありがとうございます。 元のコード  :Ttext.set(f'現在時刻:{datetime.datetime.today():%Y/%-m/%-d-%H:%M:%S}') 変更後のコード:Ttext.set(f'現在時刻:{datetime.datetime.today():%Y/%m/%d-%H:%M:%S}')
guest

0

ベストアンサー

command引数に無理やり押し込まずに、関数内関数にして処理してはいかがですか?
関数内関数が多くなるようでしたら、class定義にしてメソッドにすればスッキリしますよ。
時刻表示は f-string で簡略化できます。5ミリ秒毎に時刻表示するのはCPUの無駄遣いなので、1秒毎更新でいいと思いますよ。

あと、Pythonには「PEP8: Pythonコードのスタイルガイド」があって、命名規則が書いてあります。

  • 定数名: 英大文字とアンダースコア文字
  • 変数名: 英小文字とアンダースコア文字
  • 関数名: 英小文字とアンダースコア文字
  • クラス名: 英大文字始まり単語を連結

python

1import datetime 2import tkinter 3 4 5def show_time(label): # 現在時刻を表示 6 now = datetime.datetime.today() 7 label['text'] = f'現在時刻:{now:%Y/%m/%d %H:%M:%S}' 8 label.after(1000, lambda: show_time(label)) 9 10 11def add(number, numbers): 12 if number and number not in numbers: 13 numbers.append(number) 14 print(numbers) 15 16 17def remove(number, numbers): 18 if number in numbers: 19 numbers.remove(number) 20 print(numbers) 21 22 23def main(): 24 win = tkinter.Tk() 25 win.title("WINDOW") 26 win.geometry("500x300") 27 28 time = tkinter.Label(win) 29 time.pack() 30 time.after(5, lambda: show_time(time)) 31 32 numbers = [] 33 numbers_display = tkinter.Label(text=' '.join(numbers)) 34 numbers_display.pack() 35 36 label = tkinter.Label(win, text='番号を入力してください:') 37 label.pack() 38 39 entry = tkinter.Entry(win) 40 entry.pack() 41 42 def add_number(): 43 number = entry.get().strip() 44 add(number, numbers) 45 numbers_display['text'] = ' '.join(numbers) 46 entry.delete(0, tkinter.END) 47 48 def remove_number(): 49 number = entry.get().strip() 50 remove(number, numbers) 51 numbers_display['text'] = ' '.join(numbers) 52 entry.delete(0, tkinter.END) 53 54 button = tkinter.Button(win, text='追加', command=add_number) 55 button.pack() 56 57 button = tkinter.Button(win, text='削除', command=remove_number) 58 button.pack() 59 60 button = tkinter.Button(win, text='画面を閉じる', command=win.quit) 61 button.pack() 62 63 win.mainloop() 64 65 66main()

クラス定義にするとこんな感じです。

python

1import datetime 2import tkinter 3 4 5class App: 6 7 def __init__(self, win): 8 self.time = tkinter.Label(win) 9 self.time.pack() 10 11 self.numbers = [] 12 self.numbers_display = tkinter.Label(text=' '.join(self.numbers)) 13 self.numbers_display.pack() 14 15 label = tkinter.Label(win, text='番号を入力してください:') 16 label.pack() 17 18 self.entry = tkinter.Entry(win) 19 self.entry.pack() 20 21 button = tkinter.Button(win, text='追加', command=self.add) 22 button.pack() 23 24 button = tkinter.Button(win, text='削除', command=self.remove) 25 button.pack() 26 27 button = tkinter.Button(win, text='画面を閉じる', command=win.quit) 28 button.pack() 29 30 def show_time(self): # 現在時刻を表示 31 now = datetime.datetime.today() 32 self.time['text'] = f'現在時刻:{now:%Y/%m/%d %H:%M:%S}' 33 self.time.after(1000, self.show_time) 34 35 def add(self): 36 number = self.entry.get().strip() 37 if number and number not in self.numbers: 38 self.numbers.append(number) 39 self.numbers_display['text'] = ' '.join(self.numbers) 40 self.entry.delete(0, tkinter.END) 41 42 def remove(self): 43 number = self.entry.get().strip() 44 if number in self.numbers: 45 self.numbers.remove(number) 46 self.numbers_display['text'] = ' '.join(self.numbers) 47 self.entry.delete(0, tkinter.END) 48 49 50def main(): 51 win = tkinter.Tk() 52 win.title("WINDOW") 53 win.geometry("500x300") 54 app = App(win) 55 app.show_time() 56 win.mainloop() 57 58 59main()

投稿2022/03/27 16:44

編集2022/03/28 15:03
shiracamus

総合スコア5406

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

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

EgyptianMau

2022/03/28 14:34

独学の初学者の私にとってありがたい回答です。大変勉強になります。 命名規則や時刻表示の簡略化などまで教えていただけて本当にありがたいです。 関数内関数が多くなると個人的には読みにくいと感じて、command引数にしてましたが、今回、classを定義する意義を初めて実感しました。ありがとうございます。 何度か回答を編集し直してくださっていたようでわざわざありがとうございます。 些細なことなのですが、リストの中身だけを表示するにはどうすればいいのでしょうか。。。 一個目だとnumbers_display = tkinter.Label(text=str(numbers))あたりをいじればいいかなと思ったのですが、うまくいかなくて、もし教えてもらえるとありがたいです。
shiracamus

2022/03/28 15:04

リストの中身だけ表示するように変更しました。
EgyptianMau

2022/03/28 15:23

ありがとうございます。 まだ理解が追い付かない点がいくつかありますが、これから何度も読んで調べて一つずつ理解を深めていきたいと思います。 綺麗なコードだと思うのでこのサイトを利用している初心者にとってより参考になるのではないかという観点からこの回答をベストアンサーに選ばせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問