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

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

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

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

Tkinter

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

Q&A

解決済

2回答

7911閲覧

Python3 Tkinter クラス化するときの暗黙のルール?

person

総合スコア224

Python 3.x

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

Tkinter

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

0グッド

1クリップ

投稿2020/06/20 10:08

編集2020/09/15 07:58

クラス化の際に雛形として、クラスの括弧の中にフレームを書いているのをよく見かけますが、
この書き方をしている利点やこの書き方以外の欠点みたいなものってあるのでしょうか?
class Class(tk.Frame):というやつ)

この質問回答にあるような書き方ではダメ(というか後々不都合が生じたりする?)なのでしょうか?

よく見る雛形を使った例

import tkinter as tk import tkinter.ttk as ttk class Application(tk.Frame): def __init__(self, master): super().__init__(master) master.rowconfigure(0, weight=1) master.columnconfigure(0, weight=1) self.grid(row=0, column=0, sticky="nsew") master.geometry("300x300") master.title("title") self.rowconfigure(0, weight=1) self.columnconfigure(0, weight=1) self.b = tk.Button(self, text="Button", command=self.pushed) self.b.grid(row=0, column=0, sticky="nsew", padx=10, pady=10) def pushed(self): print("pushed") def main(): win = tk.Tk() app = Application(master=win) app.mainloop() if __name__ == "__main__": main()

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

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

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

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

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

guest

回答2

0

雛型というか、サブクラスにする書き方ですね。
tk.Frameのサブクラスにすると、tk.Frameが持っているインスタンス変数やメソッドの存在を気にしながら名前衝突しないように自分でインスタンス変数やメソッド名を決めなければいけません。
サブクラスにしなければ、そんな心配は不要です。

なので、私はサブクラスにしない方が好みです。

投稿2020/06/20 12:09

shiracamus

総合スコア5406

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

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

0

ベストアンサー

どちらかと言うと後々問題になる可能性があるのは、継承(サブクラス化)した方ですね。
稀な例ですが、アップデートで親クラスに自分が追加したメソッドと同じ名前のメソッドが追加された等。

設計に関しては、何を目的とするかによって最善策は変わってくるので
一概にどうすればよいとは言えない部分はあります。一言でいうと case-by-case
こういった場合はこうした方が良い、というように、目的とする部分・前提条件の共有が必要です。

一般的な事を言うと、それぞれに長所・短所はあります。

class Application(tk.Frame): の様な書き方の場合、「継承」と言い
「継承」の一番の問題点は、親クラスと不要な名前空間の共有が発生してしまう点でしょうか。

self.xxx で Frame クラスの属性にアクセスできるので、
自分で新しくメソッドやプロパティを追加したい場合、
親クラスと被らないかどうかを確認する必要があります。

サンプルコード等の短い例では、それ程デメリットにならない為、
単に記述量が少なく成るからという理由で使われることは多いです。

一方で、メンバー変数にインスタンスを保持して、外部から操作する場合は、「委譲」と言います

  • Application のロジックを Tkinter から切り離したい場合は、

こちらの方が好ましい。 -> Tkinter に依存せずコードのテストが可能になる

  • 再利用を気にしなくても良い場合は、若干冗長になる。(書き捨てのコード等)

他にも色々あるので、
詳しくは、「移譲」や「継承」とその使い分けに関して調べて見て下さい。


Tkinter 特有の事情

暗黙のルールではありませんが、こうした方が良い的なことは幾つか有ります。
以下はクラスの「再利用」の観点から。(クラスを単独でテストする場合を想定して見て下さい)

  • Frame を継承したクラス内では、そのフレームの pack/grid/place は呼び出さない

→ self.grid() とした場合、gridレイアウト上でしか使えなくなります。
or 間にgrid<=>packの違いを吸収するだけの、余分な Frame を挟む必要が出てくる。

  • クラス内で親ウィジェットのメソッド呼び出しは最小限にする

→ master.title() 等のトップレベルのウィンドウにしかないメソッドを使った場合、
他のフレームの上に載せるといった使い方が出来なくなります。


関連:

投稿2020/06/20 13:00

編集2020/06/20 14:09
teamikl

総合スコア8681

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問