Я использую python для своего небольшого проекта и для развлечения Я сделал свою программу одним файлом, и сейчас он довольно большой и беспорядочный. поэтому я решил попробовать разделить несколько файлов и импортировать их. Это нормально, но проблема в том, что я понятия не имею, как использовать функцию text.insert.
gui_test.py
from tkinter import *
import threading
from test import test_fun
def t_test():
t0 = threading.Thread(target=test_fun)
t0.start()
if __name__ == "__main__":
root = Tk()
root.title(f"test_gui")
root.geometry("355x280")
txt = Text(root, width=50, height=10, wrap=WORD) # log
txt.place(x=0, y=20)
txt.config(state=NORMAL)
btn1 = Button(root, text = "test_button", command=t_test)
btn1.place(x=5, y=160)
root.mainloop()
test.py
import time
def test_fun():
sec = 0
while True:
txt.insert(END, f"{sec}\n")
sec += 1
time.sleep(1)
Как я могу отправить текст и показать его на gui_test.py?
Ищем самый простой способ
Решено
gui_test.py
from tkinter import *
import threading
from test import test_fun
def t_test():
t0 = threading.Thread(target=test_fun, args=(root,), daemon=False)
t0.start()
if __name__ == "__main__":
root = Tk()
root.title(f"test_gui")
root.geometry("355x280")
root.txt = Text(root, width=50, height=10, wrap=WORD) # log
root.txt.place(x=0, y=20)
root.txt.config(state=NORMAL)
btn1 = Button(root, text = "test_button", command=t_test)
btn1.place(x=5, y=160)
root.mainloop()
test.py
import time
from tkinter import *
def test_fun(widget):
sec = 0
while True:
widget.txt.insert(END, f"{sec}\n")
widget.txt.update()
widget.txt.see(END)
sec += 1
time.sleep(1)
В test.py вы не можете сделать это txt.insert(END, f"{sec}\n"). Виджетов нет. Но вы можете сделать это print(f"{sec}\n")
Вы можете передать txt
в качестве аргумента test_fun()
.
Вам нужно передать объект Tk() в функцию, если вы хотите, чтобы функция могла что-либо изменить в нем:
def test_fun(widget):
sec = 0
while True:
widget.txt.insert(END, f"{sec}\n")
widget.txt.update()
sec += 1
time.sleep(1)
Затем вам нужно сделать текстовое поле частью виджета:
root.txt = Text(root, width=50, height=10, wrap=WORD) # log
root.txt.place(x=0, y=20)
root.txt.config(state=NORMAL)
Теперь вы можете вызвать функцию, написав test_fun(root)
, и она начнет заполнять окно.
(к сожалению, я не знаком с многопоточностью. Но лямбда-функция, передающая root, должна быть возможна)
Есть ли причина, по которой вы хотите запустить
test_fun
в отдельном потоке / иметь цикл while внутриtest_fun
? Если вы ищете простой способ периодически что-то обновлять, ознакомьтесь с методом tkinterafter
— потоки не требуются!