我只需要從我的文本小部件獲取最新的輸入,然后將該字符附加到串列中。我正在使用
Text.get(1.0,'end-1c')
,但它不起作用,因為回圈不斷獲取所有輸入,而不是僅在有新的最新輸入時才獲取最新輸入。
def main_screen():
start_time=time.time()
tk=Tk()
tk.title('Typing Test')
tk.geometry('800x500')
main_title=Label(tk,text='1 Minute Test',font=('Times New Roman',36))
main_title.pack(pady=5)
directions=Label(tk,text='Start Typing',font=('Times New Roman',14))
directions.pack()
base_text=Label(tk,text=randomizer(),bg='#E0E0EE',font=('Arial',14),wraplength=700,justify=LEFT)
base_text.pack(pady=10)
text_area=Text(tk,font=('Arial',14),width=63,height=7,wrap='word')
text_area.pack()
tk.update()
#WPM Calculation
target_text=randomizer()
typed_text=[]
wpm=0
errors=0
while True:
tk.update()
time_elapsed=max(time.time()-start_time,1)
wpm=round((len(typed_text)/60)/5)
if time_elapsed>=60:
break
#Problem Section
key=text_area.get(1.0,'end-1c')
typed_text.append(key)
for x in typed_text:
if x != target_text:
errors = 1
或者,我嘗試使用一個變數代替 .get 中的 1.0,它會隨著回圈的每次迭代而增加 1。接下來,我嘗試了一個 try/except 命令,并將 #Problem 部分放入一個函式中。我嘗試通過將文本區域系結到來呼叫該函式
'<Key>'
'<KeyPress>'
'<KeyRelease>'
這些嘗試都不起作用。我使用 print 陳述句來查看回圈的每次迭代中這些變數是什么,并使用第一種方法,它只是不斷地制作一個越來越長的字串,不斷重復,而不是用每個新字符更新。嘗試其他方法我一無所獲,沒有輸出,但也沒有錯誤。我完全卡住了,不知道還能嘗試什么。
uj5u.com熱心網友回復:
您可以將text_area與<KeyPress>事件系結,但您需要將串列typed_text作為引數傳遞,以便您可以追加按下。
所以你應該這樣做:
text_area.bind("<KeyPress>", lambda _: getKey(_, typed_text))
while True:
tk.update()
time_elapsed = max(time.time() - start_time, 1)
wpm = round((len(typed_text) / 60) / 5)
if time_elapsed >= 60:
break
# Problem Section
for x in typed_text:
if x != target_text:
errors = 1
def getKey(event, list):
list.append(event.char)
print(list)
uj5u.com熱心網友回復:
文本小部件支持稱為“標記”的東西,類似于書簽。您可以在文本中的任何位置放置一個標記,并像使用普通索引一樣使用它。
假設資料只附加到小部件的末尾,最簡單的解決方案是獲取資料塊,然后將標記移動到您獲取的文本的末尾。下次獲取資料時,從該標記開始。
標記有一種叫做“重力”的東西,它定義了標記粘在哪個字符上。例如,如果重力為“左”并且您將其設定為字符“2.2”,則標記將始終與索引“2.2”處的字符相鄰。如果重力是“正確的”,它將卡在索引“2.2”之后的字符處(例如:“2.3”或“3.0”)
這是一個人為的示例,通過跟蹤用于獲取資料的最后位置,每五秒僅將最新添加的內容列印到文本小部件。
import tkinter as tk
def get_new_text():
data = text.get("last", "end-1c")
print(f"new data: >>>{data}<<<")
text.mark_set("last", "end-1c")
root.after(5000, get_new_text)
root = tk.Tk()
text = tk.Text(root, wrap="word")
text.pack(fill="both", expand=True)
text.mark_set("last", "1.0")
text.mark_gravity("last", "left")
root.after(5000, get_new_text)
root.mainloop()
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/534245.html
