2017-06-01 76 views
0

我正在尝试为学校制作一个简单的聊天窗口。当我尝试使用entry.get()函数时,它会给出每次测试代码时发生更改的错误。 下面是脚本:Entry.get()会给出错误,每次都会有所不同。无效的命令名称.55

import socket 
import sys 
import tkinter 

global ready 
ready = False 
def setready(): 
    global ready 
    ready = True 
window = tkinter.Tk() 
window.title("MAGENTA Chat Host v1 - send") 
window.geometry("200x100") 
window.configure(bg = "magenta") 
but = tkinter.Button(window, text = "Send", command = (setready())) 
lbl = tkinter.Label(window, bg = "magenta", fg = "snow", text = "Chat") 
msgfield = tkinter.Entry(window) 
but.pack(side = tkinter.RIGHT) 
lbl.pack(side = tkinter.TOP) 
msgfield.pack(side = tkinter.LEFT) 
message = "Message" 
UDP_IP = "127.0.0.1" 

try: 
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
    lbl.config(text = "Socket successfully created") 
except socket.error as err: 
    lbl.config(text = "Socket creation failed with error %s" %(err)) 

window.mainloop() 

while True: 
    if ready == True: 
     message = msgfield.get() 
     if message == "exit": 
      s.close() 
      window.destroy() 
      sys.exit() 
     else: 
      s.sendto(bytes(message, "utf-8"),(UDP_IP,5000)) 
      msgfield.select_clear() 
      ready = False 

以下是错误:

Traceback (most recent call last): 
    File "C:\Users\qscguest\Desktop\ChatSend.py", line 33, in <module> 
    message = msgfield.get() 
    File "C:\Program Files\Python35\lib\tkinter\__init__.py", line 2522, in get 
    return self.tk.call(self._w, 'get') 
_tkinter.TclError: invalid command name ".55573472" 

我怎么会惹这么糟糕?我该如何解决?

+0

你有无限的递归,因为在'setr​​eady'里面你正在执行'command = setready()'。你的功能正在调用自己。这不是你想要的。你想把'command'设置到_function本身,而不是函数的返回值:'command = setready'。 –

+0

没有什么变化。同样的错误。 –

+0

代码的缩进不正确,导致无法知道'setr​​eady'内的代码是什么,什么不是。 –

回答

0

window.mainloop()将不会退出,直到根窗口被销毁。任何试图引用小部件的代码都将失败,因为小部件已被销毁。

+0

我明白你的意思,但是我应该把它放在哪里?如果我把它放在永远不会奏效的结尾。 –

0

我认为你正在尝试让你的tkinter应用程序关闭程序,当你键入退出并点击发送,以及做其他一些功能。我修改了你的代码来做我认为你正在尝试的东西。

我改变了一些东西。

一个我摆脱了不需要的全局,因为我们可以在循环时将ready移动到您定义的函数中。

我改变了按钮以运行命令myWhile()使用lambda循环,因此myWhile在启动时不会被调用。

我添加了一个名为myWhile()的函数来容纳while循环并执行您需要完成的任务。让我知道这是你在找什么,因为我不能100%确定你的需求。

import socket 
import sys 
import tkinter 

window = tkinter.Tk() 
window.title("MAGENTA Chat Host v1 - send") 
window.geometry("200x100") 
window.configure(bg = "magenta") 
but = tkinter.Button(window, text = "Send", command = lambda: myWhile()) 
lbl = tkinter.Label(window, bg = "magenta", fg = "snow", text = "Chat") 
msgfield = tkinter.Entry(window) 
but.pack(side = tkinter.RIGHT) 
lbl.pack(side = tkinter.TOP) 
msgfield.pack(side = tkinter.LEFT) 
message = "Message" 
UDP_IP = "127.0.0.1" 

try: 
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
    lbl.config(text = "Socket successfully created") 
except socket.error as err: 
    lbl.config(text = "Socket creation failed with error %s" %(err)) 


def myWhile(): 
    ready = True 
    while ready == True: 
     message = msgfield.get() 
     print ('ready') 
     if message == "exit": 
      s.close() 
      window.destroy() 
      sys.exit() 
     else: 
      s.sendto(bytes(message, "utf-8"),(UDP_IP,5000)) 
      msgfield.select_clear() 
      ready = False 

window.mainloop() 
相关问题