Используйте функцию запуска и остановки с той же кнопкой в ​​Tkinter - PullRequest
0 голосов
/ 31 января 2019

С помощью командной кнопки я могу отключить кадр в Tkinter.Но есть ли способ, который помогает использовать эту же кнопку для запуска?

import tkinter as tk
counter = 0
def counter_label(label):
  def count():
    global counter
    counter+=1
    label.config(text=counter)
    label.after(1000, count)
  count()


root = tk.Tk()
root.title("Counting Seconds")
label = tk.Label(root, fg="green")
label.pack()
counter_label(label)
button = tk.Button(root, text='Stop', width=25, command=root.destroy)
button.pack()
root.mainloop()

Предложения будут благодарны

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Вы можете просто использовать оператор if / else, чтобы проверить, является ли текст кнопки Start или Stop, затем изменить логическую переменную, которая управляет счетчиком, и также обновить текст на кнопке.

import tkinter as tk

counter = 0
active_counter = False


def count():
    if active_counter:
        global counter
        counter += 1
        label.config(text=counter)
        label.after(1000, count)


def start_stop():
    global active_counter
    if button['text'] == 'Start':
        active_counter = True
        count()
        button.config(text="Stop")
    else:
        active_counter = False
        button.config(text="Start")


root = tk.Tk()
root.title("Counting Seconds")
label = tk.Label(root, fg="green")
label.pack()
button = tk.Button(root, text='Start', width=25, command=start_stop)
button.pack()
root.mainloop()

Вот также пример ООП:

import tkinter as tk


class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("Counting Seconds")
        self.counter = 0
        self.active_counter = False
        self.label = tk.Label(self, fg="green")
        self.label.pack()
        self.button = tk.Button(self, text='Start', width=25, command=self.start_stop)
        self.button.pack()

    def count(self):
        if self.active_counter:
            self.counter += 1
            self.label.config(text=self.counter)
            self.label.after(1000, self.count)

    def start_stop(self):
        if self.button['text'] == 'Start':
            self.active_counter = True
            self.count()
            self.button.config(text="Stop")
        else:
            self.active_counter = False
            self.button.config(text="Start")


if __name__ == "__main__":
    App().mainloop()
0 голосов
/ 31 января 2019

Этот код слишком сложен (мой ответ), я предлагаю улучшить его.Но это показывает, как можно использовать одну и ту же кнопку для запуска и остановки, а также для сохранения большей части вашего кода.

import tkinter as tk

def counter_label(label):
    a = 0
    label.config(text=str(a))
    def count():
        nonlocal a
        label.config(text=str(a))
        a += 1
        label.after(1000, count)
    return count

def start_stop(root, btn_text, counter):
    first = True
    def call():
        nonlocal first
        if first:
            counter()
            first = False
            btn_text.set('Stop')
        else:
            root.destroy()
    return call

root = tk.Tk()
root.title("Counting Seconds")
label = tk.Label(root, fg="green")
label.pack()
counter = counter_label(label)
btn_text = tk.StringVar()
button = tk.Button(root, textvariable=btn_text, width=25, command=start_stop(root, btn_text, counter))
btn_text.set('Start')
button.pack()
root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...