- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个文本小部件,它在程序运行时显示信息。我想添加功能,允许我用新行覆盖文本小部件的最后一行。我的代码如下所示:
class TextRedirector(object):
def __init__(self, text_widget):
self.text_widget = text_widget
def write(self, the_string):
self.text_widget.configure(state="normal")
self.text_widget.insert("end", the_string)
self.text_widget.see(END)
self.text_widget.configure(state="disabled")
def overwrite(self, the_string):
self.text_widget.configure(state="normal")
self.text_widget.delete("end-1l linestart+1c", "end")
self.text_widget.insert("end", the_string)
self.text_widget.see(END)
self.text_widget.configure(state="disabled")
How do I get the line and column of the end position of text in Tkinter? -- 我看过这篇文章,其中 Bryan Oakley 似乎用 textwidget.delete("end-1c linestart", "end")
回答了我的问题。 ,但是当我使用它时,文本会交替放置在最后一行的末尾和实际覆盖最后一行。也就是说,一半的时候起作用,一半的时候新文本拍在旧文本的末尾。我对文本小部件的索引表达式的理解(在 http://effbot.org/tkinterbook/text.htm 中简要介绍)是“end-1c linestart”的意思是“结束,后一个字符,行的开头”,所以我不明白为什么它会这样到一行文本的末尾,并且仅每隔一次。每一步的结果看起来都是这样的(每个部分都是整个文本小部件的更新版本,只有最后几行被修改):
!!!!! Settings Have Been Backed Up !!!!!
Computing coordinates...
Coordinates have been computed.
iteration: 1 / 42
-----
!!!!! Settings Have Been Backed Up !!!!!
Computing coordinates...
Coordinates have been computed.
iteration: 1 / 42iteration: 2 / 42
-----
!!!!! Settings Have Been Backed Up !!!!!
Computing coordinates...
Coordinates have been computed.
iteration: 3 / 42
-----
!!!!! Settings Have Been Backed Up !!!!!
Computing coordinates...
Coordinates have been computed.iteration: 4 / 42
-----
我尝试使用self.text_widget.delete("end-1l linestart+1c", "end")
。这几乎可行,但我最终得到
!!!!! Settings Have Been Backed Up !!!!!
Computing coordinates...
Coordinates have been computed.
iteration: 1 / 42
-----
!!!!! Settings Have Been Backed Up !!!!!
Computing coordinates...
Coordinates have been computed.
iteration: 1 / 42
iteration: 2 / 42
-----
!!!!! Settings Have Been Backed Up !!!!!
Computing coordinates...
Coordinates have been computed.
iteration: 1 / 42
iiteration: 3 / 42
-----
!!!!! Settings Have Been Backed Up !!!!!
Computing coordinates...
Coordinates have been computed.
iteration: 1 / 42
iiteration: 4 / 42
我已经尝试了一些其他的事情,尽我所能地使用这些索引表达式,但我还没有解决问题。我尝试在覆盖函数中添加 if 语句来处理可能位于小部件末尾的文本的不同情况,例如,如果它以空行或两个空行等结尾。我也没有成功。
为了充分披露,我可能会提到我正在使用此文本小部件作为命令行打印输出的替代品。因此,该类的名称为 TextRedirector。我认为这对当前的问题没有任何影响,但错误的假设可能是让我首先来到这里的原因......课后的行是这样的:
sys.stdout = TextRedirector(self.textbox)
self.textbox 是在定义类之前创建的文本小部件。
更新:我尝试保存上次插入文本之前的索引,并基于该索引构建一个字符串表达式以删除最后一行。结果仍然不完美。
class TextRedirector(object):
def __init__(self, text_widget):
self.text_widget = text_widget
self.index_before_last_print = ""
def write(self, the_string):
self.index_before_last_print = self.text_widget.index("end")
self.text_widget.configure(state="normal")
self.text_widget.insert("end", the_string)
self.text_widget.see(END)
self.text_widget.configure(state="disabled")
def overwrite(self, the_string):
self.text_widget.configure(state="normal")
self.text_widget.delete(self.index_before_last_print + "-1c linestart+1c", "end")
self.index_before_last_print = self.text_widget.index("end")
self.text_widget.insert("end", the_string)
self.text_widget.see(END)
self.text_widget.configure(state="disabled")
结果如下
!!!!! Settings Have Been Backed Up !!!!!
Computing coordinates...
Coordinates have been computed.
iteration: 1 / 42
-----
!!!!! Settings Have Been Backed Up !!!!!
Computing coordinates...
Coordinates have been computed.
iiteration: 2 / 42
-----
!!!!! Settings Have Been Backed Up !!!!!
Computing coordinates...
Coordinates have been computed.
iiteration: 3 / 42
-----
!!!!! Settings Have Been Backed Up !!!!!
Computing coordinates...
Coordinates have been computed.
iiteration: 4 / 42
最佳答案
更新:下面描述的行为记录在 Tcl/Tk 文档中,此处:https://www.tcl.tk/man/tcl8.6/TkCmd/text.htm 。具体来说,引用小部件中最后一个换行符之后位置的插入实际上发生在 pathName insert
文档中声明的该换行符之前; pathName delete
文档指出,不会给小部件留下最终换行符的删除操作将被静默修改以保留最终换行符。
原答案:
我遇到了同样的问题,并且找到了适合我的解决方案。太尔;博士:Tk 文本小部件在插入和插入时有一些令人费解的(对我而言)不规则之处在末尾位置删除,但如果您总是附加新内容前导(而不是尾随)换行符,它应该按照您的预期运行。具体来说,text.delete("end-1l","end")
后跟 text.insert("end",u"\nContent")
将替换最后一行。
通过在 Wish(Tk shell)和 Python 2.7 中试验文本小部件,我发现:
1) 新创建的文本小部件包含换行符。你不能轻易删除它,如果你以某种方式设法做到这一点,该小部件将表现得非常好此后很奇怪。
>>> import Tkinter as tk
>>> root = tk.Frame()
>>> t = tk.Text(root)
>>> t.grid()
>>> root.grid()
>>> t.get('1.0','end')
u'\n'
>>> t.delete('1.0','end')
>>> t.get('1.0','end')
u'\n'
这真是一个惊喜! “从头开始删除所有内容”的哪一部分到最后”你不明白吗,Tk?
2) “末尾”处的插入实际上是插入到最后一个换行符之前。这似乎与 Tk 文档相冲突,这表明“结束”位置是指紧接着之后的字符位置小部件中的最后一个换行符。
>>> t.insert('end',u"\nA line")
>>> t.get('1.0',"end')
u'\nA line\n'
虽然我们想在最后插入,但插入实际上发生了在最后一个换行符之前。
>>> t.insert('end',u"\nLine 2")
>>> t.get('1.0','end')
u'\nA line\nLine 2\n'
而且这种行为似乎是一致的。如果我们尝试删除一行怎么办?出色地以“直观”的方式做到这一点:从“end”备份一行并从那里“结束”:
>>> t.delete('end-1l','end')
>>> t.get('1.0','end')
u'\nA line\n'
我们回到了之前的状态,这是个好消息!另一个插入将插入的行放在预期的位置:
>>> t.insert('end',u"\nA new line")
>>> t.get('1.0','end')
u'\nA line\nA new line\n'
但是,只有当我们使用前导换行符添加行时,这才按预期工作。如果我们使用尾随换行符添加它们,文本将被附加到上一行,并且附加的尾随换行符被添加到小部件:
>>> t.insert('end',u"Trailing newline\n")
>>> t.get('1.0','end')
u'\nA line\nA new lineTrailing newline\n\n'
如果您相信 Tk 文档,这不是您所期望的 - 您期望在“末尾”插入会将您的测试插入之后最后的换行符。但可惜的是,你错了。
以下完整的测试程序显示一个文本小部件,以及一个输入字段和两个按钮,其中一个按钮将输入字段中的一行添加到小部件,另一个覆盖小部件的最后一行输入字段文本。 addLine() 和replaceLastLine() 函数实现以直接的方式表现这些行为。开头的空行这个小部件是一个小烦恼,你可以通过这样做来解决t.delete("1.0","1.0+1c")
,但仅在将一些文本插入小部件之后。
import Tkinter as tk
root = tk.Frame()
t = tk.Text(root)
t.grid(row=0,column=0,columnspan=3)
root.grid()
def addLine():
msg = lineField.get()
t.insert("end",u"\n{}".format(msg))
def replaceLastLine():
msg = lineField.get()
t.delete("end-1l","end")
t.insert("end",u"\n{}".format(msg))
lineField = tk.Entry(root)
lineField.grid(row=1,column=0)
addBtn = tk.Button(root,text="Add line",command=addLine)
addBtn.grid(row=1,column=1)
replBtn = tk.Button(root,text="Replace line",command=replaceLastLine)
replBtn.grid(row=1,column=2)
tk.mainloop()
关于python - 使用 Tkinter Text 索引表达式删除最后一行文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43561558/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!