设计用于删除Tkinter文本小部件内容的线程无法运行。

2 投票
1 回答
857 浏览
提问于 2025-04-17 19:26

抱歉,如果这个问题有点具体,但我会尽量解释清楚。

我有一个文本框,用户可以在里面输入文字,然后点击“发送”。

问题是,我需要在使用了十五行后清空这个文本框。

我尝试做的是:

每当用户点击发送,把文本添加到文本框时,我会给一个叫做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次东西,才能让它清空聊天框。

谢谢你如果能看一下。我现在真的有点困惑。

1 个回答

2
  • 你完全不需要一个线程来监控文本框(chatbox),因为文本框本身可以告诉你里面有多少行文字:

    numlines = len(chatbox.get("1.0",END).splitlines())
    
  • 而且,Tkinter 不是线程安全的。所有的图形界面组件只能由一个线程来操作。


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()

撰写回答