У меня есть следующий код 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 () из другого потока.