NameError:未定义全局名称"END"

Laf*_*los 5 python tkinter

我发现这个关于滚动条的代码工作正常.

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()
Run Code Online (Sandbox Code Playgroud)

我尝试在我的代码中使用它,如下所示:

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()
Run Code Online (Sandbox Code Playgroud)

但是当我运行上面的代码时,我在插入行上出错了.

NameError: global name 'END' is not defined
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我试图找到文档和effbot的链接是我得到的最接近但仍然无法理解有什么问题.

iCo*_*dez 11

END,LEFTBOTH所有驻留在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)
Run Code Online (Sandbox Code Playgroud)

或者,您可以根据需要明确导入它们:

from tkinter import BOTH, END, LEFT
Run Code Online (Sandbox Code Playgroud)

  • 另一个选择是简单地使用文字字符串`"end"`,`"left"`或`"both"`.我从来没有完全理解为什么tkinter会为这些字符串制作内容. (2认同)