Я новичок в функциях tkinter и lamada в python. Я попытался использовать многопоточность с tkinter, чтобы моя кнопка «обновление» не вызывала «зависания» основного графического интерфейса. если я использую функцию lamda, чтобы прикрепить к кнопке и создать новый поток, она работает отлично. Однако, если я использую обычную функцию для присоединения к кнопке и запуска нового потока, выдается сообщение об ошибке.
Вот мой код с нормальной функцией для создания потока:
from Tkinter import *
import datetime
import datetime as dt
import threading
class Threading(threading.Thread):
def __init__(self, *args, **kwargs):
threading.Thread.__init__(self, *args, **kwargs)
self.daemon = True
self.start()
def run(self):
output = 'hello world'
App.text.insert(INSERT, output)
def create_thread(name1):
a = Threading(name=name1)
return a
class app():
def __init__(self, master):
self.master = master
self.frame = Frame(self.master)
self.text = Text(
master, wrap=WORD, height=20, width = 64, bg='#D9F9FF',
highlightbackground=background_color, state= DISABLED,
)
self.text.grid(row=4, column=0, columnspan=4, rowspan=4, padx=5, pady=20, sticky=E+W+S+N)
self.update = Button(master, text="Update", command= create_thread('1')).grid(column=0,
columnspan=2, row=8)
def main():
global App, root
root=Tk()
App = app(root)
root.mainloop()
if __name__ == '__main__':
background_color = "#E3FFE3"
main()
После запуска этого кода ошибка
Exception in thread 1:
Traceback (most recent call last):
File "C:\Python27\lib\threading.py", line 801, in __bootstrap_inner
self.run()
File "f:/Python/Test1.py", line 15, in run
App.text.insert(INSERT, output)
NameError: global name 'App' is not defined
повысится.
, если я изменю кнопку (команду) на:
self.update = Button(master, text="Update", command= lambda: Threading(name='Update')
).grid(column=0, columnspan=2, row=8)
Это работает без каких-либо ошибок.
Я не понимаю, почему возникает эта ошибка. После прочтения некоторых документов о нормальной функции и функции lamda, я думаю, что они могут использоваться взаимозаменяемо?
Спасибо за вашу помощь