「Programming Python 4th Edition」(O'REILLY) P.466に
以下のコードを実行すると
本来tmp.set(5)で6番目のRadiobuttonが選択された状態で初回表示されるはずだが
radio1()終了時にtmp.__del__()が呼ばれて
tmpに保持されている値がunsetされることにより
Radiobuttonの初回表示が狂う
(global行のコメントアウトをやめると正しく動作するようになる)
といったことが書いてあり、実際にコードを実行すると確かにそのようになるのですが
tmp.__del__()が呼び出される理由が理解できません。
__del__()が呼び出されるのはオブジェクトへの参照がなくなった時であって
tmpの値(IntVarオブジェクト)はRadiobuttonのコンストラクタに渡されており、Radiobuttonオブジェクト内部で参照され続けるので、__del__()が呼ばれることはないはずだ、と素人考えでは思えるのですが。
お分かりになる方が居らっしゃればどうか教えて下さい。
------------------------------------------------------------
from tkinter import *
root = Tk()
def radio1():
>>>>#global tmp
>>>>tmp = IntVar()
>>>>for i in range(10):
>>>>>>>>rad = Radiobutton(root, text=str(i), value=i, variable=tmp)
>>>>>>>>rad.pack(side=LEFT)
>>>>tmp.set(5)
radio1()
root.mainloop()
(>>>>は空白に読み替えてください)
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
tkinter のソースを読んでみるとよくわかると思いますが、
tkinter は Tcl/Tk という言語への橋渡しをしているに過ぎないんですよ。
Python で Tk() とか IntVar() とか書くたびに
それが Tcl の命令に変換されて実行されるだけなんです。
例えば tmp = IntVar() を実行すると、
Tcl 側で PY_VAR1 という変数が作られます。
次に tmp がスコープを抜けると参照がゼロになるので GC が発動します。
その時に tmp.__del__ が呼ばれて Tcl 側にある PY_VAR1 を破棄します。
つまり tmp というのは Tcl 側に存在する変数を管理するオブジェクトなわけです。
そのオブジェクトの破棄イコール Tcl 変数の破棄になっているので
表示がおかしくなるわけです。
ちなみに、
> Radiobuttonのコンストラクタに渡されており、
> Radiobuttonオブジェクト内部で参照され続けるので...
とありますが、Radiobuttonオブジェクトへの参照も
ゼロになっていることを忘れていませんか?
もっとも、Radiobuttonオブジェクトが破棄されても、
Tcl 側のラジオボタンを消すようにはなっていませんが。
No.1
- 回答日時:
結論だけ簡単に書くと、variable=tmp によって tmp の参照数は増えていないので
radio1() を抜けるところで tmp の寿命が尽きると判定されていて、結果 tmp.__del__ が
呼び出されるということになっています。
実装を事細かには書けないのですが、
>Radiobuttonオブジェクト内部で参照され続けるので
この前提が間違っているということです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
worksheetFunctionクラスのVloo...
-
「Columns("A:C")」の列文字を...
-
オブジェクトが見つかりません
-
EXCEL VBA オートシェイプナン...
-
実行時エラー 3265「要求された...
-
ある文字列が全て数字であるか...
-
エクセルVBAで2つの画像を比較...
-
Excel VBA Collection.add で R...
-
UserForm1.Showでエラーになり...
-
VBで引数にDictionaryオブジェ...
-
エクセルのVBAの標準モジュール...
-
「オブジェクト変数または With...
-
vb.netアプリケーションで発生...
-
PowerPointVBAでスライドマスタ...
-
VBAで既に開いている別アプリケ...
-
エクセルVBAでテキストボックス...
-
オートメーションエラーについて
-
AccessVBAで「dim dbs as datab...
-
エクセルマクロエラー「'Cells'...
-
VBScriptからDLL参照設定したい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
worksheetFunctionクラスのVloo...
-
「Columns("A:C")」の列文字を...
-
エクセルのVBAの標準モジュール...
-
実行時エラー 3265「要求された...
-
VBAで既に開いている別アプリケ...
-
Excelでフィルタをかけると警告...
-
オブジェクトが見つかりません
-
EXCEL VBA オートシェイプナン...
-
VBAからPDFファイルにパスワー...
-
VBAで Set wb = Sheets(1).Cop...
-
ある文字列が全て数字であるか...
-
PowerPointVBAでスライドマスタ...
-
[VBA]CDOメッセージ送信エラー
-
AccessVBAで「dim dbs as datab...
-
VBAで作成するメール(開封確認...
-
VBからPDFファイル自動生成...
-
上下の位置揃えについて
-
ExcelVBAでのNZ関数について
-
テキストボックス中の文字列の...
-
エクセルマクロエラー「'Cells'...
おすすめ情報