Используйте ToggleButton - PullRequest
       21

Используйте ToggleButton

1 голос
/ 26 сентября 2019

Я хочу поиграть с T. Когда я начинаю, я хочу иметь 2 варианта остановки или паузы.когда я останавливаюсь, я должен перезапустить свой счетчик 0. Но когда я делаю паузу, я должен перезапустить и продолжить там, где я остановился.

import time
import sys

class ToggleButtonDemo(wx.Frame):
    def __init__(self, parent):
        super().__init__(parent)
        self.panel = wx.Panel(self, -1)
        self.startbutton = wx.ToggleButton(self.panel, -1, "Start")
        self.stopbutton = wx.Button(self.panel, -1, "stop")
        self.stopbutton.Disable()

        self.startbutton.Bind(wx.EVT_TOGGLEBUTTON, self.onButton)
        self.stopbutton.Bind(wx.EVT_BUTTON, self.onStop)
        vbox = wx.BoxSizer(wx.VERTICAL)
        vbox.Add(self.startbutton)
        vbox.Add(self.stopbutton)
        #self.keepGoing = False
        self.panel.SetSizer(vbox)
        self.Show()
        self.etat = True
        self.stop_thread = False        
    def activity(self):
        while self.stop_thread == True:
            for i in range(5):
                print (i)
                time.sleep(1)
                if self.stop_thread == False:
                    #stop
                    return self.stop_thread
                if self.etat == False:
                    print("Pause")
                    break
            self.startbutton.SetLabel("start")
            self.stopbutton.SetLabel("stop")
            self.stopbutton.Disable()
            if self.etat == True:
                self.startbutton.SetValue(False)
            else:
                self.startbutton.SetValue(True)
            return self.stop_thread
    def onButton(self, event):
        self.etat = self.startbutton.GetValue()
        if self.etat == True:
            self.stop_thread = True
            import threading
            self.t = threading.Thread(target = self.activity)
            self.t.start()
            event.GetEventObject().SetLabel("Pause")
            self.stopbutton.Enable()
        if self.etat == False:
            self.etat = False
            #Pause code
            event.GetEventObject().SetLabel("Start")
            self.stopbutton.Disable()
    def onStop(self, event):
        self.stop_thread = False
        self.startbutton.SetLabel("Start")
        self.stopbutton.Disable()
        self.startbutton.SetValue(False)
app = wx.App()
prog = ToggleButtonDemo(None)
app.MainLoop()

функция остановки уже работает, мне нужно сделать паузу

1 Ответ

1 голос
/ 26 сентября 2019

У вас есть состояние, которое указывает, работает ли поток (self.stop_thread), и состояние, которое указывает, если он приостановлен.Это все, что вам нужно.Используйте цикл while в потоке и запускайте поток до тех пор, пока он не остановлен, и как счетчик (i меньше 5. Увеличьте и напечатайте счетчик в цикле, если поток не приостановлен.
Когда происходит событие onButton, поток разрешается запускать только в том случае, если он не запущен (self.stop_thread == False). Например:

class ToggleButtonDemo(wx.Frame):
    # [...]

    def activity(self):
        # run thread as long not stopped and i <  max_i 
        max_i = 5
        i = 0
        while self.stop_thread and i < max_i:
            if self.etat:
                print(i)
                i = i+1
            time.sleep(1)
        # ensure that stop state is not set (so thread can start again)
        self.stop_thread = False
        self.etat = True
        self.startbutton.SetLabel("Start")
        self.stopbutton.SetLabel("Stop")
        self.stopbutton.Disable()
        self.startbutton.SetValue(False)
        return self.stop_thread

    def onButton(self, event):
        self.etat = self.startbutton.GetValue()
        # start thread in not running
        if self.etat == True:
            if self.stop_thread == False:
                self.stop_thread = True
                self.t = threading.Thread(target = self.activity)
                self.t.start()
                event.GetEventObject().SetLabel("Pause")
            self.stopbutton.Enable()      
        # pause
        if self.etat == False:
            self.etat = False
            event.GetEventObject().SetLabel("Start")
            self.stopbutton.Disable()
...