我正在尝试为我的抽搐聊天机器人制作测试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\Cosmicluck\Desktop\bot.py", line 122, in commandTest
send_message(CHAN, "Click!")
File "C:\Users\Cosmicluck\Desktop\bot.py", line 30, in send_message
con.send(bytes('PRIVMSG %s :%s\r\n' % (chan, msg), 'UTF-8'))
NameError: name 'con' is not defined
现在它说没有定义“con”,但是我不需要定义它,因为我设置的命令工作得非常好。以下是NameError引用的代码:
def send_pong(msg):
con.send(bytes('PONG %s\r\n' % msg, 'UTF-8'))
def send_message(chan, msg):
con.send(bytes('PRIVMSG %s :%s\r\n' % (chan, msg), 'UTF-8'))
def send_nick(nick):
con.send(bytes('NICK %s\r\n' % nick, 'UTF-8'))
def send_pass(password):
con.send(bytes('PASS %s\r\n' % password, 'UTF-8'))
def join_channel(chan):
con.send(bytes('JOIN %s\r\n' % chan, 'UTF-8'))
def part_channel(chan):
con.send(bytes('PART %s\r\n' % chan, 'UTF-8'))
最后这是我的Tkinter按钮代码:
master = Tk()
def commandTest():
send_message(CHAN, "Click!")
b = Button(master, text="OK", command=commandTest)
b.pack()
mainloop()
我希望有人可以解释如何解决这个问题,如果有可能的话。谢谢!
答案 0 :(得分:1)
在您的代码中,您似乎在尝试在连接到套接字之前调用mainloop()
。如果名称暗示它实际上是“主循环”,则需要在调用后调用mainloop()
;
con = socket.socket()
con.connect((HOST, PORT))
send_pass(PASS)
send_nick(NICK)
join_channel(CHAN)
- 因此,改变
mainloop()
con = socket.socket()
con.connect((HOST, PORT))
send_pass(PASS)
send_nick(NICK)
join_channel(CHAN)
data = ""
到
con = socket.socket()
con.connect((HOST, PORT))
send_pass(PASS)
send_nick(NICK)
join_channel(CHAN)
data = ""
mainloop()
你很可能不得不做一些其他调试,但是,这个应修复你的'con is not defined'问题。
答案 1 :(得分:0)
您的命令功能中引用的con
是本地的,并且与第110行中定义的con
不同:
con = socket.socket()
为命令函数添加参数,这样:
def send_pong(msg, conn):
conn.send(bytes('PONG %s\r\n' % msg, 'UTF-8'))
调用这些函数时,将其作为参数传递:
send_pong(line[1],con)