【问题标题】:Stop the error when trying to manipulate the items of a Listbox, but no item is selected?尝试操作列表框的项目时停止错误,但未选择任何项目?
【发布时间】:2015-03-24 18:02:20
【问题描述】:

我是 tkinter 的初学者。我正在制作一份名单。您可以删除、选择和编辑它,但如果我没有在列表中选择任何内容并单击这些按钮,它会显示:

Exception in Tkinter callback Traceback (most recent call last): File
"C:\Python34\lib\tkinter\__init__.py", line 1533, in __call__ return
self.func(*args) File "C:\Users\user\Desktop\HOW_TOUGH - NEW\Change_user.py",
line 60, in Edit (idx, ) = d ValueError: need more than 0 values to unpack'''

如果用户没有点击任何东西但我不够专业,我打算禁用这些按钮。这是我的代码(它是一个子窗口)

from tkinter import *
from tkinter import ttk
from tkinter import messagebox

class Nick:

    def __init__(self, master ):
        self.master = master
        self.window = Toplevel(master)
        self.window.title('Change User')
        self.window.geometry('300x300')
        self.window.minsize(300, 300)
        self.window.maxsize(300, 300)

        self.nickname = StringVar()

        self.lb = Listbox(self.window, selectmode = 'SINGLE')

        f= open('users.txt','r')
        rec = f.readlines()
        f.close()

        for i in rec:
            p = i.find('|')
            nickname = i[:p]
            self.lb.insert(END, nickname)

        self.lb.pack()

        self.Ed = ttk.Button(self.window, text = 'Edit', command = self.Edit).pack()
        self.Del = ttk.Button(self.window, text = 'Delete', command = self.Delete).pack()
        self.Bac = ttk.Button(self.window, text = 'Back', command = self.Back).pack()
        self.Okay = ttk.Button(self.window, text = 'Ok', command = self.Ok).pack()

    def Back(self):
        self.window.destroy()

    def Delete(self):

        d = self.lb.curselection()
        (idx, ) = d
        self.lb.delete(idx)

        f = open('users.txt','r')
        r = f.readlines()
        f.close()

        rec = r[idx]
        r.remove(rec)

        f = open('users.txt','w')
        new = ''.join(r)
        r = f.write(new)
        f.close()

        messagebox.showinfo(title='Success', message = 'Delete successful')

    def Edit(self):
        d = self.lb.curselection()
        (idx, ) = d
        import Edit as Edet
        Edet.Edit(self.master, idx)

    def Ok(self):

        d = self.lb.curselection()
        (idx, ) = d
        get = self.lb.get(idx)
        self.window.destroy()
        print (get)
        print (d)

【问题讨论】:

    标签: button python-3.x tkinter listbox


    【解决方案1】:

    当没有选择任何内容时,方法curselection() 返回一个空元组。您只需添加一个

    即可跳过这些方法
    if not d:
        return
    

    如果您想让按钮变灰,可以这样做:

    button["state"] = DISABLED
    

    请注意,目前这不适用于您的代码:

    self.button = ttk.Button(...).pack()
    

    问题在于调用pack(),它返回None,有效地将self.button绑定到None。只需先将按钮对象分配给变量,然后将其打包。此外,不建议从 Tkinter 导入 *,因为您在命名空间中删除了大约 190 个名称。只需使用

    import tkinter as tk
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-23
      • 1970-01-01
      • 1970-01-01
      • 2016-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多