Python, использующий функцию Lamda для подключения к кнопке Tkinter - PullRequest
0 голосов
/ 15 октября 2019

Я новичок в функциях 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, я думаю, что они могут использоваться взаимозаменяемо?

Спасибо за вашу помощь

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