用于删除Tkinter文本小部件内容的线程无法操作

2024-10-17 08:23:10 发布

您现在位置:Python中文网/ 问答频道 /正文

抱歉,如果这是一个相当具体的问题,但让我试着解释清楚。在

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

问题是我需要在使用了15行之后清理文本框。在

我想做的是:

每当用户点击send,将文本添加到textbox中时,它会将一个数字添加到一个名为textclimiter的变量中。因为每个发送按钮都会创建一个新行。我可以用一个变量来记录一些东西被“发送”到文本框的次数。在

当变量超过15时,监视该变量的线程将清除文本框。在

事情是,它似乎永远都不管用。我试着寻求帮助,一个很棒的家伙建议我把所有的东西都重写成“frames”,这样我就可以把我所有的函数、小部件和变量分类到一个类中。在

看来我和变量类有冲突,所以我试图在类的内部将变量设置为'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次,这样它就可以清除聊天室了。在

谢谢你看看。我现在真的有点困惑。在


Tags: importboxsendinputtitlechatglobalpack
1条回答
网友
1楼 · 发布于 2024-10-17 08:23:10
  • 您绝对不需要线程来监视文本小部件 (chatbox),因为聊天框本身可以告诉您有多少行 包含的文本:

    numlines = len(chatbox.get("1.0",END).splitlines())
    
  • 而且,Tkinter is not threadsafe。所有GUI小部件都应该 只有一根线。


^{pr2}$

相关问题 更多 >