首页 > 解决方案 > 我正在尝试让 Text 小部件功能在 python tkinter 中正常工作

问题描述

我正在尝试在 tkinter 文本小部件中获取输入文本并将其逐行传输到另一个文本小部件对象。

我尝试将文字传递给 text.get(start index, end index) 和 text.insert(index, stringToInsert)

from tkinter import *
import re 

class TextCompiler:

    def __init__(self, master):

        self.a = 1.0

        self.frame = Frame(master)
        self.frame.pack()

        self.topLabel = Label(master, text = "Enter text to be compiled: ", bg = "green", fg = "black")
        self.topLabel.pack(side = TOP)

        self.windowIn = Text(master, state=NORMAL, height=20, width=30)
        self.windowIn.pack(side = LEFT)
        self.windowOut = Text(master, height=20, width=30)
        self.windowOut.pack(side = RIGHT)

        self.printButton = Button(self.frame, text="Compile next line?", command = lambda: self.transferPrint(self.a))
        self.printButton.pack(side = BOTTOM)

        self.quitButton = Button(self.frame, text="Quit", command=lambda: self.quitStuff(master))
        self.quitButton.pack(side = BOTTOM)

    def transferPrint(self, a):
            b = self.a + 0.30
            endOfLine = "{0:.2f}".format(b)
            inputText = self.windowIn.get(self.a, endOfLine)
            self.windowOut.insert(self.a, inputText)
            self.a = self.a + 1.0

    def quitStuff(self, master):
        self.frame.quit()
        master.destroy()

root = Tk()
TextCompiler(root)
root.mainloop()

我需要它来复制一整行并在单击“编译下一行?”时一次将其传输到第二个文本窗口?按钮。到目前为止,我让它捕获了一行代码,然后没有正确粘贴它。它将粘贴到前一个字符串的末尾。然后,当我输入一整行文本和第二行文本时,它粘贴不完整。所以我们应该 get(1.0, 1.30) 和 insert(1.0, string) 然后 get(2.0, 2.30) insert(2.0, string) get(3.0, 3.30) insert(3.0, string) 等等..但是它忽略了文字更改参数,如前所述,未正确粘贴整行文本...

标签: pythontkintertextparameterswidget

解决方案


有两个问题。首先是索引不是浮点数,您不应该对它们进行浮点数学运算。索引是格式line的字符串。字符

例如,在浮点数中,1.3 和 1.30 是相同的。作为索引,“1.3”代表第一行的第三个字符,“1.30”代表第一行的第三十个字符。

此外,您忽略了在每行末尾复制换行符。除非第 1 行以换行符结束,否则不能在另一个窗口的第 2 行插入,如果第 2 行没有以换行符结束,则不能在第 3 行插入,依此类推。

我不知道您的意图是什么,因此很难推荐解决方案。例如,您真的只想复制一行的前 30 个字符,还是您的目标是复制整行?

如果您只需要一行的前 30 个字符并将其复制到另一个窗口中的新行,则需要在复制时插入换行符。例如:

self.windowOut.insert("end", inputText+"\n")

如果您的目标只是复制整行,则可以使用修饰符复制整行加上尾随换行符。或者,只复制不带换行符的整行,就像上面一样,您可以在复制时附加换行符。

以下是获取完整行的方法:

end = "{} lineend".format(self.a)

以下是获取整行加上尾随换行符的方法:

end = "{} lineend+1c".format(self.a)

推荐阅读