簡體   English   中英

Python tkinter 文本小部件“已修改”事件似乎未正確觸發

[英]Python tkinter text widget 'Modified' event doesn't seem to fire correctly

我想監視 tkinter Text小部件中的文本何時被修改,以便用戶可以保存他們輸入的任何新數據。 然后按“保存”我想重置它。

我將Text小部件的<<Modified>>事件綁定到 function,以便對文本進行任何更改都會將“保存”按鈕從'disabled'更新為'normal' state。點擊保存按鈕后,我運行了一個 function,它重置了modified的標志並再次禁用“保存”按鈕,直到進行進一步的更改。

但是我發現它似乎只觸發一次事件。 點擊保存並沒有將按鈕重置為'disabled' state,並且在第一次之后編輯文本似乎也沒有影響保存按鈕的 state。

下面是一個最小的例子,展示了標志似乎沒有被重置。

例子

import tkinter as tk

root = tk.Tk()

def text_modified(event=None):
    status_label.config(text="Modified = True")

def reset():
    if not text_widget.edit_modified():
        return
    status_label.config(text="Modified = False")
    text_widget.edit_modified(False)

text_widget = tk.Text(root, width=30, height=5)
text_widget.pack()
text_widget.bind("<<Modified>>", text_modified)

status_label = tk.Label(root, text="Modified = False")
status_label.pack()

reset_btn = tk.Button(root, text="Reset", command=reset)
reset_btn.pack()

root.mainloop()

解決方案

事實證明,將<<Modified>>事件綁定到 function 意味着 function 不會在Text小部件文本更改時運行,而是在modified標志更改時運行 - 無論它更改為True還是False 所以我的 Save 按鈕正在保存數據,禁用自身,並將modified的標志重置為False ,並且此標志更改觸發了<<Modified>>事件,該事件綁定到 function 再次取消禁用 Save 按鈕。

這是一個顯示正在發生的事情的最小示例。 我們只需要調整我們綁定<<Modified>>事件的 function,以便它也處理modifiedFalse的情況:

import tkinter as tk

root = tk.Tk()

def modified_flag_changed(event=None):
    if text_widget.edit_modified():
        status_label.config(text="Modified = True")
        print("Text modified")
    else:
        print("Modified flag changed to False")

def reset():
    if not text_widget.edit_modified():
        print("Doesn't need resetting")
        return
    status_label.config(text="Modified = False")
    text_widget.edit_modified(False)
    print('Reset')

text_widget = tk.Text(root, width=30, height=5)
text_widget.pack()
text_widget.bind("<<Modified>>", modified_flag_changed)

status_label = tk.Label(root, text="Modified = False")
status_label.pack()

reset_btn = tk.Button(root, text="Reset", command=reset)
reset_btn.pack()

root.mainloop()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM