2017-06-01 70 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() 
相關問題