Как сделать указатели на переменную функции tkinter.text.get ()? - PullRequest
0 голосов
/ 21 сентября 2019

Я не могу заставить свои индексы работать как переменную в текстовых виджетах tkinter get.

Многие вещи указывают на одну проблему.Я хочу скопировать и вставить код без новой строки в конце строки, которая копируется и вставляется.И я хочу, чтобы он работал в цикле, который будет увеличивать копируемую строку каждый раз.Я не могу заставить его просто захватить 30 символов в строке 1, а затем в следующий раз функция "TransferPrint (self, a)" называется захватить 30 символов в строке 2. Кроме того, я не могу получить его для вставки в строке 1при переходе из строки 1 и строки 2 при переходе из строки 2 и строки 3 при переходе из строки 3 и т. д. *

Это в основном текстовое поле, которое копируется в другое текстовое поле, одна строка ввремя.Или действительно, 30 символов за один раз, напечатанный там или нет (длина одной строки виджета)

from tkinter import *
import re 

class TextCompiler:

    def __init__(self, master):

        self.a = 1.0
        self.countString = StringVar()
        self.countString.set("Current Processing Line: " + str(self.a))

        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, 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)

        self.count = Label(master, textvariable = self.countString)
        self.count.pack(side = BOTTOM)

    def transferPrint(self, a):
        b = self.a + 0.30
        #c=self.a+1.0
        endOfLine = "{0:.2f}".format(b)
        # = "{} lineend".format(self.a)
        #endOfLine = endOfLine + "\n"
        inputText = self.windowIn.get(self.a, endOfLine)
        self.windowOut.insert(self.a, inputText)
        self.a = self.a + 1.0
        self.countString.set("Current Processing Line: " + str(self.a))


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

root = Tk()
TextCompiler(root)
root.mainloop() this is part of the program, wont go in the box

Я думаю, что я уже сказал, что хочу.То, что я получаю, это три вещи.1-Вставка просто вставляет в конец текущей строки, которая присутствует в виджете выходного текста.заставляет меня думать, что он ищет «END» или «конец», я не знаю, какой именно, но я также думаю, что это проблема, вызванная перегруженными индексными типами, которые принимает эта функция.2 - Я получаю только те символы, которые идут перед новой строкой в ​​результате вызова функции text.get () так, как я ее напечатал.3-Текстовый виджет будет перепрыгивать строки текста, в которых нет новых строк в поисках новой строки.Это сбрасывает индекс количества строк.

1 Ответ

0 голосов
/ 22 сентября 2019

Вставка просто вставляет в конец текущей строки, присутствующей в виджете выходного текста.

Да, если указанный вами индекс находится за пределами конца, он будет вставленпосле последнего персонажа.Например, если у вас есть одна строка текста длиной десять символов, вставка в "3.0" добавит ее в первую строку.Если вы хотите создать новую строку, вы должны вставить символ новой строки.

Примечание: END - это имя константы, предоставленной tkinter.Это установлено в строку "end".Вы можете использовать либо строку, либо константу.

2 - я получаю только те символы, которые идут перед новой строкой в ​​результате вызова функции text.get (), как у меняэто напечатано.

Это слишком расплывчато для решения.Функция get всегда будет возвращать символы между двумя указанными ей индексами.Если вы не получаете ожидаемых символов, возможно, вы даете плохие индексы.

Как я уже говорил в других ответах и ​​комментариях на ваши вопросы, индексы не являются числами с плавающей запятой .Скорее, индексы представляют собой строки в форме строки . символа .Таким образом, вам нужно использовать форматирование строки.Вы должны никогда использовать математику с плавающей точкой при вычислении индексов текстовых виджетов.

Например, предположим, у вас есть номер строки в n, и вы хотите вычислить индекс 30-го символа от начала номера строки n.Вы можете вычислить индекс следующим образом:

n = 1
index = "{}.0 +30c".format(n)  
# => "1.0+30c"

Первая половина этого числа преобразует целое число 1 в строку 1.0, а затем добавляет +30c.Если у вас есть количество символов в целых числах y, вы можете сделать следующее:

y = 30
n = 1
index = "{}.0+{}c".format(n,y)
# => "1.0+30c"

Примечание. Это будет работать только в том случае, если x и y являются целыми числами,В вашем коде вы инициализируете self.a числом с плавающей запятой.Номер строки или номер символа - это целое число , а индекс, использующий эти числа, должен быть строка .

. Для получения дополнительной информации о методе formatсм. str.format () в официальной документации Python.

3 - Текстовый виджет будет перепрыгивать строки текста, в которых нет символов новой строки при поиске новой строки.

Опять же, текстовый виджет получит все, что вы скажете.Он будет «перепрыгивать через строки», только если вы дадите ему два индекса, которые охватывают строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...