【问题标题】:tkinter listbox get(ACTIVE) methodtkinter 列表框 get(ACTIVE) 方法
【发布时间】:2013-03-28 01:15:31
【问题描述】:

我试图打印当前选中的Listbox 项目。例如,当我选择项目“一”时,它应该打印出“一”,当我选择项目“二”时,它应该打印出“二”等。以下是我尝试过的。

from Tkinter import*
root=Tk()
sizex = 600
sizey = 400
posx  = 40
posy  = 20
root.wm_geometry("%dx%d+%d+%d" % (sizex, sizey, posx, posy))
itemsforlistbox=['one','two','three','four','five','six','seven']

def CurSelet(evt):
    value=str((mylistbox.get(ACTIVE)))
    print value

mylistbox=Listbox(root,width=60,height=10,font=('times',13))
mylistbox.bind('<<ListboxSelect>>',CurSelet)
mylistbox.place(x=32,y=90)

for items in itemsforlistbox:
    mylistbox.insert(END,items)
root.mainloop()

我的问题是每当我在列表框中选择一个项目时,它实际上是在打印出之前选择的项目。例如,当我在列表中选择项目“二”时,它正在打印出“一”。为了让事情更清楚,请看以下内容

  1. 我选择了“一”项,它打印出“一”
  2. 我选择了“二”项,它又打印出“一”
  3. 我选择了项目“三”,它打印出“二”等等......

我错过了什么吗?还是我误解了get(ACTIVE) 的工作方式?

【问题讨论】:

    标签: python widget tkinter


    【解决方案1】:

    这似乎对我有用:

    mylistbox.get(ANCHOR)
    

    根据您的代码,它将打印出当前项目。

    【讨论】:

      【解决方案2】:

      在您单击某个项目后,它就会变为活动状态——这意味着在您的 ListboxSelect 方法返回之后。因此,您将打印出此点击之前处于活动状态的所有内容(通常意味着您上次点击的内容)。

      另外,鉴于您多次提到“选择”,我认为您想要的是 selected 值,而不是 active 值,所以您应该要求那个。

      对于带有selectmode=SINGLEBROWSE(默认值,您所拥有的)列表框的列表框,您可以轻松修复这两个。只需改变这个:

      mylistbox.get(ACTIVE)
      

      到:

      mylistbox.get(mylistbox.curselection())
      

      如果您需要处理 MULTIPLEEXTENDED,那么当然有 0 到 7 个选择而不是 1,因此您需要执行以下操作:

      values = [mylistbox.get(idx) for idx in mylistbox.curselection()]
      print ', '.join(values)
      

      虽然我们正在这样做,但我不确定您为什么要这样做 str((mylistbox.get(ACTIVE))),甚至是 str(mylistbox.get(ACTIVE))mylistbox.get 带有单个索引的结果将是一个字符串,与您插入的相同。

      【讨论】:

      • 非常感谢..你是对的。我误解了“主动”这个词的意思。并感谢您指出字符串。这是我的错。
      • @ChrisAung:很难怪你不知道。仔细查看它们,文档并没有准确解释 active 的含义,甚至没有暗示这是一个“item become active”类型的事件,而不是一个“item become active”的事件。 TkInter 文档有时会假设您已经了解 Tcl/Tk,而对于 Tk 8.0 之后添加的任何内容,它们甚至更糟,因此您经常需要阅读 Tk man pages 或其他文档,或者只是进行大量实验。跨度>
      • 我完全是初学者.. 所以我不知道 Tcl/Tk 是什么意思.. Tkinter 和 Tcl/Tk 之间的主要区别是什么?
      • @ChrisAung:简单地说:Tk 是脚本语言 Tcl 的内置 GUI。 Tkinter 是 Python 的内置 GUI,是一组围绕 Tcl/Tk 的包装器,用 Python 和 Tcl 组合编写。这就是为什么Tkinter docs 有指向Tcl/Tk manual 和其他各种相关文档的链接。
      • @abarnert 我收到了_tkinter.TclError: bad listbox index "": must be active, anchor, end, @x,y, or a number
      【解决方案3】:

      正如 user1576772 所说,正确答案应该是:

      mylistbox.get(ANCHOR)
      

      curselection() 的问题是它每次都返回当前选择的整个列表。

      考虑这样一种情况,您滚动列表框并希望始终向前或向后获取最后一个选定的项目(不是突出显示列表中的最后一个项目,用户按下的最后一个项目)! curselection() 将为您提供所有当前选择的项目,这很有帮助,但您永远不会知道最后选择了哪个项目!

      【讨论】:

        【解决方案4】:

        你可以使用它,它不需要列表框。因此,如果您有多个列表框,它将从任何列表框中检索值

        from tkinter import*
        root=Tk()
        sizex = 600
        sizey = 400
        posx  = 40
        posy  = 20
        root.wm_geometry("%dx%d+%d+%d" % (sizex, sizey, posx, posy))
        itemsforlistbox=['one','two','three','four','five','six','seven']
        
        def CurSelet(event):
            widget = event.widget
            selection=widget.curselection()
            picked = widget.get(selection[1])
            print(picked)
        
        mylistbox=Listbox(root,width=60,height=10,font=('times',13))
        mylistbox.bind('<<ListboxSelect>>',CurSelet)
        mylistbox.place(x=32,y=90)
        
        for items in itemsforlistbox:
            mylistbox.insert(END,items)
        root.mainloop()
        

        【讨论】:

          【解决方案5】:

          picked = widget.get(selection[1]) 应该是 picked = widget.get(selection[0])

          否则会出现“索引超出范围”的错误。

          【讨论】:

            猜你喜欢
            • 2021-11-04
            • 1970-01-01
            • 1970-01-01
            • 2012-01-28
            • 1970-01-01
            • 2017-12-11
            • 1970-01-01
            • 1970-01-01
            • 2020-04-28
            相关资源
            最近更新 更多