设计用于删除Tkinter文本小部件内容的线程无法运行。
抱歉,如果这个问题有点具体,但我会尽量解释清楚。
我有一个文本框,用户可以在里面输入文字,然后点击“发送”。
问题是,我需要在使用了十五行后清空这个文本框。
我尝试做的是:
每当用户点击发送,把文本添加到文本框时,我会给一个叫做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()