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` の方が明示的であり、
どのモジュールの定数か分かりやすくなるためおすすめです。
コメント
コメントを投稿