python tkinter_Listbox_insertメソッド_END_is_not_defined_pylance

 

pythonにおいてとあるクラスを定義して

インスタンスフィールドに

tkinterのListboxを保持しているのですが、


self.listbox.insert( END, f"{item.item_name}: {item.quantity}個")


vscodeを使って

上記のようなメソッドを記述したとき


pylanceによって、

END is not defined というエラーが表示されます


ENDのところをどのように記述すればいいのでしょうか?


たしか、pydev + eclipseの組み合わせの時は

なにも表示されずに実行もできたとおもうのですが・・・




Pylance で 

`END is not defined` というエラーが表示されるのは、

`END` が `tkinter` の定数であり、

明示的に `tkinter.END` 

または `from tkinter import END` として参照する必要があるためです。



## 解決策

以下のいずれかの方法で修正できます。


### 1. `tkinter.END` を使う


```python


import tkinter as tk


self.listbox.insert(

tk.END, f"{item.item_name}: 

{item.quantity}個")


```


これにより `tkinter` モジュールの `END` を明示的に参照できます。


### 2. `from tkinter import END` を使う


```python


from tkinter import END


self.listbox.insert(

END, f"{item.item_name}: {item.quantity}個")

```

これにより `END` を直接使えるようになります。


## なぜ Eclipse + PyDev ではエラーにならなかったのか?


Eclipse + PyDev では、

暗黙的に `tkinter` の定数を解決する設定になっていた可能性があります。

しかし、Pylance(VSCodeのデフォルトのPython拡張)は

より厳密な型チェックを行うため、

明示的な `tkinter.END` 

または `from tkinter import END` が必要になります。


いずれの方法も動作しますが、

`tk.END` の方が明示的であり、

どのモジュールの定数か分かりやすくなるためおすすめです。


コメント