【问题标题】:Python Tkinter: Delete all contents from ListBoxPython Tkinter:从 ListBox 中删除所有内容
【发布时间】:2018-09-04 22:05:51
【问题描述】:

大家好,很确定这是一个简单的修复方法,但我找不到任何东西。基本上我正在填充一个列表框,每当用户单击列表框中的标签时,我都需要它进行更新(伪更新)。

我唯一的问题是从列表框中删除所有内容。下面我有我实现的功能。提前谢谢!

class SocketThreadedTask(threading.Thread):
def _init_(self, socket, callback):
    threading.Thread._init_(self)
    self.socket = socket
    self.callback = callback
    self.allChannels = None
    self.privateChannels = {}
    self.publicChannels = {}
    self.channelMessages = {}

def run(self):
    channels = None
    messages = None
    while True:
        try:
            message = self.socket.receive()
            if message[0] == "channels":
                self.allChannels = message[1]
                for key, value in self.allChannels.items():
                    if key[0] == '+':
                        oldKey = key
                        newKey = key[1:]
                        self.allChannels[newKey] = value
                        del self.allChannels[oldKey]
                        self.publicChannels[key] = value
                    elif key[0] == '-':
                        key = key[1:]
                        self.privateChannels[key] = value
                message = message[0]
                self.callback(None, self.allChannels, None)
            elif message[0] == "messages":
                self.channelMessages = messages = message[1]
                message = message[0]
                self.callback(message, None, messages)
            else:
                message = message[0]
                self.callback(message, None, None)
            if message == '/quit':
                self.callback('> You have been disconnected from the chat room.')
                self.socket.disconnect()
                break
        except OSError:
            break

class ChatWindow(tk.Frame):
def _init_(self, parent):
    tk.Frame._init_(self, parent)

    self.initUI(parent)

def initUI(self, parent):
    self.messageScrollbar = tk.Scrollbar(parent, orient=tk.VERTICAL)
    self.messageScrollbar.grid(row=0, column=3, sticky="ns")

    self.messageTextArea = tk.Text(parent, bg="white", state=tk.DISABLED, yscrollcommand=self.messageScrollbar.set, wrap=tk.WORD)
    self.messageTextArea.grid(row=0, column=0, columnspan=2, sticky="nsew")

    # list of users
    self.usersListBox = tk.Listbox(parent, bg="white")
    self.usersListBox.grid(row=0, column=4, padx=5, sticky="nsew")

    self.entryField = entry.BaseEntry(parent, placeholder="Enter message.", width=80)
    self.entryField.grid(row=1, column=0, padx=5, pady=10, sticky="we")

    self.send_message_button = tk.Button(parent, text="Send", width=10, bg="#CACACA", activebackground="#CACACA")
    self.send_message_button.grid(row=1, column=1, padx=5, sticky="we")

def update_window(self, message, channels, messages):
    if (message is None) and (messages is None):
        self.refresh_users(channels)
    elif (channels is None) and (message is None):
        self.refresh_messages(messages)
    elif (channels is None) and (messages is None):
        self.update_chat_window(message)

def refresh_users(self, channels = {}):
     self.usersListBox.delete(0, END)
     self.usersListBox.insert(0, "Channels")
     if bool(channels) is True:
          count = 1
          for key, value in channels.items():
               label = Label(self.userListBox, text=key)
               label.pack()
               label.bind(None, self.switch(label.cget("text")))
               self.usersListBox.insert(count, label)
               count += 1

我会附上2张图片

【问题讨论】:

  • if (channels) is True 对我来说看起来很奇怪。由于您稍后会致电channels.items,因此我假设您希望频道是一个字典。但是如果 channels 是一个字典,那么 if (channels) is True 永远不会是 True。我怀疑您听说过“非空字典在布尔上下文中为 True”这一事实,但这并不意味着 some_dict is True 永远为 True,这意味着 bool(some_dict) 可以为 True。
  • 啊,是的,我忘记添加了。我现在就编辑它。
  • 好的,现在看起来好多了。但是仅仅从这一小段代码很难判断问题出在哪里。你有错误吗?程序是否运行没有错误,但没有做你想做的事?如果是这样,它在做什么,你希望它做什么?请提供minimal reproducible example
  • 我已经用更多相关信息更新了这篇文章。
  • 您是在问如何删除列表框中的所有内容(已记录在案),或者如何修复您的代码以使其在正确的时间执行?您发布了很多似乎与清除列表框无关的代码。

标签: python tkinter listbox


【解决方案1】:

我很惊讶它没有崩溃。我没有看到您的导入语句,但在您的代码中,您可能需要编写上下文:

 self.usersListBox.delete(0, tk.END)

我认为您将 Tkinter 导入为 tk,而 END 是 tk 的一个组件。因为它没有这样定义,END 是否可能是某个通配符库或代码中其他地方的变量?

如上例所示,在您的删除函数中指定tk.END"end",这样可以防止出现此错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    • 2018-06-13
    • 2018-01-29
    • 2014-03-26
    相关资源
    最近更新 更多