名称错误:全局名称“END”未定义

8

我发现这段关于滚动条的代码运行良好。

from tkinter import *

master = Tk()

scrollbar = Scrollbar(master)
scrollbar.pack(side=RIGHT, fill=Y)

listbox = Listbox(master, yscrollcommand=scrollbar.set)
for i in range(10000):
    listbox.insert(END, str(i))
listbox.pack(side=LEFT, fill=BOTH)

scrollbar.config(command=listbox.yview)

mainloop()

我尝试在我的代码中这样使用它:
import tkinter as tk

class interface(tk.Frame):
    def __init__(self,den):
        self.tklist() 
        #in my code, tklist is not called here. I called it here to minimize the code
        #there are stuff in here also

    def tklist(self):
        scrollbar = tk.Scrollbar(den)
        self.lst1 = tk.Listbox(den, selectmode="SINGLE", width="100", yscrollcommand=scrollbar.set)
        for i in range(1000):
            self.lst1.insert(END, str(i))
        self.lst1.pack(side=LEFT, fill=BOTH)
        scrollbar.config(command=lst1.yview)

den = tk.Tk()
den.title("Search")

inter = interface(den)

den.mainloop()

但是当我运行上面的代码时,在插入行出现了错误。
NameError: global name 'END' is not defined

顺便说一下,我试图查找文档,从effbot的链接是我能找到的最接近的,但仍然无法理解问题出在哪里。
3个回答

21

ENDLEFTBOTH 都位于 tkinter 命名空间中。因此,在它们之前需要加上 tk. 来限定:

for i in range(1000):
    self.lst1.insert(tk.END, str(i))
self.lst1.pack(side=tk.LEFT, fill=tk.BOTH)
scrollbar.config(command=lst1.yview)

或者,如果你想的话,你可以显式地导入它们:

from tkinter import BOTH, END, LEFT

3
另一种选择是直接使用字面字符串 "end", "left""both"。我从来没有完全理解为什么 tkinter 会为这些字符串创建常量。 - Bryan Oakley

0
第一段代码可以工作是因为你从tkinter中导入了*,但是在第二段代码中你将tkinter导入为tk。所以你需要使用tk.END。
def tklist(self):
    scrollbar = tk.Scrollbar(den)
    self.lst1 = tk.Listbox(den, selectmode="SINGLE", width="100", yscrollcommand=scrollbar.set)
    for i in range(1000):
        self.lst1.insert(tk.END, str(i))
    self.lst1.pack(side=LEFT, fill=BOTH)
    scrollbar.config(command=lst1.yview)

0

使用 "end" 替代 END

from tkinter import *
self.lst1.insert("end", str(i))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接