【问题标题】:_tkinter.TclError: bad listbox index "": must be active, anchor, end, @x,y, or a number_tkinter.TclError: bad listbox index "": must be active, anchor, end, @x,y, or a number
【发布时间】:2018-01-31 08:24:56
【问题描述】:
from tkinter import *
window_main = Tk()

def window_open():
    def chgColor(event):
    lst["bg"] = lst.get(lst.curselection())

    window_public = Tk()
    window_public.title("New Page")
    lbl = Label(window_public, text = "Today is a good day and I'm a gooie!")
    lbl.grid(padx = 20, pady = 10)
    var = StringVar()
    lst = Listbox(window_public, height = 5, width = 10, listvariable = var)
    lst.grid(padx = 50, pady = 20)
    list = ["red", "blue", "yellow", "pink", "green", "white", "black"]
    var.set(tuple(list))
    lst.bind("<<ListboxSelect>>", chgColor)
    window_public.mainloop()


window_main.title("Main")
window_main_btn = Button(window_main, text = "To New Page", command = window_open)
window_main_btn.grid(padx = 50, pady = 20)
window_main.mainloop()

错误:

Traceback (most recent call last):
  File "C:\ComputerSoftware\python3.6\lib\tkinter\__init__.py", line 1699, in __call__
    return self.func(*args)
  File "C:/Users/Shawn/PycharmProjects/gammaC@meL/gamma1.py", line 7, in chgColor
    lst["bg"] = lst.get(lst.curselection())
  File "C:\ComputerSoftware\python3.6\lib\tkinter\__init__.py", line 2792, in get
    return self.tk.call(self._w, 'get', first)
_tkinter.TclError: bad listbox index "": must be active, anchor, end, @x,y, or a number

我是 python 的初学者,遇到了一个问题。当我点击按钮时,我会转到一个新页面。然后,当我单击列表框时,我会得到回溯。我无法理解回溯的含义,也无法修复它。
但是我发现当我删除关于 window_main 的代码时,它会运行。

【问题讨论】:

  • 以上代码返回错误而不是您收到的错误。请修复您的代码,使其返回您遇到的确切错误。
  • 错误完全以下都不是,是OP有Tk()的多个实例,所以var = StringVar()不知道属于哪里,一个简单的var = StringVar(master=window_public) 将修复错误。虽然不建议使用两次Tk(),但使用Toplevel()

标签: python python-3.x tkinter


【解决方案1】:

我不是列表框方面的专家,但我认为列表没有填充。您需要将数据插入到列表中。而不是var.set(tuple(list)),使用

for c in list:
    lst.insert(END,c)

如果我改变它,那么它对我有用。

【讨论】:

  • 你的代码有错别字...你应该插入 lst 而不是列表
  • @Yatin 我原来的答案确实是lst 而不是list,但是 prudence70 将其更改为list,认为这是一个错字...(从编辑历史中可以看出)。我把它改回原来的。
【解决方案2】:
  • 先插入数据替换:

for index, element in enumerate(list):
    lst.insert(index,element)

  • 你以前是这样的:

    
      def chgColor(event):
          lst["bg"] = lst.get(lst.curselection())
    
      
  • 现在你应该有这样的:


    def chgColor(event):
        if lst.curselection() != ():
           lst["bg"] = lst.get(lst.curselection())

    

当 lst.get 收到一个空元组时会发生该错误。

【讨论】:

    【解决方案3】:

    我不是 Tkinter 专家,我知道这不是一个多窗口问题,但您声称您单击一个按钮并进入一个新页面,因此您的问题可能与我要说的有关。

    我似乎记得有一个应用程序窗口,然后在该窗口中填充用户操作和事件的新框架。每个框架都是一个类,然后您将拥有某种循环,允许您使用新框架“刷新”窗口内容。

    当我found this guy and his videos on youtube 时,它确实帮助我学习了 Tkinter 并克服了新手 GUI 编程问题(如多个窗口)。关注他的播放列表,您将立即被排序。表达你对这个人的支持也没有什么坏处......所以喜欢他的视频或订阅他的频道。

    请在帖子中包含您收到的 Traceback 错误。这对尝试调试代码的任何人都非常有帮助。 Tkinter 众神或许也能准确地告诉你哪里出错了。祝你好运!

    编辑:看起来 ViG 似乎在它上面。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-29
      • 2022-11-11
      • 1970-01-01
      • 2021-06-25
      • 2018-06-07
      • 2019-06-18
      相关资源
      最近更新 更多