Python 如何解决程序执行大循环时不断按下的tkinter按钮?

Python 如何解决程序执行大循环时不断按下的tkinter按钮?,python,tkinter,Python,Tkinter,实际上,我想创建一个GUI来通过串口接收数据,但我遇到的一个问题是,按钮会一直按下,直到整个数据整理完成 为了让人们理解我遇到的情况,我修改了下面的代码 from Tkinter import * class GUIDemo(Frame): def __init__(self, master=None): Frame.__init__(self, master) self.grid() self.createWidgets()

实际上,我想创建一个GUI来通过串口接收数据,但我遇到的一个问题是,按钮会一直按下,直到整个数据整理完成

为了让人们理解我遇到的情况,我修改了下面的代码

from Tkinter import *

class GUIDemo(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.grid()
        self.createWidgets()
        # self.datarcv()

    def createWidgets(self):
        self.inputText = Label(self)
        self.inputText["text"] = "Input:"
        self.inputText.grid(row=0, column=0)

        self.inputField = Entry(self)
        self.inputField["width"] = 50
        self.inputField.grid(row=0, column=1, columnspan=6)

        self.regist = Button(self, command=self.datasave)
        self.regist["text"] = "button"
        self.regist.grid(row=2, column=0)

    def datasave(self):
        a=0
        while a<100000000:
            a+=1
            print a



if __name__ == '__main__':
    root = Tk()
    app = GUIDemo(master=root)
    app.mainloop()

您需要添加一个线程

from Tkinter import *
import threading

class GUIDemo(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.grid()
        self.createWidgets()
        # self.datarcv()

    def createWidgets(self):
        self.inputText = Label(self)
        self.inputText["text"] = "Input:"
        self.inputText.grid(row=0, column=0)

        self.inputField = Entry(self)
        self.inputField["width"] = 50
        self.inputField.grid(row=0, column=1, columnspan=6)

        self.regist = Button(self, command=self.datasave_thread)
        self.regist["text"] = "button"
        self.regist.grid(row=2, column=0)

    def datasave_thread(self):
        self.thread = threading.Thread(None, self.datasave, None, (), {})
        self.thread.start()

    def datasave(self):
        a=0
        while a<100000000:
            a+=1
            print a



if __name__ == '__main__':
    root = Tk()
    app = GUIDemo(master=root)
    app.mainloop()

而且,线程带来了线程同步和协调的所有乐趣。确保保护您的数据结构,以防有人在数据保存完成之前再次按下按钮!哇!对我来说,线程是一个新事物,非常感谢你,我学到了一个新东西注:你不一定需要线程。这真的取决于所做的工作。如果你能把它分成小块,你就可以用主线程,用after命令一次只做一块。谢谢你的建议!!