2

これがかなり具体的な問題である場合は申し訳ありませんが、よく説明させてください。

ユーザーがボックスに入力して[送信]をクリックすることでテキストを追加できるテキストボックスがあります。

問題は、15行が使用された後、テキストボックスをクリーンアップする必要があることです。

これが私がやろうとしたことです:

ユーザーが送信を押すたびに、テキストボックスにテキストを追加するために、textlimiterと呼ばれる変数に数値が追加されます。すべての送信ボタンも新しい行を作成するためです。変数を使用して、テキストボックスに「送信」された回数を記録できます。

変数が15を超えると、変数を監視しているスレッドがテキストボックスを完全に消去します。

物事は、それは決してうまくいかないようです。私は助けを求めてみましたが、すべてを「フレーム」に書き直して、すべての関数、ウィジェット、変数を1つのクラスに分類できるようにすることを提案してくれた素晴らしい人から少しもらいました。

変数クラスと競合しているようです。そこで、クラス内で変数を「グローバル」に設定し、変数を使用して関数を設定しようとしました。しかし、それもうまくいかなかったようです。

私はそれをすべて私が思うフレームに書き直すことができます、しかし私は誰かがここで考えることができる簡単な修正を持っているかどうか尋ねるつもりでした。(私が終わったら、その男がいつ私を助けてくれるのか、問題が発生したのかどうかもわかりません)

私の質問が不適切であるか、どういうわけか許可されていない場合は、教えてください。明日起きたら降ろします。悪いならごめんなさい。

私はここにコードを持っています:

# [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
  • chatboxチャットボックス自体がテキストの行数を教えてくれるので、テキストウィジェット()を監視するためのスレッドは絶対に必要ありません。

    numlines = len(chatbox.get("1.0",END).splitlines())
    
  • さらに、Tkinterはスレッドセーフではありません。すべてのGUIウィジェットは、1つのスレッドだけが触れる必要があります。


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 に答える