Source code for crappy.blocks.stop_button
# coding: utf-8
import logging
from typing import Optional
from .meta_block import Block
from .._global import OptionalModule
try:
import tkinter as tk
except (ModuleNotFoundError, ImportError):
tk = OptionalModule("tkinter")
[docs]
class StopButton(Block):
"""This Block allows the user to stop the current Crapy script by clicking on
a button in a GUI.
Along with the :class:`~crappy.blocks.StopBlock`, it allows to stop a test in
a clean way without resorting to CTRL+C.
.. versionadded:: 2.0.0
"""
[docs]
def __init__(self,
freq: Optional[float] = 50,
display_freq: bool = False,
debug: Optional[bool] = False) -> None:
"""Sets the arguments and initializes the parent class.
Args:
freq: The target looping frequency for the Block. If :obj:`None`, loops
as fast as possible.
display_freq: If :obj:`True`, displays the looping frequency of the
Block.
debug: If :obj:`True`, displays all the log messages including the
:obj:`~logging.DEBUG` ones. If :obj:`False`, only displays the log
messages with :obj:`~logging.INFO` level or higher. If :obj:`None`,
disables logging for this Block.
"""
self._root: Optional[tk.Tk] = None
super().__init__()
self.freq = freq
self.display_freq = display_freq
self.debug = debug
self._label = None
self._button = None
[docs]
def prepare(self) -> None:
"""Creates the graphical interface and sets its layout and callbacks."""
self.log(logging.INFO, "Creating the GUI")
self._root = tk.Tk()
self._root.title("Stop Button Block")
self._root.resizable(False, False)
self._label = tk.Label(self._root, text="Click button to stop test")
self._label.pack(padx=7, pady=7)
self._button = tk.Button(self._root,
text='STOP',
command=self._clicked)
self._button.pack(padx=25, pady=7)
self._root.update()
[docs]
def loop(self) -> None:
"""Updates the interface at each loop."""
try:
self._root.update()
self.log(logging.DEBUG, "GUI updated")
except tk.TclError:
return
[docs]
def finish(self) -> None:
"""Closes the interface window."""
try:
if self._root is not None:
self.log(logging.INFO, "Closing the GUI")
self._root.destroy()
except tk.TclError:
pass
def _clicked(self) -> None:
"""When the stop button is clicked, stops the test."""
self.log(logging.DEBUG, "Button clicked in the GUI")
self.log(logging.WARNING, "Stop button clicked, stopping the script !")
self.stop()