タブで 2つの Frame の切り替えができるようにしようとしたら、Frame が2つ縦に並んでしまった件 (2回目: 構成をシンプルにしてみる)

前回、notebook を使って 2つのタブを作り、Frame を切り替えられるようにしようとしたら、タブが2つ並ぶという失敗をしました。

 

koreyakono.hatenadiary.jp

 

 

今回は、まずはタブの作り方の基本を知ろうと、自作の class を使うのをやめて、シンプルに tk.Frame を呼び出してみました。

 

 

結果は。。。

 

できました。

 

タブを切り替えると、

f:id:koreyakono:20210210224823p:plain    

 

ちゃんと関連するボタンが表示されます。

f:id:koreyakono:20210210224837p:plain

 

 

 

・現時点のコード

MainWindow で tk.Frame 直接呼び出すように変更しました。これなら Notebook が動作します。


import tkinter as tk
import tkinter.ttk as ttk

class BaseFrame(tk.Frame):
def __init__(self, master):
frame_color = "lightskyblue"

# call constructor
super().__init__(master, relief="groove", bd=6)

self.base_frame = tk.Frame(master,
bg=frame_color,
relief="sunken", bd=5)
self.base_frame.grid()

# put label
self.r0c0_label = tk.Label(self.base_frame, font=("system"),
text="path: ", anchor="w", padx=1, width=10)
self.r0c0_label.grid(row=0, column=0, sticky="w")

# put entry
self.r0c0_entry = tk.Entry(self.base_frame, width=50, bd=2, font=("system"))
self.r0c0_entry.grid(row=0, column=0, columnspan=2, padx="60", sticky="w")

self.r1c0_button = tk.Button(self.base_frame, text="put button",
command=lambda obj=self.r0c0_entry:
run_script(obj)
)
self.r1c0_button.grid(row=1, column=0, pady=5, sticky="w")

return self


def run_script(entry=None):
url = entry.get()
print(url)


class MainWindow:
def __init__(self):
self.root = tk.Tk()
self.root.title("GUI")
self.root.attributes("-topmost", True)

# -----------------------------------
# Notebook を使ってタブを設定してみる
# -----------------------------------
notebook = ttk.Notebook(self.root, height="100")
notebook.grid(row=0, column=0, sticky="w")


# 変更: BaseFrame を使わずに、シンプルに tk.Frame Notebook へ追加する

# 以下は使わないことにするのでコメントアウト
# self.frame1 = BaseFrame(master=self.root)
# self.frame2 = BaseFrame(master=self.root)

# tk.Frame をシンプルに呼び出してみる
self.frame1 = tk.Frame(self.root)
# frame1 にボタンをつけてみる
tk.Button(self.frame1, text="button 1").grid()

# tk.Frame をシンプルに呼び出してみる
self.frame2 = tk.Frame(self.root)
# frame2 にボタンをつけてみる
tk.Button(self.frame2, text="button 2").grid()

print(f"frame = {type(self.frame1)}")
print(f"frame = {type(self.frame2)}")

# frame1 frame2 notebook に追加する
notebook.add(self.frame1, text="tab1")
notebook.add(self.frame2, text="tab2")

# 変更はここまで ------------------------

self.root.mainloop()


# start program
MainWindow()


if __name__ == '__main__':
pass

 

 

つまりは、クラスの使い方に誤りがあるらしいです。

今日はここまで。