Tukaan is the new framework that aims to replace Tkinter

Overview

Tukaan

Code style: black

Tukaan is the new, pythonic and colorful (like a keel-billed toucan) framework that aims to replace Tkinter. It has everything (on my computer, not at GitHub) that you need to develop cross-platform GUIs.

WIP

Although all the basic widgets and other classes already exist in my local repo, they are not yet ready to push them to GitHub. I only push things to GitHub that work and can be tried, but they are still in progress, so you shouldn’t use it in any project.

The goal of Tukaan

The goal of Tukaan is to be an easy-to-use, powerful and pythonic alternative to Tkinter.

Tkinter is just a wrapper around Tk, that is so thin, that you can see through it, and even has holes on it. If you have ever used Tkinter, you know, it's kinda dumb. There are a lot of things not implemented in Tkinter, you can only access them with Tcl calls. Tukaan has everything you could need, and maybe even more.

In Tcl almost everything is represented as strings, and Tkinter doesn't convert them to Python objects, so you have to do that yourself. If you mess something up, it won't raise a Python exception, but Tcl a error, which you don't know what's wrong even if you know the Tcl language. Tkinter also looks awful by default. You can change this, if you use the the Ttk extensions. But why should you use extensions to make your GUI not look like it came from the 90's?

With Tukaan this is completely different. With it, the app looks native by default on Windows and on Mac OS as well. Unfortunately this isn't possible on Linux, but it uses a better theme than the Tk default.

Simple example

import tukaan

class MyApp(tukaan.App):
    def __init__(self):
        tukaan.App.__init__(self, title="My nice little Tukaan app")

        self.position = "center"

        self.button = tukaan.Button(self, text="Button")
        self.button.callback = lambda: print("ok")

        self.pack_widgets()
	
    def pack_widgets(self):
        self.button.pack()


def main():
    MyApp().run()

if __name__ == "__main__":
    main() 

Some very nice things in tukaan

Get clipboard content

print(tukaan.Clipboard.get())

# or

print(tukaan.Clipboard.content)

When was the user last active on the computer

print("User last active", tukaan.App().user_last_active, "seconds ago.")

Centering a window on the screen

For some reason it doesn't work sometimes

app = tukaan.App()
app.position = "center"

Color conversions

>> (0, 127, 255) print(color.hsv) >>> (210, 100, 100) print(color.cmyk) >>> (100, 50, 0, 0) ">
color = tukaan.Color("#007fff")
print(color.rgb)
>>> (0, 127, 255)
print(color.hsv)
>>> (210, 100, 100)
print(color.cmyk)
>>> (100, 50, 0, 0)

Screen information

screen = tukaan.Screen()
print(screen.width)
>>> 1920
print(screen.height)
>>> 1080
print(screen.dpi)
>>> 72

Credits

Many thing in Tukaan is based on:

Comments
  • packaging: migrate to a setup.cfg build

    packaging: migrate to a setup.cfg build

    TkDND is quite a big dependency which actually needs to be platform specific to reduce the size of the distribution wheels. I think you should move them to libtukaan.

    The other option is you keep them in tukaan, but then to reduce the distribution size, we need to fallback to setup.py based packaging.

    opened by demberto 23
  • change: use properties & descriptors

    change: use properties & descriptors

    Changed many / almost all getter / setter functions to either properties or descriptors. Using descriptors for a library like this will vastly reduce boilerplate.

    This is a BIG change. I might have unknowingly broken some code, since there were a lot of type errors, but I did check for references majority of the times.

    Tbh, the descriptors are placed a little randomly across modules, as I implemented them wherever required. I think there are just too many modules. The number of modules needs to be reduced and the scope of objects (variables / constants / functions / classes / modules) needs to be better indicated by a _ prefix to imply internal code.

    Apart from this, I personally have faced a lot of issues dealing with private variables for caching and public properties for exposing them. It might have been a different case for you but, imo private variables are best avoided wherever possible.

    opened by demberto 10
  • Add Mica effect, titlebar customization

    Add Mica effect, titlebar customization

    Hi!

    Could someone with Windows 11 build 22000 or above test the following two snippets for me?

    I don't have this build, and installing a new Windows build is kinda pain, so I'd be really grateful, if you someone could test them, and give feedback. Thanks!

    You can just download the 2022-02-16 branch, and run this two code to test it.

    Mica

    This code should add a Mica effect to the window, and remove it after 10 seconds.

    import tukaan
    
    app = tukaan.App(title="Test titlebar and window border customization")
    
    app.set_backdrop_effect("mica")
    
    tukaan.Timeout(10, lambda: app.set_backdrop_effect(None)).start()
    
    app.run()
    
    

    Titlebar bg, fg and window border:

    import tukaan
    
    app = tukaan.App(title="Test titlebar and window border customization")
    
    app.Titlebar.bg_color = tukaan.Color("#ffc568")
    app.Titlebar.fg_color = tukaan.Color("#6667ab")
    app.border_color = tukaan.Color("#007fff")
    
    app.run()
    

    I'm not sure, if I implemented the bg, fg and border color functions correctly, and the colors may be something completely else. Here's how they should look: asdf | color --- | --- titlebar should be this color | ffc568 titlebar text should be this color | 6667ab window border should be this color | 007fff

    help wanted 
    opened by rdbende 10
  • Add audio playback/record/manipulation features

    Add audio playback/record/manipulation features

    Audio in Tukaan

    Tukaan uses the awesome Snack Tk extension internally to play, record and manipulate audio. Unfortunately the Snack project is inactive since 2005, so I had to modify it a bit because it used deprecated, and removed ALSA functions. I also removed MP3/MPEG support, because it would require GPL license, and currently OGG/Vorbis and NIST/Sphere codecs aren't included.

    The Snack backend is implemented as a Git submodule, the repo can be found at github.com/tukaan/Snack

    Supported filetypes: Read: aiff, au, csl, sd, smp, snd, wav, and raw binary Write: aiff, au, csl, smp, snd, wav, and raw binary

    Basics

    from tukaan import Time, Timer
    from tukaan.audio import Filter, Sound
    
    sound = Sound()  # Create an empty sound object
    
    # --- OR ---
    
    sound = Sound(Path("/home/rdbende/Music/Elefánt/Kardhal.wav"))  # Load sound from file
    
    sound.play(Time[3:40])  # Play sound, starting at 3:40
    
    sound.convert("mono", sample_rate=16000)  # Convert sound to mono, 16kHz sample rate
    sound.save("./music.au")  # Save sound in a different format
    
    with Sound() as s:  # Deletes sound when __exit__ing
        s.play(block=True)
    

    Record audio

    sound = Sound()
    
    with sound.record():  # Stops the recording when __exit__ing
        Timer.wait(10)  # Wait for 10 seconds until it is recording
    
    # --- OR ---
    
    sound.start_recording(input="plughw:1")  # Start recording (without context) on the specified input device
    

    Do things with two sounds

    sound_1 = Sound()
    sound_2 = Sound()
    
    sound_1 += sound_2  # Concatenate sound
    
    sound_1 &= sound_2  # Mix sounds
    
    sound_1.insert(Time[2:34], sound_2)  # Insert a sound at 2:34
    

    Slicing a sound

    sound = Sound()
    
    sound[Time[1:23]:Time[4:56]]
    # Returns a SoundSection object (NOT a Sound object with that sound range!)
    # So you can modify the specified section of the original sound object (apply a filter, cut, crop, play and save)
    
    
    sound[Time[1:23]:Time[4:56]].detached
    # Returns a stand-alone Sound object containing the specified range from the original sound object
    
    sound[Time[1:23]:Time[4:56]]  # From 1:23 to 4:56
    sound[88200:Time[4:56]]  # From sample #88200 to to 4:56
    sound[Time[1:23]:...]  # From 1:23 to end of sound
    sound[...:Time[4:56]]  # From start of sound to 4:56
    # I know, you got it ;)
    

    Filters

    sound = Sound()
    
    # Apply filter to the sound
    sound @= Filter.Echo()
    
    # Chaining filters
    sound @= Filter.FadeIn() & Filter.Echo()  # Returns a ComposeFilter
    
    # Apply filter only to the playback
    with Filter.Reverb():
        sound.play()
    

    Available filters: Amplifier, Echo, FadeIn, FadeOut, Formant, Generator, IIR, MixChannels and Reverb

    Time

    Time[17:42:38]  # hours:minutes:seconds
    

    I created a time object too, to easily specify positions in the Sound. I could use datetime.time, but I don't like how it works.

    datetime.time.fromisoformat("01:23:45")
    

    You need separate method to be able to write a time as 1:23:45, and you need to use a string, so I just don't like it. I wanted to be able to write a time as Time(1:23:45). Of course, this is invalid syntax, but you can write Time[1:23:45] which will be interpreted as a slice. Unfortunately I can't make a Date object like this, because Date(2022/3/12) will be interpreted as a division anyways, so 🌻

    # These 3 are all the same
    
    time = tukaan.Time[1:23:45]
    
    time = tukaan.Time(1, 23, 45)
    
    time = tukaan.Time(hours=1, minutes=23, seconds=45)
    
    opened by rdbende 4
  • The first example in the readme fails with

    The first example in the readme fails with "TypeError: grid() got an unexpected keyword argument 'column'"

    The problem is in the following line:

    self.button.layout.grid(row=0, column=0, margin=(1, 2, 3, 4))
    

    There is no column parameter in the Grid.grid method, there is col instead.

    But I wonder, isn't it better to use full names like "column" or "columnspan"?

    opened by insolor 4
  • tukaan.exceptions.TclError: Serif: Unsupported platform windows-x64

    tukaan.exceptions.TclError: Serif: Unsupported platform windows-x64

    I cant run any Tukaan code on windows? Help

    import tukaan
    
    # Create window
    app = tukaan.App("Test TabView widget")
    
    # Create tabview
    tabview = tukaan.TabView(app)
    tabview.grid()
    
    # Create tabs
    tab_1 = tabview.Tab("Tab 1")
    tab_2 = tabview.Tab("Tab 2")
    
    # Add tab contents
    tukaan.Button(tab_1, "Button in tab 1").grid()  # You can display it inline, but then you can't access the object later
    tukaan.Button(tab_2, "Button in tab 2").grid()
    
    app.run()
    
    
    opened by PyHubs 2
  • Allow wildcard imports? 🤔

    Allow wildcard imports? 🤔

    When I create an app with tkinter I normally will start the file with from tkinter import * so it gets rid of the hassle of importing labels and buttons and whatnot. We need to make that compatible and work with Tukaan. Great job on the release by the way!

    further info 
    opened by Moosems 2
  • `tukaan.App` is crazy inefficient

    `tukaan.App` is crazy inefficient

    https://github.com/tukaan/tukaan/blob/fcf7ff97fe14da80d7f0d8b71e74c28d839e24f6/tukaan/app.py#L56-L70

    $ cat test.py
    import tukaan, tkinter, timeit
    
    
    def asdf():
        _ = tukaan.App()
        _.quit()
    
    
    def qwer():
        _ = tkinter.Tk()
        _.quit()
    
    
    print(timeit.timeit(asdf, number=100))
    print(timeit.timeit(qwer, number=100))
    
    $ python3 test.py
    can't invoke "event" command: application has been destroyed
        while executing
    "event generate $w <<ThemeChanged>>"
        (procedure "ttk::ThemeChanged" line 6)
        invoked from within
    "ttk::ThemeChanged"
    [...] * 99
    10.320173018000037  # tukaan
    2.983373939999933   # tkinter
    

    without those lines, tukaan is only between 2.9 and 3.3 seconds

    Times

    • with tukaan I never got below 2.9 (commented out those lines)
    • with tkinter I never got below 2.7
    • (with teek I never got below 3.3)
    opened by rdbende 2
  • AttributeError: partially initialized module 'tukaan' has no attribute 'App' (most likely due to a circular import)

    AttributeError: partially initialized module 'tukaan' has no attribute 'App' (most likely due to a circular import)

    I just follow the example given in ReadMeto try this module at the first time.

    import tukaan
    
    app = tukaan.App("My first Tukaan app")
    
    app.run()
    

    Then I get this error.

    
    (env) D:\Desktop\coding\sandbox>d:/Desktop/coding/discordpy/env/Scripts/python.exe d:/Desktop/coding/sandbox/tukaan.py
    Traceback (most recent call last):
      File "d:\Desktop\coding\sandbox\tukaan.py", line 1, in <module>
        import tukaan
      File "d:\Desktop\coding\sandbox\tukaan.py", line 3, in <module>
        app = tukaan.App("My first Tukaan app")
    AttributeError: partially initialized module 'tukaan' has no attribute 'App' (most likely due to a circular import)
    

    I am new to this module and I have no idea about why would this happens. Sorry for my incoveniences causes.

    opened by lmjaedentai 1
  • Add Windows blur

    Add Windows blur

    New feature to blur the window background on Windows.

    This API is kinda broken in Windows itself, and Microsoft hasn't documented it anywhere.

    Some documentation

    w.enable_bg_blur(tint, tint_opacity, effect)

    arg | type | description | default -- | -- | -- | -- tint | tukaan.Color | Color used to color the background. If None, current window bg color is used. | Current window bg tint_opacity | float | How much to color the background, on a range between 0 and 1. 0 = no color (transparent), 1 = only color (opaque) | 0.2 effect | tukaan.DwmBlurEffect | Sets what effect to use 👇 | DwmBlurEffect.BLUR (blur + tint with opacity)

    DwmBlurEffect (it's an enum) attributes
    
    DwmBlurEffect.DISABLED           -> no effect
    DwmBlurEffect.OPAQUE_COLOR       -> tint only
    DwmBlurEffect.TRANSPARENT_COLOR  -> tint with opacity
    DwmBlurEffect.BLUR               -> blur + tint with opacity
    DwmBlurEffect.ACRYLIC            -> acrylic blur + tint with opacity
    

    w.disable_bg_blur()

    Remove blur effect.

    Example

    import tukaan
    
    with tukaan.App(title="Nice little blur") as app:
        app.enable_bg_blur(tint=tukaan.Color("#6667ab"), tint_opacity=0.4)
        tukaan.Timeout(3, app.disable_bg_blur).start()
    

    Small hack (not really a hack by now)

    How to make acrylic effect?

    For acrylic effect you can use the effect argument, and set it to tukaan.DwmBlurEffect.ACRYLIC. This acrylic effect is available since Windows 10 1803, but it's incredibly laggy on all Windows 10 systems. Works well on Windows 11 though.

    opened by rdbende 1
  • Font management

    Font management

    I have no better idea than what teek does.

    Usually you don't need a named, mutable font object, just an object to specify the widget font, so a tcl namedfont is a total waste of memory. On the other hand it isn't good to have multiple font classes to different tasks.

    opened by rdbende 1
  • Add `Canvas` and `OpenGLCanvas` widgets

    Add `Canvas` and `OpenGLCanvas` widgets

    TODO:

    • Features of the traditional canvas widget: https://www.tcl.tk/man/tcl8.6/TkCmd/canvas.html

    • Features of the TkPath canvas widget https://github.com/avarga/tkpath/blob/master/doc/readme.adoc

    • OpenGL rendering

      • [ ] OpenGlCanvas class
      • [ ] moderngl or pyopengl? Moderngl is faster and more pythonic, but then we have to implement every platform specific stuff manually (context creation, makecurrent and swapbuffer)
    • Implement new dynamic theming engine using tkp::surface

    TODO in TkPath:

    • [ ] Add to libtukaan. Currently I have only a local .so
    • [ ] Some commands cause segfaults randomly. I've put some TODO comments to them
    • [ ] Finish partially or not implemented features

    Done (at least partially):

    These things need to be tested and possibly bugfixed

    • Canvas items
      • [x] Line (connects two points)
      • [x] Vector (has a length and a angle) See comment about these two in items.py
      • [x] Polygonal line
      • [x] Rectangle
      • [x] Square (rectangle subclass)
      • [x] Ellipse
      • [x] Circle (ellipse subclass)
      • [x] Polygon
      • [x] Text
      • [x] Image
      • [x] Path
      • [x] Item group
    • Utility classes
      • [x] Arrowheads
      • [x] Stroke patterns
      • [x] Transformations
      • [x] Pen (to draw object stroke)
      • [x] Brush (to draw object fill)
    • [x] TkPath works on Linux
    opened by rdbende 3
  • `LabeledView` widget

    `LabeledView` widget

    a.k.a labelframe. It could be really similar to the Frame (probably they should even be in the same file), but with a title attribute (a TextProp from _props.py. It should also inherit Frame.

    enhancement good first issue widget 
    opened by rdbende 0
  • `ButtonGroup` widget

    `ButtonGroup` widget

    A group of buttons, similar to RadioGroup. The button labels and callbacks could be specified in a dict, like items={"Text": do_something}.

    The leftmost button should have the Left.TButton style, the rightmost Right.TButton, and all the others Middle.TButton (similar stuff when the orientation is vertical), this way it's possible to do, that only the outer buttons have round corners. (I think my forest theme has this feature, but it might be only in one of my local branches).

    enhancement good first issue widget 
    opened by rdbende 0
  • High DPI support

    High DPI support

    • [ ] High DPI awareness High DPI awareness should be enabled on Windows by default
    • [ ] Scaling
      • [ ] Implement UI scaling
      • [ ] Support SVG based themes
      • [ ] Create SVG based sun valley theme
    good first issue 
    opened by rdbende 2
  • Accessibility

    Accessibility

    • [ ] Screen reader support I'm not sure... https://sourceforge.net/p/tcl/mailman/tcl-core/thread/8c01c04a-7c44-89a6-e2b4-90e919e37f63%40codebykevin.com/#msg36955189
    opened by rdbende 0
Releases(v0.2.0.retrigger)
  • v0.2.0.retrigger(Dec 22, 2022)

  • v0.2.0(Dec 22, 2022)

    Lots of breaking changes.

    What's Changed

    • change: use properties & descriptors by @demberto in https://github.com/tukaan/tukaan/pull/104
    • cleanup by @rdbende in https://github.com/tukaan/tukaan/pull/105
    • Bit of refactor on window stuff by @rdbende in https://github.com/tukaan/tukaan/pull/106
    • Add theming by @rdbende in https://github.com/tukaan/tukaan/pull/108
    • Fix a lotta bugs, add some tests by @rdbende in https://github.com/tukaan/tukaan/pull/110
    • Add filedialogs by @rdbende in https://github.com/tukaan/tukaan/pull/89
    • Check non-pip dependencies in setup.py by @rdbende in https://github.com/tukaan/tukaan/pull/117

    New Contributors

    • @demberto made their first contribution in https://github.com/tukaan/tukaan/pull/104

    Full Changelog: https://github.com/tukaan/tukaan/compare/v0.1.3...v0.2.0

    Source code(tar.gz)
    Source code(zip)
  • v0.1.3(Aug 30, 2022)

    What's Changed

    • Improved tooltips
    • Built-in dependency troubleshooting stuff
    • Update font file stuff and move to libtukaan by @rdbende in https://github.com/tukaan/tukaan/pull/100

    Full Changelog: https://github.com/tukaan/tukaan/compare/v0.1.1...v0.1.2

    Source code(tar.gz)
    Source code(zip)
  • v0.1.2(Aug 30, 2022)

    What's Changed

    • Improved tooltips
    • Built-in dependency troubleshooting stuff
    • Update font file stuff and move to libtukaan by @rdbende in https://github.com/tukaan/tukaan/pull/100

    Full Changelog: https://github.com/tukaan/tukaan/compare/v0.1.1...v0.1.2

    Source code(tar.gz)
    Source code(zip)
  • v0.1.1(Jul 3, 2022)

    What's Changed

    • Add ToolTip class by @Moosems in https://github.com/tukaan/tukaan/pull/80
    • Update Serif to work on macOS in 5ce336e

    New Contributors

    • @Moosems made their first contribution in https://github.com/tukaan/tukaan/pull/80 🎉

    Full Changelog: https://github.com/tukaan/tukaan/compare/v0.1.0...v0.1.1

    Source code(tar.gz)
    Source code(zip)
  • v0.1.0(Jul 2, 2022)

    !! Not backwards-compatible !!

    What's Changed

    • Rewrite quasi everything by @rdbende in https://github.com/tukaan/tukaan/pull/82

    Full Changelog: https://github.com/tukaan/tukaan/compare/v0.0.1.dev1...v0.1.0

    * There's no multiline textbox widget at the moment, however the Entry widget was renamed to TextBox, this might be confusing 😕 The multiline text widget will return, but in a revised form, at least until it is merged into the Tcl/Tk core

    Source code(tar.gz)
    Source code(zip)
  • v0.0.1.dev1(Jun 5, 2022)

  • v0.0.1.dev0(Apr 22, 2022)

    This is the first release of Tukaan! ✨🥳 Tukaan website: https://tukaan.github.io Pypi project link: https://pypi.org/project/tukaan

    Feedback is welcome!

    Source code(tar.gz)
    Source code(zip)
Owner
Tukaan
Tukaan is the new framework that aims to replace Tkinter
Tukaan
Tkinter-ATM - Python GUI case made with Tkinter

tkinter-ATM Python GUI case made with Tkinter The task of this case was to creat

null 2 Jan 13, 2022
Weather-API-GUI-Tkinter - A weather tool made using tkinter which works by fetching query city weather using an API

Weather-API-GUI-Tkinter ☁️ ❄️ version- 1️⃣ . 0️⃣ . 0️⃣ This repo contains a weat

SasiVatsal 4 Jul 8, 2022
Tkinter calculetor - Tkinter calculetor with python

Tkinter_calculetor required to run py file pip install tkinter

Yasir Arafat 0 Feb 7, 2022
My Git GUI version made in Python and Tkinter.

Description My Git GUI version made in Python and Tkinter. How to use Basically, create a folder in your computer, open the software, select the path

Matheus Golzio 4 Oct 10, 2021
System Tray Icon for PySimpleGUI (the tkinter version). Adds a system tray icon by using pystray and PIL

psgtray Add a System Tray Icon to your tkinter port of PySimpleGUI. Installation via pip Installation is via pip: python -m pip install psgtray or if

PySimpleGUI 38 Dec 30, 2022
Basic calculator using Tkinter GUI

Basic calculator using Tkinter GUI

Rogerio Penchel 17 Jan 9, 2022
Json IDE made with Python tkinter!

JIDE Json IDE made with Python tkinter! Download: https://github.com/LouisTheXIV/JIDE/releases/tag/v0.1 Features In JIDE everything is customisable do

n0 7 May 14, 2022
A Python Tkinter based Inventory managment System

Inventory Management System Using Python Tkinter Introduction Inventory managemrnt system is an open source platform for manage business. It has a com

Amit Kumar Datta 2 Oct 14, 2021
An offline python frontend for the QuadVisions Colab Notebook using tkinter.

Visions GUI An offline python frontend for the QuadVisions Colab Notebook using tkinter. It offers basic options and interactively displays the genera

null 7 Feb 15, 2022
A simple project used Tkinter module to make a seperate window

Project Title This is a program to run a databse where you can store the general information of poeple. This is a very simple project and i have used

Divyansh Bhardwaj 0 Jun 25, 2022
Advanced Zola Cabs integrated with tkinter Graphical User Interface (GUI) made for ZOHO Corp .

ZolaCabs Advanced Zola Cabs integrated with tkinter Graphical User Interface (GUI) made for ZOHO Corp. < Logs > username : zoho password : zoho [ Deve

Mastermind 9 Nov 18, 2021
Signin/Signup GUI form using tkinter in python

SignIn-SignUpFormRepo Hello there, I am Shahid and this is the Signin/Signup GUI form using tkinter in python if you want to use avatar images then pa

Shahid Akhtar 1 Nov 9, 2021
This repository contains some projects that I have done using Python + Tkinter.

This repository contains some projects that I have done using Python + Tkinter.

João Victor Vilela dos Santos 1 Nov 10, 2021
Use CSS styling in Tkinter apps

cssTk To-Do Support Upto CSS 4.15 Set Up Docs Features * Corner Radius Gradient BG Blur Animations Usage Scenarios Allows easy import of GTK 3 and GTK

RUG 5 Oct 18, 2022
Bill Cipher is a Python3 Tkinter Application that creates Python remote backdoors, while giving you the option to convert it to an exe.

Bill Cipher is a Python3 Tkinter Application that creates Python remote backdoors, while giving you the option to convert it to an exe. The program also configures a .py server file that works with the backdoor

Damian Mostert 2 Apr 12, 2022
A GUI calculator made with tkinter module in python

GUI-Calculator A GUI calculator made with tkinter module in python How to setup the calculator If pygame is not installed, go to terminal and do pip i

Eric Jing 0 Aug 25, 2021
A simple GUI designer for the python tkinter module

Leer en Español Welcome to Pygubu! Pygubu is a RAD tool to enable quick and easy development of user interfaces for the Python's tkinter module. The u

Alejandro Autalán 1.7k Dec 27, 2022
Use any of the 1k+ free FontAwesome icons in your tkinter application.

TkFontAwesome A library that enables you to use FontAwesome icons in your tkinter application. You may use any of the 1k+ free FontAwesome 5.0 icons.

Israel Dryer 33 Dec 20, 2022