英文:
Tkinter problem while using the text widget
问题
我有这段代码来使每个文本小部件(Text() widget)可点击,该文本小部件使用了tkinter。
然而,当我运行程序并单击文本时,我会收到每个相应文本行的错误消息:
_tkinter.TclError: bad text index "This is the first string."
_tkinter.TclError: bad text index "This is the second string."
_tkinter.TclError: bad text index "This is the third string."
如果有人知道解决此问题的方法,请告诉我,我将永远感激不尽。以下是完整的代码:
import tkinter as tk
def text_click(event):
index = text_widget.tag_names(tk.CURRENT)[0]
clicked_text = text_widget.get(index)
print(clicked_text)
# 创建主窗口
window = tk.Tk()
# 创建一个Text小部件
text_widget = tk.Text(window, wrap="word")
text_widget.pack()
# 字符串列表
texto = ["This is the first string.", "This is the second string.", "This is the third string."]
# 插入列表中的每个字符串
for string in texto:
text_widget.insert(tk.END, string + "\n")
# 为每个插入的字符串应用一个标签
tag_start = f"{text_widget.index(tk.END)}-{len(string) - 1}c"
tag_end = f"{text_widget.index(tk.END)}-1c"
text_widget.tag_add(string, tag_start, tag_end)
# 将点击事件绑定到标签
text_widget.tag_bind(string, "<Button-1>", text_click)
# 使文本小部件为只读
text_widget.configure(state="disabled")
# 启动tkinter事件循环
window.mainloop()
我期望在单击每行文本时打印每行的文本。
英文:
I have this code to make each text "clickleable", from the Text() widget that has tkinter.
However, when I run the program and click over one text I get this error message witch each corresponding
text line:
_tkinter.TclError: bad text index "This is the first string."
_tkinter.TclError: bad text index "This is the second string."
_tkinter.TclError: bad text index "This is the third string."
If anyone may now a way to solve the issue, I be forever grateful. Here is the complete code:
import tkinter as tk
def text_click(event):
index = text_widget.tag_names(tk.CURRENT)[0]
clicked_text = text_widget.get(index)
print(clicked_text)
# Create the main window
window = tk.Tk()
# Create a Text widget
text_widget = tk.Text(window, wrap="word")
text_widget.pack()
# List of strings
texto = ["This is the first string.", "This is the second string.", "This is the third string."]
# Insert each string from the list
for string in texto:
text_widget.insert(tk.END, string + "\n")
# Apply a tag to each inserted string
tag_start = f"{text_widget.index(tk.END)}-{len(string) - 1}c"
tag_end = f"{text_widget.index(tk.END)}-1c"
text_widget.tag_add(string, tag_start, tag_end)
# Bind the click event to the tag
text_widget.tag_bind(string, "<Button-1>", text_click)
# Make the text widget read-only
text_widget.configure(state="disabled")
# Start the tkinter event loop
window.mainloop()
I am expecting to print the text of each line when clicked over it.
答案1
得分: 2
If you print out index
, you'll see it's the string in the error: "This is the first string."
. That is not a valid index. An index needs to be something like line.character or @x,y, and a few other special strings (eg: "end"
, "current"
, etc).
> I am expecting to print the text of each line when clicked over it.
You can use an index of the form @x,y, and you can use the x
and y
attributes of the event
to create that index. Another alternative is to use the index "current"
which represents the character closest to the mouse.
You can use "linestart"
and "lineend"
to translate that index to the start and end of the line.
Example:
def text_click(event):
start_index = text_widget.index(f"@{event.x},{event.y} linestart")
end_index = text_widget.index(f"@{event.x},{event.y} lineend")
clicked_text = text_widget.get(start_index, end_index)
print(clicked_text)
英文:
If you print out index
, you'll see it's the string in the error: "This is the first string."
. That is not a valid index. An index needs to be something like line.character or @x,y, and a few other special strings (eg: "end"
, "current"
, etc).
> I am expecting to print the text of each line when clicked over it.
You can use an index of the form @x,y, and you can use the x
and y
attributes of the event
to create that index. Another alternative is to use the index "current"
which represents the character closest to the mouse.
You can use "linestart"
and "lineend"
to translate that index to the start and end of the line.
Example:
def text_click(event):
start_index = text_widget.index(f"@{event.x},{event.y} linestart")
end_index = text_widget.index(f"@{event.x},{event.y} lineend")
clicked_text = text_widget.get(start_index, end_index)
print(clicked_text)
答案2
得分: 0
你可以像这样修改你的 text_click
函数:
def text_click(event):
index = text_widget.index(tk.CURRENT)
clicked_text = text_widget.get(index + " linestart", index + " lineend")
print(clicked_text)
这会使用 text_widget.index(tk.CURRENT)
获取被点击文本的索引,然后通过添加适当的 linestart
和 lineend
修饰符来检索实际文本。
英文:
You can modify your text_click
function like this:
def text_click(event):
index = text_widget.index(tk.CURRENT)
clicked_text = text_widget.get(index + " linestart", index + " lineend")
print(clicked_text)
This retrieves the index of the clicked text using text_widget.index(tk.CURRENT)
, then it uses that index to retrieve the actual text by adding the appropriate linestart
and lineend
modifiers to the index.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论