【问题标题】:Insert and delete on focus of loop widget在循环小部件的焦点上插入和删除
【发布时间】:2021-09-03 15:27:34
【问题描述】:

我该怎么做?这有效,但仅适用于最后一个 ScrolledText,我需要它与特定的 ScrolledText 一起工作,一直在玩名称,但似乎无法让它工作。

有什么想法吗?

from tkinter.scrolledtext import ScrolledText
from tkinter import Tk

root = Tk()
w, h = root.winfo_screenwidth(), root.winfo_screenheight()
root.geometry("%dx%d+0+0" % (w, h))




for x in range(6):
    kiblogbn = ScrolledText(root, name="frm_"+x, width=25, height=30, border=2, relief="solid")
    kiblogbn.grid(column=x, row=0, padx=10, pady=10, ipady=25, sticky="W")

    kiblogbn.insert("1.0", 'Copy logs here.')
    kiblogbn.bind("<FocusIn>", lambda _: kiblogbn.delete('1.0', 'end'))
    kiblogbn.bind("<FocusOut>", lambda _: kiblogbn.insert("1.0", "Copy logs here." if str(kiblogbn.get("1.0", "end")) == "\n" else ""))




if __name__ == "__main__":
    root.mainloop()

【问题讨论】:

  • 问题中的代码只有一个 ScrolledText 小部件。很难知道“最后一个 ScrolledText”是什么意思。请创建一个有效的minimal reproducible example
  • 完成,请看帖子更新
  • kiblogbn 放入列表中。

标签: python python-3.x tkinter


【解决方案1】:

改两行:

kiblogbn.bind("<FocusIn>", lambda _: kiblogbn.delete('1.0', 'end'))
kiblogbn.bind("<FocusOut>", lambda _: kiblogbn.insert("1.0", "Copy logs here." if str(kiblogbn.get("1.0", "end")) == "\n" else ""))

kiblogbn.bind("<FocusIn>", lambda e: e.widget.delete('1.0', 'end'))
kiblogbn.bind("<FocusOut>", lambda e: e.widget.insert("1.0", "Copy logs here." if str(e.widget.get("1.0", "end")) == "\n" else ""))

name="frm_"+x 也会引发错误,因为x 是整数。将其更改为name="frm_"+str(x)


更新:仅当内容与占位符相同时才在焦点外删除内容:

PLACEHOLDER = 'Copy logs here.'

for x in range(6):
    kiblogbn = ScrolledText(root, name="frm_"+str(x), width=25, height=30, border=2, relief="solid")
    kiblogbn.grid(column=x, row=0, padx=10, pady=10, ipady=25, sticky="W")

    kiblogbn.insert("1.0", PLACEHOLDER)
    kiblogbn.bind("<FocusIn>", lambda e: e.widget.delete("1.0", "end-1c") if e.widget.get("1.0", "end-1c") == PLACEHOLDER else None)
    kiblogbn.bind("<FocusOut>", lambda e: e.widget.insert("1.0", PLACEHOLDER if e.widget.get("1.0", "end-1c") == "" else ""))

建议使用函数而不是 lambdas 以获得更好的可读性。

【讨论】:

  • 我以前没想过的疯狂的事情,在我们输入文本后,它消失在焦点之外:我该如何解决这个问题?
  • 另一件事,我怎样才能调用焦点函数? kiblogbn.bind("",lambda e: e.widget.insert("1.0", PLACEHOLDER if e.widget.get("1.0", "end-1c") == "" else "" ,lambda e,widget:checkval(e,widget,y, y1, y2, y3, y4, y5))))
猜你喜欢
  • 2013-08-27
  • 2013-04-06
  • 2023-02-07
  • 2018-11-19
  • 1970-01-01
  • 2018-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多