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

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

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

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

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Python

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

Q&A

解決済

1回答

6085閲覧

【Python】TKINTERによるオブジェクト指向でのコードの書き方

temtemtemtem

総合スコア9

Tkinter

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

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Python

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

0グッド

1クリップ

投稿2020/05/22 23:30

編集2020/05/25 13:10

python3でオブジェクト指向の勉強をしています。
TKINTERを使ってアプリを作成したいのですが、FrameやNotebookを複数つかう際にClassの構造をどのように構築したらいいのかがわかりません。
未熟者なため書き方があっているかわかりませんが私のイメージでは下記の通りです。
tk.Tk()
→tk.Canvas()
→scrollbarを作成
→tk.Frame()
→tk.Canvasの上にtk.Frame()を配置
→ttk.Notebook(Frame)
→tk.Frameの上にnotebookを配置してタブを6つ追加
→各タブについてウィジェットを追加していくコードを書く

手続き型の作成はできているのですがオブジェクト指向で書くことが出来ません。
ご指導のほどよろしくお願いします。

手続き型では下記のように記入しました。

python

1# GUIの作成 2import tkinter as tk 3import tkinter.ttk as ttk 4 5root = tk.Tk() 6root.geometry('2000x1500') 7root.title('テスト') 8 9Canvas Widget を生成 10canvas = tk.Canvas(root, width=2000, height=1500) 11 12#Scrollbar を生成して配置 13bar_y = tk.Scrollbar(root, orient=tk.VERTICAL) 14bar_y.pack(side=tk.RIGHT, fill=tk.Y) 15bar_y.config(command=canvas.yview) 16 17bar_x = tk.Scrollbar(root, orient=tk.HORIZONTAL) 18bar_x.pack(side=tk.BOTTOM, fill=tk.X) 19bar_x.config(command=canvas.xview) 20 21canvas.config(yscrollcommand=bar_y.set, xscrollcommand=bar_x.set) 22canvas.config(scrollregion=(0, 0, 4000, 5000)) # スクロール範囲 23canvas.pack(fill=tk.BOTH, expand=tk.YES) 24 25# Frame Widgetを 生成 26frame = tk.Frame(canvas) 27 28# Frame Widgetを Canvas Widget上に配置 29canvas.create_window((0, 0), window=frame, anchor=tk.NW, width=canvas.cget('width')) 30 31notebook = ttk.Notebook(frame) 32 33tab1 = tk.Frame(notebook) 34tab2 = tk.Frame(notebook) 35tab3 = tk.Frame(notebook) 36tab4 = tk.Frame(notebook) 37tab5 = tk.Frame(notebook) 38tab6 = tk.Frame(notebook) 39 40notebook.add(tab1, text='tab1') 41notebook.add(tab2, text='tab2') 42notebook.add(tab3, text='tab3') 43notebook.add(tab4, text='tab4') 44notebook.add(tab5, text='tab5') 45notebook.add(tab6, text='tab6') 46notebook.pack(expand=True, fill='both') 47 48# オブジェクト指向での記入 49import tkinter as tk 50import tkinter.ttk as ttk 51 52 53class Application(tk.Canvas): 54 def __init__(self, master=None): 55 super().__init__(master, width=2000, height=1000) 56 self.master.title('CBD') 57 58 # Scrollbar を生成して配置 59 self.bar_y = tk.Scrollbar(self, orient=tk.VERTICAL) 60 self.bar_y.pack(side=tk.RIGHT, fill=tk.Y) 61 self.bar_y.config(command=self.yview) 62 63 self.bar_x = tk.Scrollbar(self, orient=tk.HORIZONTAL) 64 self.bar_x.pack(side=tk.BOTTOM, fill=tk.X) 65 self.bar_x.config(command=self.xview) 66 67 self.config(yscrollcommand=self.bar_y.set, xscrollcommand=self.bar_x.set) 68 self.config(scrollregion=(0, 0, 4000, 5000)) # スクロール範囲 69 self.pack(fill=tk.BOTH, expand=tk.YES) 70 71 self.frame = tk.Frame(self) 72 self.create_window((0, 0), window=self.frame, anchor=tk.NW, width=self.cget('width')) 73 74 nootebook = ttk.Notebook(self.frame) 75 Note(master=nootebook) 76 77class Note(nootebook): 78 79def __init__(self, master=None): 80 super().__init__(master) 81 self.master.title('window') 82 83 tab1 = tk.Frame(self.master) 84 self.add(tab1, text="tab1") 85 Tab1(master=tab1) 86 87 tab2 = tk.Frame(self.master) 88 self.add(tab2, text="tab2") 89 Tab2(master=tab2) 90 91 self._quit_outside_widget() 92 self.pack() 93 94 95def main(): 96 root = tk.Tk() 97 app = Application(master=root) # Inherit 98 app.mainloop() 99 100 101if __name__ == "__main__": 102 main()

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

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

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

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

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

teamikl

2020/05/23 02:37

コードのレイアウトが崩れてるので、 markdown を使ってコードの編集をお願いします。 バッククォート3つで囲みます ```python ここにコードを貼り付け ``` また、コメントとコードが混在してるので、 出来れば実行可能な形に直して下さい。
guest

回答1

0

ベストアンサー

python

1nootebook = ttk.Notebook(self.frame) 2Note(master=nootebook) 3 4class Note(nootebook):

元コードの notebook の辺りがわからないので、
質問はその辺りについてかなと思いましたが、インデントが把握できないので、
一般的な、「クラスを使った書き方」として回答します。

質問の意図が、「オブジェクト指向を活かした設計」だった場合、
現状では ScrolledCanvas の再利用位しか恩恵はありません。
(関数で書いた場合とあまり替わりがない)


python

1import tkinter as tk 2from tkinter import ttk 3 4 5def init_notebook(notebook): 6 """ 7 クラス化しても良かったのですが、あまり再利用することがない処理のため関数にしました。 8 9 無闇にクラス化すると、"self"をたくさん書かなくてはいけなくなったりします。 10 """ 11 for num in [1, 2, 3, 4, 5, 6]: 12 tab = ttk.Frame(notebook) 13 name = "tab{}".format(num) 14 notebook.add(tab, text=name) 15 16 return notebook 17 18 19class ScrolledCanvas(tk.Canvas): 20 """ 21 スクロールバー付きのキャンバスは再利用の機会は高そうなので、個別のクラスに纏める。 22 23 スクロールを付けるクラスの拡張方法は、他にもあり 24 異なるアプローチですが ScrolledText のソース等も参考にしてみて下さい。 25 """ 26 27 def __init__(self, master, *args, **kw): 28 super().__init__(master, *args, **kw) 29 30 bar_y = ttk.Scrollbar(self, orient=tk.VERTICAL) 31 bar_y.pack(side=tk.RIGHT, fill=tk.Y) 32 bar_y.config(command=self.yview) 33 34 bar_x = ttk.Scrollbar(self, orient=tk.HORIZONTAL) 35 bar_x.pack(side=tk.BOTTOM, fill=tk.X) 36 bar_x.config(command=self.yview) 37 38 self.config( 39 yscrollcommand=bar_y.set, 40 xscrollcommand=bar_x.set, 41 scrollregion=self.bbox("all"), 42 ) 43 # ※ ウィジェットをクラス化する際の注意点 44 # ここでこのクラスのコンテナである canvas の pack()/grid() 等のレイアウトは呼びません。 45 # 例えば grid() を呼び出すと、pack() では使えないクラスになってしまいます。 46 47 48class MainWindow(ttk.Frame): 49 def __init__(self, master): 50 super().__init__(master) 51 52 # XXX: 53 # 例えば、ここで master.title() を呼び出すと、親にはToplevelしか取れなくなるので 54 # クラス内では親のメソッドを呼び出すのは控えます。 55 # そうすることで、Toplevel以外の親を持つことができ 56 # このクラス自体を他のクラスの部品の一部として扱えるようになります。 57 58 canvas = ScrolledCanvas(self, width=200, height=200) 59 canvas.pack(fill=tk.BOTH, expand=True) # <- 配置は利用側で決める 60 61 notebook = init_notebook(ttk.Notebook(self)) 62 notebook.pack(fill=tk.BOTH, expand=True) 63 64 canvas.create_window((10, 10), 65 window=notebook, anchor=tk.NW, width=canvas.cget('width')) 66 67 self.canvas = canvas 68 self.notebook = notebook 69 70 71def main(): 72 root = tk.Tk() 73 root.geometry("800x800") 74 root.title("テスト") 75 76 win = MainWindow(root) 77 win.pack(fill=tk.BOTH, expand=True) 78 79 root.mainloop() 80 81 82if __name__ == '__main__': 83 main() 84

投稿2020/05/23 12:44

編集2020/05/23 12:52
teamikl

総合スコア8664

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

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

temtemtemtem

2020/05/23 14:25

質問の表記に不備があり申し訳ありませんでした。 また、不備がある中回答いただきありがとうございました。 回答いただいた内容で私が達成したかったことが完全に表現されました。 クラス化はプログラムを書く上で再利用する必要があるときのみにとどめておくことが良いのですね。全てのコメントが目から鱗で感動いたしました。本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問