2

对不起,如果这是一个相当具体的问题,但让我试着解释一下。

我有一个文本框,用户可以通过在框中输入文本并点击“发送”来添加文本。

问题是我需要在使用十五行后清除文本框。

这是我试图做的:

每当用户点击发送,将文本添加到文本框时,它都会向名为 textlimiter 的变量添加一个数字。因为每个发送按钮也会创建一个新行。我可以使用变量来记录“发送”到文本框的次数。

当变量超过 15 时,正在观察变量的线程将清除文本框。

事情是,它似乎永远不会工作。我尝试过寻求帮助,我从一个很棒的人那里得到了一些帮助,他建议我将所有内容都重写为“框架”,这样我就可以将所有的函数、小部件和变量归为一个类。

看来我与变量类有冲突。所以我尝试在我的班级中将变量设置为“全局”,并使用该变量进行函数。但这似乎也不起作用。

我想我可以去把它全部重写成框架,但我只是想问是否有人有他们能想到的快速修复。(我也不知道一旦我完成了那个人什么时候可以帮助我,如果出现问题)

如果我的问题不恰当,或者不知何故不允许,请告诉我,我明天起床后将其删除。对不起,如果它是坏的。

我这里有代码:

# [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 次内容,它才能清除聊天框。

谢谢你看看如果你这样做。我现在真的有点难过。

4

1 回答 1

2
  • 您绝对不需要线程来监视 Text 小部件 ( chatbox),因为聊天框本身可以告诉您它包含多少行文本:

    numlines = len(chatbox.get("1.0",END).splitlines())
    
  • 此外,Tkinter 不是线程安全的。所有的 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()
于 2013-03-17T22:14:04.200 回答