简体   繁体   中英

Tkinter Label text doesn't change every time

Python 3.6. This is a class i made for tkinter, where the text of self.compteur changes every second once i press start :

motsCount = 0
temps_total = 3600

class ChronoAspi:
    def __init__(self, master):
        self.master = master
        self.mainframe = tkinter.Frame(self.master, background ='#28aae1')
        self.mainframe.pack(fill = tkinter.BOTH, expand= True)
        self.timer_text = tkinter.StringVar()
        self.timer_text.trace('w', self.build_timer)
        self.time_left = tkinter.IntVar()
        self.time_left.set(temps_total)
        self.running = True
        self.buildGrid()
        self.build_buttons()
        self.build_timer()
        self.build_compteur()
        self.update()

    def buildGrid(self):
        self.mainframe.columnconfigure(0, weight=1)
        self.mainframe.rowconfigure(0, weight=1)
        self.mainframe.rowconfigure(1, weight=1)
        self.mainframe.rowconfigure(2, weight=0)

    def build_buttons(self):
        buttons_frame = tkinter.Frame(self.mainframe)
        buttons_frame.grid(row=2, column=0, sticky='nsew', padx=10, pady=10)
        buttons_frame.columnconfigure(0, weight=1)
        buttons_frame.columnconfigure(1, weight=1)
        self.start_button = tkinter.Button(buttons_frame, text='Start', command=self.start_timer )
        self.stop_button = tkinter.Button(buttons_frame, text='Stop', command=self.stop_timer)
        self.start_button.grid(row=0, column=0, sticky = 'ew')
        self.stop_button.grid(row=0, column=1, sticky = 'ew')
        self.stop_button.config(state=tkinter.DISABLED)

    def build_timer(self, *args):
        timer = tkinter.Label(self.mainframe, text=self.timer_text.get(), background = '#28aae1', fg='white', font=("Helvetica", 30))
        timer.grid(row=1, column=0)

    def build_compteur(self, *args):
        self.compteur = tkinter.Label(self.mainframe, text='Aucun mot compté.', background = '#28aae1', fg='white', font=("Helvetica", 20))
        self.compteur.grid(row=0, column=0)

    def start_timer(self):
        self.time_left.set(temps_total)
        self.running = True
        self.stop_button.config(state=tkinter.NORMAL)
        self.start_button.config(state=tkinter.DISABLED)

    def stop_timer(self):
        self.running = False
        self.stop_button.config(state=tkinter.DISABLED)
        self.start_button.config(state=tkinter.NORMAL)

    def heures_minutes_secondes(self, seconds):
        return int(seconds/3600), int(seconds%3600/60), int(seconds%60)

    def update(self):
        global motsCount
        time_left = self.time_left.get()

        if self.running and time_left:
            heure, minutes, seconds = self.heures_minutes_secondes(time_left)
            self.timer_text.set('{:0>2}:{:0>2}:{:0>2}'.format(heure ,minutes, seconds) )
            self.time_left.set(time_left-1)
            motsCount += 1
        else:
            heure, minutes, seconds = self.heures_minutes_secondes(time_left)
            self.timer_text.set( '{:0>2}:{:0>2}:{:0>2}'.format(heure ,minutes, seconds))
            self.compteur['text'] = 'Compteur stoppé.'
            self.stop_timer()

        if motsCount > 0:
            self.compteur['text'] = str(motsCount) + ' mots comptés.'

        self.master.after(1000, self.update)

if __name__ == '__main__':
    root = tkinter.Tk()
    ChronoAspi(root)
    root.mainloop()

As long as the chronometer is running, the text of self.compteur changes every second. But when i hit the self.stop_button , self.running becomes False and the else part in the update() function is executed. So the chronometer stops but the self.compteur text doesn't change and I don't know why!

抱歉,我无法发表评论,但我认为您的if语句将在self.stopTimer返回并更改文本后运行

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM