Important
See PR #4 on new output parser under development
Mono is a terminal emulator that can be embedded in tkinter applications. See examples to see mono in action. The codebase was extracted from the Biscuit project and published as an embeddable widget library.
- Supports handling multiple instances of terminals of different shells running simultaneously.
- Comes as a standalone terminal widget & a tabbed widget as well, for handling different terminal instances.
- Custom terminals can be made; most shells available on the platform are detected by mono.
- Themes are fully customizable by the user.
import tkinter as tk
from mono import Terminals, get_available_shells, get_shell_from_name
root = tk.Tk()
root.geometry('800x300')
terminals = Terminals(root)
terminals.add_default_terminal()
terminals.pack(fill='both', expand=True)
# A menu for opening terminals
mbtn = tk.Menubutton(root, text="Open Terminal", relief=tk.RAISED)
menu = tk.Menu(mbtn)
for i in get_available_shells():
menu.add_command(label=i, command=lambda i=i: terminals.open_shell(get_shell_from_name(i)))
mbtn.config(menu=menu)
mbtn.pack()
root.mainloop()
Terminals
is a container for multiple terminals. It provides a simple interface for managing multiple terminals in a tabbed interface.
All the shells detected for the platform can be accessed with get_available_shells()
. The get_shell_from_name()
function returns a shell object from the name of the shell.
Following example demonstrates how to create a NodeJS standalone terminal with mono.
# NOTE: Due to the missing additional ANSI handling, NodeJS shell
# might not work as expected. The issue is being fixed, see pr #4
import tkinter as tk
from mono import Terminal
class NodeJS(Terminal):
name = "NodeJS"
shell = "node"
root = tk.Tk()
terminal = NodeJS(root)
terminal.start_service()
terminal.pack(fill='both', expand=True)
root.mainloop()
Following example implements a custom light theme for mono terminals
import tkinter as tk
from mono import Terminals, Theme
class Light(Theme):
bg = "#FFFFFF"
fg = "#000000"
abg = "#CCCCCC"
afg = "#000000"
border = "#DDDDDD"
# further overriding the __init__ will give more control over specific widgets:
#
# def __init__(self, master=None, **kwargs):
# super().__init__(master, **kwargs)
# self.tabs = (self.bg, 'red')
root = tk.Tk()
root.geometry("800x300")
terminals = Terminals(root, theme=Light())
terminals.pack(fill="both", expand=True)
terminals.open_python() # open a python console
terminals.open_another_terminal() # open another instance of active
root.mainloop()
pip install mono-term
Further...
- Shells can be run standalone or in a tabbed interface, see examples/standalone.
- Custom terminals can be made by subclassing the
Terminal
class, see examples/customshell. - Custom themes can be passed to the
Terminal
,Terminals
classes, see examples/customtheme. - High resolution text rendering can be enabled for windows, see examples/highres.
For more examples, see the examples directory.