Python Tkinter: почему работает «1.end», а не «2.0»? - PullRequest
0 голосов
/ 28 июня 2018

У меня есть следующий код Python 3, использующий Tkinter:

from tkinter import *
import threading
import time

class Foo:
    def replace(self):
        time.sleep(1)
        self.text_field.replace("1.end", END, "\n" + "New Line 2")
    def create_gui(self):
        self.window = Tk()
        self.text_field = Text(height = 30, width = 70)
        self.text_field.pack()
        self.text_field.insert(END, "Line 1" + "\n" + "Line 2" + "\n" + "Line 3")

        self.window.mainloop()

if __name__ == "__main__":
    foo_object = Foo()
    threading.Thread(target = foo_object.replace, daemon = True).start()
    foo_object.create_gui()

В этой версии кода все работает как положено; появится окно с текстовым полем, которое показывает

Line 1
Line 2
Line 3

Через секунду становится

Line 1
New Line 2

Однако, если я изменю "1.end" в строке 8 на "2.0", код не будет работать, как предполагалось. Примерно через 2 секунды после того, как оригинальное окно появляется на моем экране, оно закрывается, не заменяя текст.

Новый код:

from tkinter import *
import threading
import time

class Foo:
    def replace(self):
        time.sleep(1)
        self.text_field.replace("2.0", END, "\n" + "New Line 2")
    def create_gui(self):
        self.window = Tk()
        self.text_field = Text(height = 30, width = 70)
        self.text_field.pack()
        self.text_field.insert(END, "Line 1" + "\n" + "Line 2" + "\n" + "Line 3")

        self.window.mainloop()

if __name__ == "__main__":
    foo_object = Foo()
    threading.Thread(target = foo_object.replace, daemon = True).start()
    foo_object.create_gui()

Я думаю, что вызов self.text_field.replace("2.0", END, "\n" + "New Line 2") просто заменит весь текст, начиная с начала второй строки, новым текстом ("\n" + "New Line 2"), но это не так. Он ведет себя совершенно иначе, чем при использовании self.text_field.replace("1.end", END, "\n" + "New Line 2"), который работает правильно.

Почему мой второй пример кода (с использованием "2.0") ведет себя таким образом?

Примечание: Эта проблема возникает только при вызове функции Foo's replace () из другого потока.

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