tkinter で Button を押した時に Entry の値を取得する

f:id:koreyakono:20210210213818p:plain

上記のような UI を作り、Button を押したら、tk.Entry に入っている値を取得して関数 run_script を呼び出そうとしました。Button に command = run_script(Entry.get()) としたのですが、tk.Entry の値が run_script  に渡されませんでした。

 

よくよく考えてみると、Button の Command  を run_script(Entry.get()) の形で定義してしまうと、Button の定義時に tk.Entry に入力されていた値で固定されてしまうということに気付きました。

 

Button を押す度に値を取得できるように、command では、run_script() には tk.Entry オブジェクトを渡し、 run_script() の方で tk.Entry.get() を実行させるようにしました。これなら、思ってたとおりに動作します。

 

・修正後

import tkinter as tk

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")


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)
self.frame = BaseFrame(master=self.root)
self.root.mainloop()


# start program
MainWindow()


if __name__ == '__main__':
pass