尝试操作列表框的项目但是没有选择项目时停止错误?

时间:2015-03-24 18:02:20

标签: button python-3.x tkinter listbox

我是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)

1 个答案:

答案 0 :(得分:2)

方法curselection()在未选择任何内容时返回空元组。您只需添加

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

如果要使按钮变灰,可以执行以下操作:

button["state"] = DISABLED

请注意,当您执行此操作时,目前无法使用您的代码:

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

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

import tkinter as tk