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

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

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

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

Q&A

3回答

946閲覧

Tkinterで初めて作ったアプリ コードを綺麗にしたい

sakosako

総合スコア0

Tkinter

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

0グッド

0クリップ

投稿2021/04/22 06:33

前提・実現したいこと

マイコン+LCDで同様のシステムを作ってみようと思っていますが、部品が届くまでに
pythonで画面の検討をしています。

・"Push"ボタンを押すと変更したいパラメータが切り替わる
・"+"、"-"ボタンを押すと数値を変更できる
・resetボタンで表示している数値を0に戻せる

発生している問題・エラーメッセージ

問題は発生していないのですが初めて作ったアプリで、コードが冗長な気がします。
特にボタンに対応する関数の記述は同じ内容が含まれています。
これからボタンを増やそうと思っているのでコードを綺麗にしたいです。
アドバイスいただけないでしょうか。

該当のソースコード

Python

1import tkinter as tk 2 3root = tk.Tk() 4root.title(u"Selector") 5root.geometry("750x280") 6 7counter = 0 8numA = 0 9numB = 0 10numC = 0 11 12incval = 10 13decval = 10 14 15font_button = ("Helevetica", 10, "bold") 16font_label = ("Helevetica", 30, "bold") 17 18button = tk.Button(font=font_button, text="push") 19resetButton = tk.Button(font=font_button, text="reset") 20incButton = tk.Button(font=font_button, text="+") 21decButton = tk.Button(font=font_button, text="-") 22 23labelResult = tk.Label(root, font=font_label, borderwidth = 10, width = 20, relief="solid", text=u'---') 24labelResult.pack() 25labelResult['text'] = " \n---" 26 27def clicked(): 28 global counter, button, modcounter, mode, s 29 modcounter = counter % 3 30 # print(modcounter) 31 if modcounter == 0: 32 mode = 0 33 s = "A:\n" 34 num = numA 35 elif modcounter == 1: 36 mode = 1 37 s = "B:\n" 38 num = numB 39 elif modcounter == 2: 40 mode = 2 41 s = "C:\n" 42 num = numC 43 else: 44 s = "unknown" 45 labelResult['text'] = s + str(num) 46 counter = counter + 1 47 48def reset(): 49 global mode,numA,numB,numC,resetButton,s 50 if mode == 0: 51 numA = 0 52 labelResult['text'] = s + str(numA) 53 elif mode == 1: 54 numB = 0 55 labelResult['text'] = s + str(numB) 56 elif mode == 2: 57 numC = 0 58 labelResult['text'] = s + str(numC) 59 60def inc(): 61 global mode, numA, numB, numC, s 62 if mode == 0: 63 numA = numA + incval 64 num = numA 65 labelResult['text'] = s + str(num) 66 elif mode == 1: 67 numB = numB + incval 68 num = numB 69 labelResult['text'] = s + str(num) 70 elif mode == 2: 71 numC = numC + incval 72 num = numC 73 labelResult['text'] = s + str(num) 74 75def dec(): 76 global mode, numA, numB, numC, s 77 if mode == 0: 78 numA = numA - decval 79 num = numA 80 labelResult['text'] = s + str(num) 81 elif mode == 1: 82 numB = numB - decval 83 num = numB 84 labelResult['text'] = s + str(num) 85 elif mode == 2: 86 numC = numC - decval 87 num = numC 88 labelResult['text'] = s + str(num) 89 90button.config(command=clicked) 91resetButton.config(command=reset) 92incButton.config(command=inc) 93decButton.config(command=dec) 94 95button.pack(padx = 5, pady = 5, anchor = "e") 96incButton.pack(padx = 5, pady = 5, anchor = "e") 97decButton.pack(padx = 5, pady = 5, anchor = "e") 98resetButton.pack(padx = 5, pady = 5, anchor = "e") 99button.mainloop() 100resetButton.mainloop()

補足情報(FW/ツールのバージョンなど)

Python 3.8.3
Tkinter 8.6

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

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

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

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

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

guest

回答3

0

  • モードの切替管理はひとつの変数で充分。
  • 数値はリストで持っておくとアクセスしやすい。
  • 結果の表示は別関数にする

Python

1import tkinter as tk 2 3root = tk.Tk() 4root.title(u"Selector") 5root.geometry("750x280") 6 7mode = 0 # 0=A, 1=B, 2=C 8nums = [0,0,0] 9 10incval = 10 11decval = 10 12 13font_button = ("Helevetica", 10, "bold") 14font_label = ("Helevetica", 30, "bold") 15 16button = tk.Button(font=font_button, text="push") 17resetButton = tk.Button(font=font_button, text="reset") 18incButton = tk.Button(font=font_button, text="+") 19decButton = tk.Button(font=font_button, text="-") 20 21labelResult = tk.Label(root, font=font_label, borderwidth = 10, width = 20, relief="solid", text=u'---') 22labelResult.pack() 23 24# 結果の表示 25def disp_result(): 26 labelResult['text'] = 'ABC'[mode] + ':\n' + str(nums[mode]) 27 28def clicked(): 29 30 # モードの切替 31 global mode 32 mode += 1 33 if mode > 2: 34 mode = 0 35 36 disp_result() 37 38def reset(): 39 nums[mode] = 0 40 disp_result() 41 42def inc(): 43 nums[mode] += incval 44 disp_result() 45 46def dec(): 47 nums[mode] -= decval 48 disp_result() 49 50button.config(command=clicked) 51resetButton.config(command=reset) 52incButton.config(command=inc) 53decButton.config(command=dec) 54 55button.pack(padx = 5, pady = 5, anchor = "e") 56incButton.pack(padx = 5, pady = 5, anchor = "e") 57decButton.pack(padx = 5, pady = 5, anchor = "e") 58resetButton.pack(padx = 5, pady = 5, anchor = "e") 59 60# 初期表示 61disp_result() 62 63button.mainloop() 64resetButton.mainloop()

投稿2021/04/22 07:03

can110

総合スコア38262

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

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

sakosako

2021/04/23 10:22

ご回答ありがとうございました。様々なエッセンスを入れていただき、非常に勉強になりました。使いこなせるように頑張ります
guest

0

部分回答ですが、

python

1# fontのみ設定したButtonのサブクラスを作っても良いけど、 2# 簡単な方法。 3 4from functools import partial 5MyButton = partial(tk.Button, font=font) 6 7# def MyButton(font=(...), **kw): 8# return tk.Button(font=font, **kw) 9 10 11button = MyButton(text="push") 12resetButton = MyButton(text="reset") 13incButton = MyButton(text="+") 14decButton = MyButton(text="-") 15 16

もしくは、ttk を使うと、一括してフォント等のスタイル変更ができます。


メインループはどのウィジェットからも呼び出せるようになってますが、
ひとつにしましょう。

diff

1- button.mainloop() 2- resetButton.mainloop() 3 4+ root.mainloop()

投稿2021/04/23 02:28

teamikl

総合スコア8664

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

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

0

ボタンの数を増やしていくなら、クラスを使って管理するとあとが楽です。

python

1import tkinter as tk 2 3class Status: 4 first = None 5 last = None 6 current = None 7 def __init__(self, name, num=0, incval=10, decval=10): 8 self.name = name 9 self.num = num 10 self.incval = incval 11 self.decval = decval 12 self.entry() 13 def entry(self): 14 if Status.first == None: 15 Status.first = Status.last = Status.current = self 16 self.next = self 17 else: 18 Status.last.next = self 19 Status.last = self 20 self.next = Status.first 21 def clicked(self): 22 Status.current = Status.current.next 23 return Status.current 24 def reset(self): 25 self.num = 0 26 def inc(self): 27 self.num += self.incval 28 return self.__str__() 29 def dec(self): 30 self.num -= self.decval 31 return self.__str__() 32 def __str__(self): 33 return f'{self.name}:\n{self.num}' 34 35Status('A') 36Status('B') 37Status('C') 38 39def clicked(): 40 Status.current.clicked() 41def reset(): 42 Status.current.reset() 43def inc(): 44 labelResult['text'] = Status.current.inc() 45def dec(): 46 labelResult['text'] = Status.current.dec() 47 48root = tk.Tk() 49root.title(u"Selector") 50root.geometry("750x280") 51 52font_button = ("Helevetica", 10, "bold") 53font_label = ("Helevetica", 30, "bold") 54 55button = tk.Button(font=font_button, text="push") 56resetButton = tk.Button(font=font_button, text="reset") 57incButton = tk.Button(font=font_button, text="+") 58decButton = tk.Button(font=font_button, text="-") 59 60labelResult = tk.Label(root, font=font_label, borderwidth = 10, width = 20, relief="solid", text=u'---') 61labelResult.pack() 62labelResult['text'] = " \n---" 63 64button.config(command=clicked) 65resetButton.config(command=reset) 66incButton.config(command=inc) 67decButton.config(command=dec) 68 69button.pack(padx = 5, pady = 5, anchor = "e") 70incButton.pack(padx = 5, pady = 5, anchor = "e") 71decButton.pack(padx = 5, pady = 5, anchor = "e") 72resetButton.pack(padx = 5, pady = 5, anchor = "e") 73button.mainloop() 74resetButton.mainloop()

Status('A')
Status('B')
Status('C')
の後に
Status('D')
を追加すると、4個の状態が同じように変わっていきます。

投稿2021/04/22 07:29

ppaul

総合スコア24666

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問