【发布时间】: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
【问题讨论】:
-
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。
-
我已经用更多相关信息更新了这篇文章。
-
您是在问如何删除列表框中的所有内容(已记录在案),或者如何修复您的代码以使其在正确的时间执行?您发布了很多似乎与清除列表框无关的代码。