普通、
python
1def x(): 2 return 1 3print(x())
というコードを書いたら
1
とでます。
関数内で定義した関数にreturnすることは可能でしょうか?
これがしたい理由は、一回buttonで関数を呼ぶので、returnができないことです。
本コードはこれです
import tkinter import datetime import math import calendar import ctypes import sys check = 0 # screensize 取得,中央定義 user32 = ctypes.windll.user32 screensize_x = user32.GetSystemMetrics(0) screensize_y = user32.GetSystemMetrics(1) center_x = screensize_x / 2 center_y = screensize_y / 2 window_open_flag = 0 def window_open(): global calendar_tk global window_open_flag calendar_tk = tkinter.Toplevel() calendar_tk.geometry('413x245+%d+%d' % (center_x - 207,center_y - 122)) calendar_tk.title('かれんだー') calendar_tk.configure(bg='#FFFFB3') calendar_tk.resizable(width=0, height=0) calendar_tk.focus_set() calendar_tk.grab_set() window_open_flag = 1 def make_calendar(year, month, month_first_day): global month_lbl global before_month_button global after_month_button global lbl global button global day_list if window_open_flag == 0: window_open() en_month_lbl = tkinter.Label(calendar_tk,text=monthlist[month-1], bg='#FFFFB3') en_month_lbl.grid(row=2, column=3) sat_color = '#0000FF' sun_color = '#FF0000' for i in range(len(day_list)): lbl[i] = tkinter.Label(calendar_tk, text=day_list[i], bg='#FFFFB3') lbl[i].grid(row=3, column=i) button = [0] * calendar.monthrange(year, month)[1] def make_date_button_push(i): def date_button_push(): global check click_day = month_first_day + i-1 print(year,month,click_day) check = 1 return year,month,click_day return date_button_push date_button_push = {} for i in range(calendar.monthrange(year, month)[1]): date_button_push[i] = make_date_button_push(i) for i in range(calendar.monthrange(year, month)[1]): placey = math.floor((i+1 + month_first_day + 6) / 7) placex = (i + month_first_day) % 7 button[i] = tkinter.Button(calendar_tk, text=i+1, width=7, command=date_button_push[i]) button[i].grid(row=placey+4, column=placex) calendar_tk.mainloop()
これの76行目の文です。このreturn文をmake_calendar関数の呼んだところにreturnしたいと思ってます
追記
「def make_date_button_push(i):
略
でリターンさせたら、ボタンのcommandに行きますよね?」
は
def make_date_button_push(i): def date_button_push(): global check click_day = month_first_day + i-1 print(year,month,click_day) check = 1 return year,month,click_day
です
コード長すぎです。関係ないところを削ってください。
> 関数内で定義した関数にreturnすることは可能でしょうか?
> このreturn文をmake_calendar関数の呼んだところにreturnしたいと思ってます
どういうことでしょうか??
print(make_calendar(year, month, day))
で、日付が選択された後に(たとえば)2020/08/12と表示させたいということです
それがreturnの話とどう関係するのでしょうか?
make_calendar(year, month, day)が実行されて、どれかのそのボタンの情報をボタンが押されたらリターンさせたいということです。
returnすれば良いと思うのですが?何が不明でしょうか?
def make_date_button_push(i):
def date_button_push():
global check
click_day = month_first_day + i-1
print(year,month,click_day)
check = 1
return year,month,click_day
でリターンさせたら、ボタンのcommandに行きますよね?
インデントが不明です。質問を編集して追記しましょう。
もしくは、現在質問に書かれているコードの関係ない部分を削除しましょう。
あと、「ボタンのcommand」とは?
returnは関数を呼んだところに戻ります。呼んでないところにreturnで戻るのは無理です。
目的によっては例外機構が使える可能性もあります。
後ろから4行目の
button[i] = tkinter.Button(calendar_tk, text=i+1, width=7, command=date_button_push[i])
です
> でリターンさせたら、ボタンのcommandに行きますよね?」
「return year,month,click_day」のことなら、ボタンのコールバックなのでそうですね。
このreturnの代わりに違うところに飛ばしたいということでしょうか?
はい。
どこに飛ばすのでしょう?値を返さなくても良いのでしょうか?
print(make_calendar(year, month, day))という文があったとき
2020,08,12と表示させたいということです
date_button_push自体は値を返すことはできません。
tkinterに限らず、UI系のプログラムではイベント処理をする関数から値を返すことは基本しないのです。
なのでdate_button_pushの中から、直接外側の関数の変数を書き換えてしまうのがいいのかと思いますよ。
関数の中の関数はクロージャーと呼ばれていて、そういうアクセスが出来ます。
make_calendarに何か値を保存する変数でも用意しておいて、それを書き換えてしまえばいいでしょう。
make_calendarはイベントハンドラじゃなければ、値を返せます。
保存した変数を返せば、元の画面に日付を渡すことが可能です。
なんか間違った日付だったけど。
回答1件
あなたの回答
tips
プレビュー