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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Tkinter

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

510閲覧

正常に動くが、afterでエラーが出ている

X36107420

総合スコア11

Tkinter

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2023/03/29 18:57

したいこと

エラーを消したい

現状

このプログラムはウィンドウのサイズ(x座標基準)に合わせて文字サイズと位置を自動で変更するプログラムを作っていて、これに加えてウィンドウのサイズもx座標基準で自動変更しています
変更の仕方は、重くならないようにafterでウィンドウサイズ変更のdefを待機させ、2度目にdef callback(event):が動くとafterがキャンセルされ、また新しいafterが待機状態となり、
一定時間(100ms)イベントConfigureがなく、def callback(event):が動かないとafterがキャンセルされることなくウィンドウのサイズ変更defが動きます。

このプログラムを動かしてもエラーは出ないのですがデバックでエラーが出ています

エラーの文

{
"owner": "python",
"code": "used-before-assignment",
"severity": 8,
"message": "Using variable 'after_window' before assignment",
"source": "pylint",
"startLineNumber": 47,
"startColumn": 29,
"endLineNumber": 47,
"endColumn": 29
}

コード

python

1import tkinter as tk 2import math 3 4window = tk.Tk() 5 6 7base_x = 640 8 9width=base_x 10height=320 11window.geometry(f"{width}x{height}") 12 13after_end = 0#afterが待機状態かどうか判断するためのもの、0が無理、1がキャンセルできる 14 15 16def window_hold():#ウィンドウのサイズ変更 17 global width, height,kakeru,win_x,after_end 18 window.geometry(f"{win_x}x{math.floor(320*kakeru)}") 19 after_end = 0 20 21 22a = tk.Label(window,text="あいうえお",font=("MS P明朝", "21", "bold")) 23a.place(x=320,y=160) 24def callback(event): 25 global width, height,base_x,a,win_x,kakeru,after_window,after_end 26 print("a") 27 # Main Window以外のイベントは無視 28 if (event.type != 'configure') and (event.widget != window): 29 return 30 # サイズが変わってなかった無視 31 if (event.width == width) and (event.height == height): 32 return 33 # グローバル変数を更新 34 width = event.width 35 height = event.height 36 # ボタンを移動する 37 print(window.winfo_width()) # ウィジェットの幅 38 print(window.winfo_height()) # ウィジェットの高さ 39 win_x = window.winfo_width() 40 kakeru = win_x / base_x #x座標を基準に係数を作っている 41 a.place_forget() 42 a.configure(font=("MS P明朝", f"{math.floor(21*kakeru)}", "bold"))#fontサイズ変更 43 a.place(x=320*kakeru,y=160*kakeru)#label位置変更 44 if after_end == 1:#afterがキャンセルできるか判断 45 window.after_cancel(after_window)#このafter_windowにエラー波線がつく 46 after_end = 1 #after待機状態にするから1にする 47 after_window = window.after(100,window_hold)#after待機状態にする 48 49 50 51 52window.bind("<Configure>", callback) 53 54window.mainloop()

エラーが出ないような書き方があれば教えてほしいです

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

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

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

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

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

melian

2023/03/29 19:45

グローバルスコープ領域で初期化しておくとよいかと思います。 after_window = None after_end = 0 #afterが待機状態かどうか判断するためのもの、0が無理、1がキャンセルできる
guest

回答1

0

ベストアンサー

エラーメッセージの通り、collback関数内で値を設定する前に参照(使って)いるのが原因です。

python

1 if after_end == 1:#afterがキャンセルできるか判断 2 window.after_cancel(after_window)#このafter_windowにエラー波線がつく 3 after_end = 1 #after待機状態にするから1にする 4 after_window = window.after(100,window_hold)#after待機状態にする

まず、関数内でglobalと宣言しているafter_windowがglobalスコープに宣言されていません。
また、関数内で設定していますが、その前にif文があり、設定される前に未定義のまま参照される可能性があります。実際の動作では、参照されないのでエラーにはなっていませんが、pylint は危険があるということで、警告を出しています。

このまま無視してもいいでしょうし、警告どおり、未定義状態で参照されてしまう可能性(将来変更したときなど)もあるので対処しておくのもいいでしょう。
対処するのであれば、 トップレベルで「after_window」に何か(Noneとか)入れておけばいいでしょう。

投稿2023/03/30 02:17

TakaiY

総合スコア12747

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

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

X36107420

2023/03/30 02:31

after_windowにNone入れたらエラー出なくなりました、ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問