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

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

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

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

Tkinter

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

Q&A

解決済

1回答

8016閲覧

Python3 Tkinter Frameを継承したクラスの使い方

person

総合スコア224

Python 3.x

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

Tkinter

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

0グッド

0クリップ

投稿2021/07/24 08:55

Tkinterのクラス化として、一般的にFrameを継承した例がよく挙げられます。

私も過去にこの理由について質問したのですが、多くの回答は「機能をFrameという枠組み(箱)に入れて、機能を再利用することができる」というものでした。

仮にそれぞれの機能をもたせたクラスをApp1、App2として、1つのアプリケーションで使う場合は、下記のような書き方になるのでしょうか?

Python

1from tkinter import ttk 2import tkinter as tk 3 4class App1(tk.Frame): 5 def __init__(self, master): 6 super().__init__(master) # 継承した Frame の __init__() の呼び出し 7 button = ttk.Button(self, text = "Button1", command = lambda: print("Button1")) 8 button.grid() 9 10class App2(tk.Frame): 11 def __init__(self, master): 12 super().__init__(master) # 継承した Frame の __init__() の呼び出し 13 button = ttk.Button(self, text = "Button2", command = lambda: print("Button2")) 14 button.grid() 15 16 17if __name__ == "__main__": 18 root = tk.Tk() 19 root.geometry("400x300") 20 21 app1 = App1(root) 22 app1.grid() 23 24 app2 = App2(root) 25 app2.grid() 26 27 root.mainloop()

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

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

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

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

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

guest

回答1

0

ベストアンサー

クラスApp1、App2の相違点は、ボタンのラベル文字列が異なるのみですね。
従って、それをパラメータ化して、クラスは1つにするのが良さそうに見えます。
ラベル文字列は、インスタンス化するときに渡してみます。
(3個目も作ってみました)
クラスは「再利用可能な部品」と考えるといいと思います。

python

1from tkinter import ttk 2import tkinter as tk 3 4class App(tk.Frame): 5 def __init__(self, master, button_label): 6 super().__init__(master) # 継承した Frame の __init__() の呼び出し 7 button = ttk.Button(self, text = button_label, command = lambda: print(button_label)) 8 button.grid() 9 10if __name__ == "__main__": 11 root = tk.Tk() 12 root.geometry("400x300") 13 14 app1 = App(root, "Button1") 15 app1.grid() 16 17 app2 = App(root, "Button2") 18 app2.grid() 19 20 app3 = App(root, "Button3") 21 app3.grid() 22 23 root.mainloop() 24

投稿2021/07/24 09:57

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

person

2021/07/24 17:00

今回はApp1とApp2をサンプルとして似たような処理内容としています。 そのため、回答のような方法も取れますね。 各アプリのフレームを1つのアプリケーションで利用する方法として、 App1とApp2をインスタンス化してgrid()などで配置するのは問題なさそうですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問