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

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

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

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

Tkinter

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

Q&A

解決済

1回答

2725閲覧

canvasのtag bindでクリック時に実行する関数に引数をかけるか

shuoga

総合スコア2

Python 3.x

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

Tkinter

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

0グッド

0クリップ

投稿2021/06/24 01:19

##実現したいこと
https://teratail.com/questions/341873
の質問者です、一応urlを。

python

1canvas.tag_bind(item, "<Button-1>", self.onclick)

問題の文。tag_bindで引数を指定してraiseするページを指定することはできますか?ソースコードを見ていただきたいんですが、ページを変えるプログラムをframeをraiseして行っています。このonclickに引数(上げたいページ)を入れたいです。今後ページが増えても同じ関数を使って中に入れる引数のみ変更したいです。ちなみに引数を指定せずに関数内に特定のページをraiseするプログラムは実行できましたが、下記のソースコードは実行すると
AttributeError: '_tkinter.tkapp' object has no attribute 'frame1'
とでます。そもそもtag_bindに引数を指定できないのか、原因がわかりません。
以下ソースコードです、main_frameのtag_bindのところを見てほしいです。
##ソースコード

python

1#coding:shift-jis 2import tkinter as tk 3import PIL.Image, PIL.ImageTk 4 5class App(tk.Tk): 6 # 呪文 7 def __init__(self, *args, **kwargs): 8 # 呪文 9 tk.Tk.__init__(self, *args, **kwargs) 10 11 # ウィンドウタイトルを決定 12 self.title("Tkinter change page") 13 14 # ウィンドウの大きさを決定 15 self.geometry("800x600") 16 17 # ウィンドウのグリッドを 1x1 にする 18 # この処理をコメントアウトすると配置がズレる 19 self.grid_rowconfigure(0, weight=1) 20 self.grid_columnconfigure(0, weight=1) 21 22#-----------------------------------main_frame----------------------------- 23 24 # メインページフレーム作成 25 self.main_frame = tk.Frame() 26 self.main_frame.grid(row=0, column=0, sticky="nsew") 27 28 # キャンバスにテキストとイベント登録 29 self.main_canvas = tk.Canvas(self.main_frame, width=800, height=600, bg="white") 30 self.main_item = self.main_canvas.create_text(100, 100, text="change", font=('Helvetica', '35')) 31 self.main_canvas.tag_bind(self.main_item, "<Button-1>", self.changePage(self.frame1)) 32 self.main_canvas.pack() 33 34#-------------------------------------------------------------------------- 35#-----------------------------------frame1--------------------------------- 36 37 # 移動先フレーム作成 38 self.frame1 = tk.Frame() 39 self.frame1.grid(row=0, column=0, sticky="nsew") 40 41 # タイトルラベル作成 42 self.titleLabel = tk.Label(self.frame1, text="Frame 1", font=('Helvetica', '35')) 43 self.titleLabel.pack(anchor='center', expand=True) 44 45 # フレーム1からmainフレームに戻るボタン 46 self.back_button = tk.Button(self.frame1, text="Back", command=lambda : self.changePage(self.main_frame)) 47 self.back_button.pack() 48 49#-------------------------------------------------------------------------- 50 51 #main_frameを一番上に表示 52 self.main_frame.tkraise() 53 54 def changePage(self, page): 55 ''' 56 画面遷移用の関数 57 ''' 58 page.tkraise() 59 60 61if __name__ == "__main__": 62 app = App() 63 app.mainloop()

##補足情報
Python 3.7.1
Win

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

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

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

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

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

guest

回答1

0

ベストアンサー

tag_bind に引数を設定は出来ないので、関数側を工夫します。

python

1# ファイル先頭で事前に import 2from functools import partial 3 4# 一部略。 5tag_bind(..., ..., partial(self.changePage, self.frame1)) 6 7# 呼び出す関数は、引数の1番目が self.frame1 に束縛されます 8# bind でイベント時に渡される引数も有る為、後ろに続けます。 9def changePage(self, page, event=None): 10 ...

python

1# functools.partial の挙動 2 3def add(a, b): 4 return a + b 5 6add10 = functools.partial(add, 10) # 引数a=10 の時の関数を作る 7print(add10(2)) # => 12
  • functools.partial
  • lambda を使う方法もありますが、for文内で使う場合は使う際に注意が必要。

 lambda e: self.changePage(self.frame1)

投稿2021/06/24 06:04

teamikl

総合スコア8664

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問