2013-03-17 49 views
2

對不起,如果這是一個相當具體的問題,但讓我試着解釋一下。旨在刪除Tkinter Text Widget內容的線程無法運行。

我有一個文本框,用戶可以添加文本,方法是在框中鍵入並點擊「發送」。

問題是我需要在使用十五行後清除文本框。

這裏是我試圖做的:

每當用戶點擊發送,將文本添加到文本框,把它添加是一個數字的變量稱爲textlimiter。因爲每個發送按鈕也會創建一個新行。我可以使用變量來記錄「發送」到文本框的次數。

當變量超過15時,正在監視變量的線程將清除文本框。

事情是,它似乎從來沒有工作。我嘗試過尋求幫助,我從一個很棒的人那裏得到了一點點建議,我把所有的東西都改寫成了「框架」,這樣我就可以將我的所有功能,小部件和變量分類到一個類中。

看起來我和變量類有衝突。所以我嘗試在我的類中設置變量爲'global',並使用變量函數。但是這似乎也不起作用。

我可以去把它們全部改寫成我想的框架,但我只是想問問,如果有人有一個快速修復,他們可以想到這裏。 (我也不知道什麼時候這個傢伙可以幫我解決問題,如果問題出現了)

如果我的問題不恰當,或者某種程度上不允許,告訴我,明天當我起牀。很抱歉,如果它不好。

我有代碼在這裏:

# [Importing Modules] 
from tkinter import * 
import os 
import threading 

#_________________| Setting Variables 
global textlimiter 
textlimiter = 0 


#____________| Defining Functions   


def CONVERT(): 
    chatbox.insert(INSERT,"You: "+USER_ENTRY.get()+ "\n") 
    INPUT_BOX.set("") 
    global textlimiter 
    textlimiter += 1 




#_______| Creating Window | 

chat = Tk() 
chat.title("Net Send Client [0.4]") 
chat.geometry('550x500+200+200') 


#________| Title | 

title = StringVar() 
title.set("Net Send Chat\n Type in box to send.") 
title_widget = Label(chat,textvariable = title, height = 4) 
title_widget.pack() 

#_______________________| User Input Box| 
INPUT_BOX = StringVar() 
USER_ENTRY = Entry(chat,textvariable = INPUT_BOX) 
USER_ENTRY.pack(side=TOP, padx = 10, pady = 20) 

#___________________________________________________________________| Send Button| 
send_button = Button(chat, text="Send",width = 20, command = CONVERT) 
send_button.pack(padx = 10, pady = 10) 


#_______________________________________________________| Text Box Widget | 
chatbox = Text(width = 60, height = 15, relief = SUNKEN) 
left = Frame(chatbox) 
right = Frame(chatbox) 
s_start = Scrollbar(right) 
s_start.pack(side=RIGHT) 

chatbox.grid(row = 0, column = 0, columnspan = 3) 
chatbox.pack() 

#__________________________________________| Chat Wizard Checks Text Limit| 
class Chatwizard(threading.Thread): 
    def Chatmonitor(): 
     global textlimiter 
     if textlimiter >= 15: 
      chatbox.set(None) 
      chatbox.insert(INSERT,"Console: Limit Reached, Chat Wiped" + "\n") 
Chatwizard.start 


chat.mainloop() 

正如你可以看到我已經盡我的變量設置爲全球,但似乎沒有任何改變。

如果您嘗試運行該程序,請記住您需要輸入併發送15次,才能擦除聊天窗口。

謝謝你看看,如果你這樣做。我現在真的有點難過。

+0

'Chatwizard.start'缺少末括號。如果你想運行線程,它應該是'Chatwizard.start()'。 'Thread's需要定義'run()'方法。既然你沒有'run()'方法,即使你啓動了線程,它也不會執行任何操作。 – 2013-03-17 21:52:37

回答

2
  • 你絕對不需要一個線程來監視文本小 (chatbox),因爲客艙本身可以告訴你有多少行 文本包含:

    numlines = len(chatbox.get("1.0",END).splitlines()) 
    
  • 此外, Tkinter is not threadsafe。所有的GUI小部件應該是 只有一個線程。


from Tkinter import * 
import os 
import threading 

def CONVERT(): 
    numlines = len(chatbox.get("1.0",END).splitlines()) 
    if numlines > 2: 
     chatbox.delete("1.0",END) 
     chatbox.insert(INSERT,"Console: Limit Reached, Chat Wiped" + "\n") 
    chatbox.insert(INSERT,"You: "+USER_ENTRY.get()+ "\n") 
    INPUT_BOX.set("") 

chat = Tk() 
chat.title("Net Send Client [0.4]") 
chat.geometry('550x500+200+200') 

title = StringVar() 
title.set("Net Send Chat\n Type in box to send.") 
title_widget = Label(chat,textvariable = title, height = 4) 
title_widget.pack() 

INPUT_BOX = StringVar() 
USER_ENTRY = Entry(chat,textvariable = INPUT_BOX) 
USER_ENTRY.pack(side=TOP, padx = 10, pady = 20) 

send_button = Button(chat, text="Send",width = 20, command = CONVERT) 
send_button.pack(padx = 10, pady = 10) 

chatbox = Text(width = 60, height = 15, relief = SUNKEN) 
left = Frame(chatbox) 
right = Frame(chatbox) 
s_start = Scrollbar(right) 
s_start.pack(side=RIGHT) 

chatbox.grid(row = 0, column = 0, columnspan = 3) 
chatbox.pack() 

chat.mainloop()