A collection of modern themes for Tkinter TTK

Overview

ttkbootstrap

A collection of modern flat themes inspired by Bootstrap. Also includes TTK Creator which allows you to easily create and use your own themes.

How to install

pip install ttkbootstrap

If you are on Linux, you may need to install a font with emojii support, or the program will crash.

sudo apt-get install fonts-symbola

Documentation

Read for more information about how to use along with full-size screenshots, and other useful information. https://ttkbootstrap.readthedocs.io/en/latest/

Sample of themes

Play with a live demo after installing the package

python -m ttkbootstrap

TTK Creator

Create your own themes with the built-in TTK Creator. Read the docs for instructions on how to create your own themes.

python -m ttkcreator

Comments
  • Add a radial gauge to the widgets module

    Add a radial gauge to the widgets module

    I'd like to include a widgets module with ttkbootstrap that includes custom widgets that are useful in modern UI's.

    This radial gauge is a potential candidate (example is in vanilla ttk). I can create it with theme colors, and I've set it up to be adjustable in the constructor. Though, I'd probably want the customization to the style class instead of using the constructor to be consistent with the ttk api, at least as much as possible.

    image

    import tkinter as tk
    from tkinter import ttk
    
    from PIL import Image, ImageTk, ImageDraw
    
    
    class Gauge(ttk.Label):
    
        def __init__(self, parent, **kwargs):
            self.arc = None
            self.im = Image.new('RGBA', (1000, 1000))
            self.min_value = kwargs.get('minvalue') or 0
            self.max_value = kwargs.get('maxvalue') or 100
            self.size = kwargs.get('size') or 200
            self.font = kwargs.get('font') or 'helvetica 12 bold'
            self.background = kwargs.get('background')
            self.foreground = kwargs.get('foreground') or '#777'
            self.troughcolor = kwargs.get('troughcolor') or '#e0e0e0'
            self.indicatorcolor = kwargs.get('indicatorcolor') or '#01bdae'
            self.arcvariable = tk.IntVar(value='text')
            self.arcvariable.trace_add('write', self.update_arcvariable)
            self.textvariable = tk.StringVar()
            self.setup()
    
            super().__init__(parent, image=self.arc, compound='center', style='Gauge.TLabel',
                             textvariable=self.textvariable, **kwargs)
    
        def setup(self):
            """Setup routine"""
            style = ttk.Style()
            style.configure('Gauge.TLabel', font=self.font, foreground=self.foreground)
            if self.background:
                style.configure('Gauge.TLabel', background=self.background)
            draw = ImageDraw.Draw(self.im)
            draw.arc((0, 0, 990, 990), 0, 360, self.troughcolor, 100)
            self.arc = ImageTk.PhotoImage(self.im.resize((self.size, self.size), Image.LANCZOS))
    
        def update_arcvariable(self, *args):
            """Redraw the arc image based on variable settings"""
            angle = int(float(self.arcvariable.get())) + 90
            self.im = Image.new('RGBA', (1000, 1000))
            draw = ImageDraw.Draw(self.im)
            draw.arc((0, 0, 990, 990), 0, 360, self.troughcolor, 100)
            draw.arc((0, 0, 990, 990), 90, angle, self.indicatorcolor, 100)
            self.arc = ImageTk.PhotoImage(self.im.resize((self.size, self.size), Image.LANCZOS))
            self.configure(image=self.arc)
    
    
    if __name__ == '__main__':
        root = tk.Tk()
        style = ttk.Style()
        gauge = Gauge(root, padding=20)
        gauge.pack()
        ttk.Scale(root, from_=0, to=360, variable=gauge.arcvariable).pack(fill='x', padx=10, pady=10)
    
        # update the textvariable with the degrees information when the arcvariable changes
        gauge.arcvariable.trace_add('write', lambda *args, g=gauge: g.textvariable.set(f'{g.arcvariable.get()} deg'))
    
        root.mainloop()
    
    
    enhancement help wanted 
    opened by israel-dryer 23
  • _tkinter.TclError: invalid command name

    _tkinter.TclError: invalid command name "::msgcat::mcload"

    ttkbootstrap 1.6.0

    The python scripts run well. I pack it to exe with Nuitka, I got a error when running the exe.

    Traceback (most recent call last): File "D:\users\funchan\Documents\App\ShareFile\output\ShareFile\main\main.py", line 538, in File "D:\users\funchan\Documents\App\ShareFile\output\ShareFile\main\main.py", line 530, in main File "D:\users\funchan\Documents\App\ShareFile\output\ShareFile\main\main.py", line 103, in init File "D:\users\funchan\Documents\App\ShareFile\output\ShareFile\main\gui.py", line 42, in init File "D:\users\funchan\Documents\App\ShareFile\output\ShareFile\main\ttkbootstrap\window.py", line 188, in init File "D:\users\funchan\Documents\App\ShareFile\output\ShareFile\main\ttkbootstrap\style.py", line 494, in init File "D:\users\funchan\Documents\App\ShareFile\output\ShareFile\main\ttkbootstrap\localization_init_.py", line 21, in initialize_localities File "D:\users\funchan\Documents\App\ShareFile\output\ShareFile\main\ttkbootstrap\localization_init_.py", line 111, in load _tkinter.TclError: invalid command name "::msgcat::mcload"

    opened by funchan24 21
  • TableView delete_row() raise Error

    TableView delete_row() raise Error

    Desktop (please complete the following information):

    Version:1.7.4 OS:Win10

    Describe the bug

    When I use delete_row() to delete all record of table,and use insert_row,then raise error "item 1001 not found”。

    delete: dt.delete_row(iid=row_iid) dt.load_table_data()

    add: insert_row(……) # raise error

    To Reproduce

    No response

    Expected behavior

    No response

    Screenshots

    No response

    Additional context

    No response

    bug 
    opened by lymadalin 17
  • Create a themed date chooser

    Create a themed date chooser

    @daniilS, I'm working on a themed date chooser which has 3-components....

    • a DateChooser class that creates the TopLevel window.
    • an ask_date function that opens the DateChooser and returns a datetime object.
    • a DateEntry class, that works like an entry field with a date chooser button attached.

    I expect all of these to be used independently based on the needs of the situation.

    date-picker

    A few more things I still need to work out...

    • When using the DateEntry, the date chooser should use the date in the entry field as the default, so that if the button is invoked again, the calendar in the popup reflects the new date, not the current date as it does now.
    • I need to implement the themes for the various components so that they are changeable. Currently they are fixed to the primary theme color, and not inside of the class. Possibly I can subclass the ttk style and have something unique to the calendar widget, but I'll think about it.

    Below is the proto-type code for this widget. It's not clean by any stretch, but it works.

    import calendar
    from datetime import datetime
    from tkinter import IntVar, Toplevel, StringVar
    from tkinter import ttk
    from tkinter.ttk import Frame, Entry
    from ttkbootstrap import Style
    
    
    def ask_date(parent):
        outvar = StringVar()
        dp = DateChooserPopup(parent, outvar)
        if outvar.get():
            return datetime.strptime(outvar.get(), '%Y-%m-%d')
    
    
    class DateEntry(Frame):
    
        def __init__(self, parent=None, dateformat='%Y-%m-%d', **kw):
            super().__init__(master=parent, **kw)
            self.parent = parent
            self.dateformat = dateformat
            self.entry = Entry(self)
            self.entry.pack(side='left', fill='x', expand='yes')
            self.button = ttk.Button(self, text='📅', command=self.on_date_select)
            self.button.pack(side='left')
    
            # insert default value
            self.entry.insert('end', datetime.today().strftime(dateformat))
    
        def on_date_select(self):
            date = ask_date(self.entry)
            self.entry.delete('0', 'end')
            self.entry.insert('end', date.strftime(self.dateformat))
    
    
    class DateChooserPopup(Toplevel):
    
        def __init__(self, parent, variable=None, **kw):
            super().__init__()
            self.withdraw()
            self.transient(parent)
            self.parent = parent
            self.update_idletasks()  # actualize geometry
            x = parent.winfo_rootx() + parent.winfo_width()
            y = parent.winfo_rooty() + parent.winfo_height()
            self.overrideredirect(True)
            self.resizable(False, False)
    
            self.today = datetime.today()
            self.date = datetime.today()
            self.calendar = calendar.Calendar()
            self.cframe = ttk.Frame(self, padding=10, borderwidth=1, relief='raised')
            self.tframe = ttk.Frame(self.cframe)
            self.dframe = None
            self.titlevar = StringVar(value=f'{self.date.strftime("%B %Y")}')
            self.datevar = IntVar()
            self.variable = variable or StringVar()
            self.setup()
            self.geometry(f'+{x}+{y}')
            self.wait_window()
    
        def next_month(self):
            year, month = calendar._nextmonth(self.date.year, self.date.month)
            self.date = datetime(year=year, month=month, day=1)
            self.dframe.destroy()
            self.draw_calendar()
    
        def prev_month(self):
            year, month = calendar._prevmonth(self.date.year, self.date.month)
            self.date = datetime(year=year, month=month, day=1)
            self.dframe.destroy()
            self.draw_calendar()
    
        def setup(self):
            """Setup the calendar widget"""
            parent = self.parent
            self.cframe.pack(fill='both')
            self.tframe.pack(fill='x')
    
            self.calendar.setfirstweekday(calendar.SUNDAY)
    
            self.draw_titlebar()
            self.draw_calendar()
    
            self.deiconify()
            self.focus_set()
    
        def date_select(self, index):
            row, col = index
            date = self.monthdates[row][col].strftime('%Y-%m-%d')
            self.variable.set(date)
            self.after(10, self.destroy)
    
        def draw_titlebar(self):
            """Create the title bar"""
            # previous month button
            self.btn_prev = ttk.Button(self.tframe, text='«', style='primary.Link.TButton', command=self.prev_month)
            self.btn_prev.pack(side='left')
            # month and year title
            self.title_label = ttk.Label(self.tframe, textvariable=self.titlevar, anchor='center')
            self.title_label.pack(side='left', fill='x', expand='yes')
            # next month button
            self.btn_next = ttk.Button(self.tframe, text='»', style='primary.Link.TButton', command=self.next_month)
            self.btn_next.pack(side='left')
    
        def draw_calendar(self):
            self.titlevar.set(f'{self.date.strftime("%B %Y")}')
            self.monthdays = self.calendar.monthdayscalendar(self.date.year, self.date.month)
            self.monthdates = self.calendar.monthdatescalendar(self.date.year, self.date.month)
    
            self.dframe = ttk.Frame(self.cframe)
            self.dframe.pack(fill='both', expand='yes')
    
            # days of the week header
            for i, wd in enumerate(['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']):
                wd_lbl = ttk.Label(self.dframe, text=wd, anchor='center', padding=(0, 5, 0, 10), width=4)
                wd_lbl.grid(row=0, column=i, sticky='nswe')
    
            # calendar days
            for row, wk in enumerate(self.monthdays):
                self.dframe.rowconfigure(row, weight=1)
                for col, day in enumerate(wk):
                    self.dframe.columnconfigure(col, weight=1)
                    if day == 0:
                        ttk.Label(self.dframe, text=self.monthdates[row][col].day, anchor='center',
                                  style='secondary.TLabel',
                                  padding=(0, 0, 0, 10)).grid(row=row + 1, column=col, sticky='nswe')
                    else:
                        if all([
                            day == self.today.day,
                            self.date.month == self.today.month,
                            self.date.year == self.today.year]):
    
                            day_style = 'success.Toolbutton'
                        else:
                            day_style = 'calendar.primary.Outline.Toolbutton'
    
                        rb = ttk.Radiobutton(self.dframe, variable=self.datevar, value=day, text=day, style=day_style,
                                             padding=(0, 0, 0, 10), command=lambda x=row, y=col: self.date_select([x, y]))
                        rb.grid(row=row + 1, column=col, sticky='nswe')
    
        def define_style(self):
            pass
    
    
    if __name__ == '__main__':
        # TODO setup the styling in the __init__ file, and setup the class so that it can be easilily modified.
        # TODO add documentation to all classes and methods.
        # TODO make sure the date chooser defaults to the entry field value instead of the current date.
    
        style = Style()
        style.configure('calendar.primary.Outline.Toolbutton', lightcolor='#fff', darkcolor='#fff', bordercolor='#fff')
        style.map('calendar.primary.Outline.Toolbutton',
                  darkcolor=[
                      ('disabled', '#fff'),
                      ('pressed', '!disabled', '#273747'),
                      ('selected', '!disabled', '#273747'),
                      ('hover', '!disabled', '#2c3e50')],
                  bordercolor=[
                      ('disabled', '#fff'),
                      ('pressed', '!disabled', '#273747'),
                      ('selected', '!disabled', '#273747'),
                      ('hover', '!disabled', '#2c3e50')],
                  lightcolor=[
                      ('disabled', '#fff'),
                      ('pressed', '!disabled', '#273747'),
                      ('selected', '!disabled', '#273747'),
                      ('hover', '!disabled', '#2c3e50')])
    
        root = style.master
        picker = DateEntry(root, dateformat='%B %d, %Y', padding=20)
        picker.pack()
        root.mainloop()
    
    enhancement 
    opened by israel-dryer 17
  • Add a flood gauge style progressbar with label

    Add a flood gauge style progressbar with label

    The idea behind this widget style is that it is similar to a card you would see commonly on a dashboard that includes text. It is essentially a progressbar with text in the middle. And, it can be used exactly as a progressbar, with some adjustments to the text size and thickness.

    This style can be created by adding a custom layout based on the progressbar and the label.

    image

    I've decided to use a brightened and desaturated color for the progressbar background so that I have no need to change the text color when the gauge is filled past the 50% mark.

    The method below would be added to the StylerTTK class. The code currently reflects the primary color styles. The other colors would be the same logic, with just an iteration over the other available colors.

    def _style_floodgauge(self):
        """
        Create a style configuration for the *ttk.Progressbar* that makes it into a floodgauge. Which is essentially
        a very large progress bar with text in the middle.
    
        The options available in this widget include:
    
            - Floodgauge.trough: borderwidth, troughcolor, troughrelief
            - Floodgauge.pbar: orient, thickness, barsize, pbarrelief, borderwidth, background
            - Floodgauge.text: 'text', 'font', 'foreground', 'underline', 'width', 'anchor', 'justify', 'wraplength',
                'embossed'
        """
        self.settings.update({
            'Floodgauge.trough': {'element create': ('from', 'clam')},
            'Floodgauge.pbar': {'element create': ('from', 'default')},
            'Horizontal.TFloodgauge': {
                'layout': [('Floodgauge.trough', {'children': [
                    ('Floodgauge.pbar', {'side': 'left', 'sticky': 'ns'}),
                    ("Floodgauge.label", {"sticky": ""})],
                    'sticky': 'nswe'})],
                'configure': {
                    'thickness': 100,
                    'borderwidth': 1,
                    'bordercolor': self.theme.colors.primary,
                    'lightcolor': self.theme.colors.primary,
                    'pbarrelief': 'flat',
                    'troughcolor': Colors.update_hsv(self.theme.colors.primary, sd=-0.3, vd=0.8),
                    'background': self.theme.colors.primary,
                    'foreground': self.theme.colors.selectfg,
                    'justify': 'center',
                    'anchor': 'center',
                    'font': 'helvetica 16'}},
            'Vertical.TFloodgauge': {
                'layout': [('Floodgauge.trough', {'children': [
                    ('Floodgauge.pbar', {'side': 'bottom', 'sticky': 'we'}),
                    ("Floodgauge.label", {"sticky": ""})],
                    'sticky': 'nswe'})],
                'configure': {
                    'thickness': 100,
                    'borderwidth': 1,
                    'bordercolor': self.theme.colors.primary,
                    'lightcolor': self.theme.colors.primary,
                    'pbarrelief': 'flat',
                    'troughcolor': Colors.update_hsv(self.theme.colors.primary, sd=-0.3, vd=0.8),
                    'background': self.theme.colors.primary,
                    'foreground': self.theme.colors.selectfg,
                    'justify': 'center',
                    'anchor': 'center',
                    'font': 'helvetica 16'}
            }})
    

    Below is a prototype of the Floodgauge class. I will have to handle the label options separately because TCL doesn't understand a hybrid widget. The progressbar takes priority, so an error will occur if I try to pass through the text options to the superclass constructor. However, these options can still manipulated in the style since they actually exist in the layout. To get around this, I've created a hack that generates a unique style based on the one passed into the constructor that can be altered continuously. I believe this is similar to the approach taken by other developers (eg. PySimpleGUI) for creating custom styles on each button.

    In the case of changing the text. I've set a trace on the textvariable so that it updates the widget every time the textvariable changes.

    import tkinter as tk
    from tkinter import ttk
    from ttkbootstrap import Style
    from uuid import uuid4
    
    
    class Floodgauge(ttk.Progressbar):
    
        def __init__(self, parent, **kw):
            _style = kw.get('style') or 'TFloodgauge'
            _id = uuid4()
            _orient = kw.get('orient').title() or 'Horizontal'
            self._widgetstyle = f'{_id}.{_orient}.{_style}'
            parent.tk.call("ttk::style", "configure", self._widgetstyle, '-%s' % None, None, None)
    
            kwargs = {k: v for k, v in kw.items() if k not in ['text']}
    
            self.textvariable = kw.get('textvariable') or tk.StringVar(value=kw.get('text'))
            self.textvariable.trace_add('write', self._textvariable_write)
            self.variable = kw.get('variable') or tk.IntVar(value=kw.get('value') or 0)
    
            super().__init__(parent, class_='Floodgauge', style=self._widgetstyle, variable=self.variable, **kwargs)
    
        @property
        def text(self):
            return self.textvariable.get()
    
        @text.setter
        def text(self, value):
            self.textvariable.set(value)
    
        @property
        def value(self):
            return self.variable.get()
    
        @value.setter
        def value(self, value):
            self.variable.set(value)
    
        def _textvariable_write(self, *args):
            """
            Update the label text when there is a `write` action on the textvariable
            """
            self.tk.call("ttk::style", "configure", self._widgetstyle, '-%s' % 'text', self.textvariable.get(), None)
    
    
    if __name__ == '__main__':
        root = tk.Tk()
        root.geometry('400x400')
        s = Style()
        p = Floodgauge(root, value=55, text='55', orient='vertical')
    
    
        def auto(progress):
            p.text = f'Memory Usage\n{p.value}%'
            p.step(1)
            p.after(50, auto, p)
    
    
        p.pack(fill='both', padx=20, pady=20, expand='yes')
        auto(p)
        root.mainloop()
    
    
    enhancement help wanted 
    opened by israel-dryer 16
  • ScrolledFrame doesn’t seem to work as aspected

    ScrolledFrame doesn’t seem to work as aspected

    To test the ScrolledFrame widget i've wrote the follow code:

    from ttkbootstrap import *
    from ttkbootstrap.scrolled import ScrolledFrame
    
    
    class MainView(Window):
        def __init__(self):
            super(MainView, self).__init__()
    
            sf = ScrolledFrame(self)
            for i in range(20):
                Label(sf, text=f"Label {i}").pack()
            sf.pack(fill=BOTH, expand=True)
    
    
    if __name__ == "__main__":
        app = MainView()
        app.mainloop()
    

    and this was the output: sf_error as you can see the Scrollbar wasn't showing the right proportion.

    I used

    • ttkbootstrap 1.5.1
    • Python 3.8.3
    • Windows 10
    bug 
    opened by Funpy97 15
  • ttk.Checkbutton OSError

    ttk.Checkbutton OSError

    Run this code and you will find an OSError: cannot open resource

    import tkinter as tk
    import ttkbootstrap as ttk
    
    root = tk.Tk()
    
    c1 = ttk.Checkbutton(root, text='music')
    c1.grid ()
    
    root.mainloop()
    

    N/B : If i add bootstyle='success-round-toggle' it works What might be wrong? Why does it not work without a bootstyle configuration? I'm using manjaro linux incase it might be helpful.

    bug 
    opened by aatambo 13
  • Miscellaneous bugs in Tableview

    Miscellaneous bugs in Tableview

    I did some tests (Linux Mint x64 Cinnamon X11), some suggestions for change:

    Sorting image was cut off when doing autofit_columns. I changed pad = utility.scale_size(self, 10)

    for this and fixed the problem: pad = utility.scale_size(self, 20)


    Changed menu post method to tk_popup, several lines. Thus, the dropdown menu is displayed when hovering over the parent. And mainly the menu is closed when clicking anywhere on the screen outside of it

    example: def post(self, event):

    to: (in every 'post' to tk_popup) def tk_popup(self, event):


    I also changed the way to write csv.

    writer = csv.writer(f)

    for

    CSV_DELIMITER = ';'
    CSV_QUOTECHAR = '"'
    writer = csv.writer(f, delimiter=CSV_DELIMITER, quotechar=CSV_QUOTECHAR, quoting=csv.QUOTE_NONNUMERIC)
    

    Because depending on the country's local currency, using ',' as a delimiter can cause csv conflicts ex: In Brazil the float separator is ',' and not '.'

    bugs: https://www.mediafire.com/file/0oil09c4i9vcif6/bug_tableview.mp4/file

    modified: https://www.mediafire.com/file/50e4b5qog148l9u/modified_tableview.mp4/file


    There is also a bug with 'hide select rows'. After applying this filter and trying to clean. It does not return the hidden line. https://www.mediafire.com/file/hyhakz2oyi8lmd3/bug_hide.mp4/file

    Another problem if the user hides all the rows there is no way for him to reload the data. It would be nice to have a reload/refresh data button as suggested before

    reload

    A complement.

    The header separator could be in a different color than the header. For the program user, it is difficult to identify where this separator to double-click

    separator See the image. When the program is loaded. The separator is in an unexpected position for the user to find. If the separator were a line with a different color from the header, it would be easier to find.

    Originally posted by @antrrax in https://github.com/israel-dryer/ttkbootstrap/pull/110#issuecomment-1004079814

    bug 
    opened by israel-dryer 13
  • Add a rounded and squared togglebutton

    Add a rounded and squared togglebutton

    @daniilS, the toggle style you added gave me the ability to create a rounded toggle switch. I'm modeling it after the one here. I'd like to have rounded and squared with images generated in the application at run-time so that I don't have to package the assets with the program. This also gives the ability to generate hover effects by dimming the color slightly with the update_hsv method.

    The approach I took was to draw a rounded rectangle very large, and then shrink it to the size I need, apply anti-aliasing to get a nice smooth look. I'm not completely happy with the size or dimensions. But, it is getting close.

    Let me know what you think if you have time to play around with it; and of course if you have any feedback.

    rounded-toggle

    from PIL import Image, ImageTk, ImageDraw
    from tkinter import ttk
    
    
    on_color='#2196F3'
    off_color = '#cccccc'
    
    # off image
    off_im = Image.new('RGBA', (226, 130))
    draw = ImageDraw.Draw(off_im)
    draw.rounded_rectangle([1, 1, 225, 129], radius=(128/2), fill=off_color)
    draw.ellipse([14, 14, 114, 114], fill='white')
    
    # on image
    on_im = Image.new('RGBA', (226, 130))
    draw = ImageDraw.Draw(on_im)
    draw.rounded_rectangle([1, 1, 225, 129], radius=(128/2), fill=on_color)
    draw.ellipse([12, 12, 116, 116], fill='white')
    on_im = on_im.transpose(Image.ROTATE_180)
    
    # set up application styles
    style = ttk.Style()
    style.theme_use('clam')
    
    # set the background white
    style.configure('white.TFrame', background='white')
    window = ttk.Frame(style.master, style='white.TFrame', padding=20)
    window.pack(fill='both', expand='yes')
    
    # save reference to images
    toggle_off = ImageTk.PhotoImage(off_im.resize((32, 20), Image.LANCZOS))
    toggle_on = ImageTk.PhotoImage(on_im.resize((32, 20), Image.LANCZOS))
    
    # create a new image element
    style.element_create('rounded.Toolbutton.label', 'image', toggle_on, ('!selected', toggle_off))
    
    # set the new layout
    style.layout('rounded.Toolbutton', [
        ('Toolbutton.border', {'sticky': 'nswe', 'children': [
            ('Toolbutton.padding', {'sticky': 'nswe', 'children': [
                ('rounded.Toolbutton.label', {'sticky': 'nswe'})]})]})])
    
    # configure style settings
    style.configure('rounded.Toolbutton', relief='flat', borderwidth=0)
    style.map('rounded.Toolbutton',
              background=[
                  ('selected', 'white'),
                  ('!selected', 'white')])
    
    
    
    # demo the new widget
    ttk.Checkbutton(window, style='rounded.Toolbutton').pack()
    window.mainloop()
    
    
    
    
    
    enhancement 
    opened by israel-dryer 13
  • Major error in ttkboostrap

    Major error in ttkboostrap

    Desktop (please complete the following information):

    Hi,

    I use the following code to spawn the next UI, but iam getting error _tkinter.TclError: NULL main window

    from tkinter import *
    from ttkbootstrap import Style
    from tkinter import ttk
    import multiprocessing
    
    
    class GuiApp(object):
        def __init__(self):
            self.style = Style(theme='litera')
            self.style.configure('lefttab.TNotebook', tabposition='wn')
            self.style.configure('TNotebook.Tab', align=LEFT)
            self.root = self.style.master
            tabone = ttk.Button(self.root, text="Campaigns")
            tabone.place(x=20, y=20)
            tabtwo = ttk.Button(self.root, text="Settings")
            tabtwo.place(x=27, y=60)
            self.root.geometry("850x550")
            self.root.resizable(False, False)
    def validate():
        second.destroy()
        multiprocessing.freeze_support()
        gui = GuiApp()
        gui.root.mainloop()
    def validate_lic():
       global second
       global emailentry
       global passentry
       global keyentry
       global validate_btn
       style = Style(theme='litera')
       second = style.master
       validate_btn = ttk.Button(second, text="Sign-in", command=validate)
       validate_btn.place(x=155, y=150)
       second.geometry("350x300")
       second.resizable(False, False)
       # second.iconbitmap("Icon.ico")
       second.mainloop()
    
    
    if __name__ == '__main__':
        multiprocessing.freeze_support()
        validate_lic()
    
    

    If i tried with same code with ttkboostrap version 0.5.1 then no issue.

    Describe the bug

    Getting _tkinter.TclError: NULL main window bug when it was trying to spawn other UI

    To Reproduce

    Just run the code and click on sign in button, you can see the bug

    Expected behavior

    It has to spawn the other UI, it works fine V0.5.1, but not in the current.

    Screenshots

    https://i.imgur.com/8zaETCY.png

    Additional context

    No response

    question 
    opened by sunny9495-dev 11
  • Can't get translations to work.

    Can't get translations to work.

    Hi,

    I've got the latest ttkbootstrap from github today:

    pip3 install git+https://github.com/israel-dryer/ttkbootstrap

    then I cloned the repository:

    git clone https://github.com/israel-dryer/ttkbootstrap

    All examples work, but the translations. I tried the tests, and I could not get tableview or any dialog to be translated. I am using ubuntu linux:

    Distributor ID: Ubuntu Description: Ubuntu 20.04.3 LTS Release: 20.04 Codename: focal

    Is there any specific command I need to choose the language? How do I know if ttkbootstrap is loading the correct the translation file? In my case it should be 'pt_br'.

    EDIT: tried on python3.8.4

    Thanks for your time.

    bug 
    opened by dmalves 10
  • Not forwarding keyword arguments in InfoBox-Dialog

    Not forwarding keyword arguments in InfoBox-Dialog

    Desktop (please complete the following information):

    ttkbootstrap Version: 1.10.0 OS: Windows/Ubuntu/Mint

    Describe the bug

    You forgot to forwoard the kwargs in the Messagebox.show_info(...) function.

    To Reproduce

    root = Window()
    text = 'Vvvvvvveeeeeeeeeeerrrrrrrryyyy llloooooonnnnnngggg ttteeeeeexxxxxxttttttttttt'
    Messagebox.show_info(text, 'Some title', root, False, width=300)
    root.mainloop()
    

    Expected behavior

    A Dialog Box with width of 300

    Screenshots

    grafik

    Additional context

    No response

    bug 
    opened by aDramaQueen 0
  • ToolTip location

    ToolTip location

    Is your feature request related to a problem? Please describe.

    The ToolTip always appears on the right-top side of the cursor. When I want to add it to a widget that is on the very right side of the screen, I barely see the ToolTip.

    Describe the solution you'd like

    A parameter for ToolTip where to place it from the cursor. Similarly to tk anchors like W, N, NW, etc... OR The ToolTip should "decide" dynamically where to place the ToolTip to make it clearly readable.

    Describe alternatives you've considered

    Additional context

    No response

    enhancement 
    opened by atban98 1
  • Style id generator

    Style id generator

    Hi,

    this is a pure convenience proposal. You may think this is useless but since I am always mistyping things, I use such approaches all the time and maybe others think this as well. So here we are...

    I enumerated all possible bootstrap styles and wrote some utility classes to generate specific style identifiers.

    Simply put, instead of remembering all possible string combinations from the documentation, you may now choose from staticly well defined constants & generate your identifier of choice:

    from ttkbootstrap.style_bootstrap import BootstrapStyle, Button, Combobox, Progressbar
    
    if __name__ == '__main__':
        button_id = Button.outline_button(BootstrapStyle.INFO)
        combobox_id = Combobox.default(BootstrapStyle.DANGER)
        progressbar_id = Progressbar.striped(BootstrapStyle.SUCCESS)
    
        print(button_id)
        print(combobox_id)
        print(progressbar_id)
    

    Result:

    info-outline
    danger
    success-striped
    

    Additionally, if you work with an IDE from this century you get the static choices presented:

    grafik

    opened by aDramaQueen 1
  • Enhanced date entry

    Enhanced date entry

    Hi, I added more convenience functionality to the DateEntry Widget:

    • You can now easily enable/disable this Widget by simply calling the dedicated methods
    • You can now change the date programmatically
    • You can now provide/change a window title for the PopUp window of the calendar
    • You can now provide a callback function, that is triggered automatically if the date has changed
    • Added some type hints

    NOTE: As I understood, you are translating some of the predefined texts in this library? You may add the pre defined window title to the pool of these pre translated texts.


    TODO: You may considering adding some tests for the formater string. Right now you assume the given string represents a valid date formate. What happens if I give something like: %H:%M:%S

    This is a perfectly valid formating string, but is absolutely useless for a date picker.

    opened by aDramaQueen 0
  • small bug - label frames not working with run.py

    small bug - label frames not working with run.py

    Desktop (please complete the following information):

    os: windows 11

    Describe the bug

    When I'm using multiple python files and linking them with 'run.py' when the user opens a different py file through the GUI using 'run.py,' the inside of the label frames change to white from the theme background color. When you run the program directly from the file, the program and GUI run fine.

    To Reproduce

    No response

    Expected behavior

    When the user moves from one GUI to another using the run.py function, the GUI should look how it does when you run it directly from the python idle.

    Screenshots

    No response

    Additional context

    No response

    bug 
    opened by Ellie-is-here1 0
  • LED Indicator

    LED Indicator

    Is your feature request related to a problem? Please describe.

    I've always been unhappy that tkinter does not provide an LED indicator (something like Labview has), and I think it would be great to create one! Plus the color palette naming convention of ttkbootstrap got me thinking about LED's in the first place (success, warning, danger...). Perhaps others have worked on this before, but if not I'm happy to help make something.

    Describe the solution you'd like

    The solution would include the following features:

    • Ability to change color of indicator
    • Disabled or enabled state (ie grayed out or not)
    • Label positioning relative to LED
    • Interactive mode (somewhat of a checkbutton?)
    • Blinking parameters (frequency, duty cycle, boolean)

    Initially, I think circles will work fine, but eventually it would be nice to provide a good looking LED with some relief and shadowing (like in this pyqt5 example).

    Describe alternatives you've considered

    I've simply used labels as status indicators up to now, but it's not as nice looking

    Additional context

    I'll primarily be using this new widget in an experimental control software for my research group, but I think it could have uses elsewhere.

    enhancement 
    opened by nickschw2 1
Releases(v1.10.0)
  • v1.10.0(Nov 28, 2022)

    What's Changed

    Miscellaneous bug fixes, French language support, and load custom themes from JSON.

    Added

    • Adding french language by @raylemon in https://github.com/israel-dryer/ttkbootstrap/pull/361
    • Enable user to load custom themes from JSON by @israel-dryer in #355

    Fixed

    • Fix default enter button key binding by @israel-dryer in https://github.com/israel-dryer/ttkbootstrap/pull/311
    • Call original overridden methods after processing "bootstyle" and "style" options by @alejandroautalan in https://github.com/israel-dryer/ttkbootstrap/pull/315
    • Handle default ttk style '.' by @israel-dryer in #360
    • Fix error on button press when DateEntry is empty by @israel-dryer in #372

    New Contributors

    • @raylemon made their first contribution in https://github.com/israel-dryer/ttkbootstrap/pull/361
    • @alejandroautalan made their first contribution in https://github.com/israel-dryer/ttkbootstrap/pull/315

    Full Changelog: https://github.com/israel-dryer/ttkbootstrap/compare/v1.9.0...v1.10.0

    Source code(tar.gz)
    Source code(zip)
  • v1.9.0(Jul 10, 2022)

    What's Changed

    A few addition to existing widgets and some bug fixes.

    Added

    • Linux: Add function (Select All - shortcut "Ctrl+a") to Text widget by @antrrax in https://github.com/israel-dryer/ttkbootstrap/pull/303
    • add delay as kwarg for ToolTip by @bigoulours in https://github.com/israel-dryer/ttkbootstrap/pull/300

    Fixed

    • Short color definitions now work with Colors.hex_to_rgb #297
    • Button binding was referencing name instead of object; default key binding should now work on Linux with buttons #308

    New Contributors

    • @bigoulours made their first contribution in https://github.com/israel-dryer/ttkbootstrap/pull/300

    Full Changelog: https://github.com/israel-dryer/ttkbootstrap/compare/v1.8.0...v1.9.0

    Source code(tar.gz)
    Source code(zip)
  • v1.8.0(May 31, 2022)

    What's Changed

    A new feature for Tableview and a bug fix.

    Added

    • You can now use the get_rows method to return a list of currently selected items by using the parameter selected=True in https://github.com/israel-dryer/ttkbootstrap/pull/299

    Fixed

    • Fixed a TCL name reference for the Publisher that caused errors when deleting objects that contains internal widget styles (eg. Combobox) by @israel-dryer in https://github.com/israel-dryer/ttkbootstrap/pull/295

    Full Changelog: https://github.com/israel-dryer/ttkbootstrap/compare/v1.7.7...v1.8.0

    Source code(tar.gz)
    Source code(zip)
  • v1.7.7(May 21, 2022)

    What's Changed

    Various updates and bug-fixes

    Updated

    • You can now change the font on the Text widget; the default font style was removed which enables font changes via the constructor by @israel-dryer in https://github.com/israel-dryer/ttkbootstrap/pull/283

    • Refactor floodgauge variable param; this update allows the user to pass in a variable or textvariable object while instantiating the widget instead of using the built-in objects. I also added getters and setters for this properties and moved the existing fields to private.by @israel-dryer in https://github.com/israel-dryer/ttkbootstrap/pull/279

    Fixed

    • Tableview bug fixes on the delete_row method by @israel-dryer in https://github.com/israel-dryer/ttkbootstrap/pull/292

    Full Changelog: https://github.com/israel-dryer/ttkbootstrap/compare/v1.7.6...v1.7.7

    Source code(tar.gz)
    Source code(zip)
  • v1.7.6(Apr 24, 2022)

    What's Changed

    A major bug fix and an improvement to msgcat.

    Updated

    • You can now use "windows-style" paths or a Path-like object in the MessageCatalog.load method; the underlying tcl/tk library apparently only accepts forward-slashes; this update converts the path to an acceptable format no matter what the style, by @israel-dryer in https://github.com/israel-dryer/ttkbootstrap/pull/272

    Fixed

    • There was a major bug that prevented users from closing the window. This was due to an override on the destroy method which has since been removed and reimplemented in another way; by @israel-dryer https://github.com/israel-dryer/ttkbootstrap/pull/274

    Full Changelog: https://github.com/israel-dryer/ttkbootstrap/compare/v1.7.5...v1.7.6

    Source code(tar.gz)
    Source code(zip)
  • v1.7.5(Apr 21, 2022)

    What's Changed

    Lots of updates and bug fixes.

    Changed

    • Changed the default button binding to use return instead of space (tkinter uses 'space' out-of-the-box to activate a button) by @israel-dryer in https://github.com/israel-dryer/ttkbootstrap/pull/262
    • Add scrollbinding to all scrolled descendants; this enables scrolling on nested widget containers by @israel-dryer in https://github.com/israel-dryer/ttkbootstrap/pull/263
    • Replaced deprecated resampling method for image resizing by @israel-dryer in https://github.com/israel-dryer/ttkbootstrap/pull/264
    • Added disabled check, toggle, radio button styles so that the button selection is obvious even when disabled by @israel-dryer in https://github.com/israel-dryer/ttkbootstrap/pull/266
    • Standardized Messagebox alert parameter which was on some methods, but not others; it is now on all static Messagebox methods by @israel-dryer in https://github.com/israel-dryer/ttkbootstrap/pull/268

    Fixed

    • Initial color now sets the form values in the ColorChooserDialog by @israel-dryer in https://github.com/israel-dryer/ttkbootstrap/pull/269
    • Multiple Window instances and deleting a window and recreating will no longer crash the program; I added the master argument to the PhotoImage creation to bind the default icon to the instance by @israel-dryer in https://github.com/israel-dryer/ttkbootstrap/pull/270

    Full Changelog: https://github.com/israel-dryer/ttkbootstrap/compare/v1.7.4...v1.7.5

    Source code(tar.gz)
    Source code(zip)
  • v1.7.4(Mar 26, 2022)

    What's Changed

    Miscellaneous bug fixes

    Fixed

    • Missing font reference caused crash on lite Linux distributions when no default font was available; now fixed by @israel-dryer in https://github.com/israel-dryer/ttkbootstrap/pull/235
    • Scrolled frame was not sizing properly when added to window using the place method. The place method requires that you also give the ScrolledFrame a width and height, and this is now passed to the content window upon instantiation; fixed by @israel-dryer in https://github.com/israel-dryer/ttkbootstrap/pull/238

    Full Changelog: https://github.com/israel-dryer/ttkbootstrap/compare/v1.7.3...v1.7.4

    Source code(tar.gz)
    Source code(zip)
  • v1.7.3(Mar 8, 2022)

    What's Changed

    Miscellaneous improvements and bug fixes

    Added

    • Exposed internal text widgets in ScrolledText with properties by @israel-dryer in https://github.com/israel-dryer/ttkbootstrap/pull/216
    • Enabled round scrollbar on scrolled widgets by @israel-dryer in https://github.com/israel-dryer/ttkbootstrap/pull/215

    Fixed

    • Fixed Tableview bug in delete_rows method by @israel-dryer in https://github.com/israel-dryer/ttkbootstrap/pull/214

    Full Changelog: https://github.com/israel-dryer/ttkbootstrap/compare/v1.7.2...v1.7.3

    Source code(tar.gz)
    Source code(zip)
  • v1.7.2(Feb 20, 2022)

    Added

    • Alternative state checkbox image by @israel-dryer in https://github.com/israel-dryer/ttkbootstrap/pull/197
    • stepsize parameter added to the Meter widget @israel-dryer in https://github.com/israel-dryer/ttkbootstrap/pull/196

    Fixed

    • Correct Chinese translation errors by @745404527 in https://github.com/israel-dryer/ttkbootstrap/pull/211

    Changed

    • msgcat implemented with no data files to make distribution easier by @israel-dryer in https://github.com/israel-dryer/ttkbootstrap/pull/213
    • Updated the issue templates and some translations. by @NewbieXvwu in https://github.com/israel-dryer/ttkbootstrap/pull/203
    • Updated Chinese Translation by @745404527 in https://github.com/israel-dryer/ttkbootstrap/pull/212

    New Contributors

    • @745404527 made their first contribution in https://github.com/israel-dryer/ttkbootstrap/pull/211

    Full Changelog: https://github.com/israel-dryer/ttkbootstrap/compare/v1.7.1...v1.7.2

    Source code(tar.gz)
    Source code(zip)
  • v1.7.1(Feb 8, 2022)

    What's Changed

    Miscellaneous bug fixes.

    Fixed

    • Crash caused in tcl script by pathname containing spaces passed to the MessageCatalog.load method, fixed by using tcl list for pathname by @israel-dryer in https://github.com/israel-dryer/ttkbootstrap/pull/194
    • Vertical scrollbar visible even when 'hidden' when the content frame was shorter than the container; this was fixed by using pack/pack_forget instead of lift/lower to hide the scrollbar by @israel-dryer in https://github.com/israel-dryer/ttkbootstrap/pull/195

    Full Changelog: https://github.com/israel-dryer/ttkbootstrap/compare/v1.7.0...v1.7.1

    Source code(tar.gz)
    Source code(zip)
  • v1.7.0(Feb 8, 2022)

    What's Changed

    New class model for ScrolledFrame and misc event refactors.

    Added

    • New <<MapChild>> virtual event that is generated on the master or parent widget when a new child is added by @israel-dryer in https://github.com/israel-dryer/ttkbootstrap/pull/190

    Changed

    • Refactored bind_all and bind_class application binds out of the Window class by @israel-dryer in https://github.com/israel-dryer/ttkbootstrap/pull/190
    • Completely new class model for the ScrolledFrame widget with added parameter scrollheight by @israel-dryer in https://github.com/israel-dryer/ttkbootstrap/pull/193

    Full Changelog: https://github.com/israel-dryer/ttkbootstrap/compare/v1.6.2...v1.7.0

    Source code(tar.gz)
    Source code(zip)
  • v1.6.2(Feb 7, 2022)

    What's Changed

    Bug fix on MessageCatalog and change default position on dialogs

    Fixed

    • MessageCatalog.set_many method now works and allows you to add a list of src-translation items into the message catalog on demand by @israel-dryer in https://github.com/israel-dryer/ttkbootstrap/pull/187

    Changed

    • The default location of dialog is no longer centered on the screen due to issues with Tkinter handling multiple displays. The position now anchors to the NW corner of the parent or master, but also permits you to pass in a position parameter to set the x and y position to post the dialog by @israel-dryer in https://github.com/israel-dryer/ttkbootstrap/pull/188 and https://github.com/israel-dryer/ttkbootstrap/pull/189

    Full Changelog: https://github.com/israel-dryer/ttkbootstrap/compare/v1.6.1...v1.6.2

    Source code(tar.gz)
    Source code(zip)
  • v1.6.1(Feb 6, 2022)

    What's Changed

    Changes related to localization and update to default date in dialog.

    • Static methods in the MessageCatalog class were not properly decorated as static methods using the @ staticmethod decorator by @israel-dryer in https://github.com/israel-dryer/ttkbootstrap/pull/182.
    • Using importlib.resources for package resources to make finding package resource easier when packing via pyinstaller and others by @israel-dryer in https://github.com/israel-dryer/ttkbootstrap/pull/186.
    • Date in DateEntry uses system default for language by @antrrax in https://github.com/israel-dryer/ttkbootstrap/pull/174

    Full Changelog: https://github.com/israel-dryer/ttkbootstrap/compare/v1.6.0...v1.6.1

    Source code(tar.gz)
    Source code(zip)
  • v1.6.0(Feb 3, 2022)

    What's changed

    Color widgets, localization, Chinese documentation, and several bug fixes.

    Added

    • Color selector dialog and color dropper #149 #162 #163
    • Add localization module with localized dialog buttons #151 #155 #160 #175
    • Translate the docs to Chinese #148 #157 #158 #168
    • Convert file structure and config #153
    • Added Control + a (select all) in DateEntry #166

    Fixed

    • Font dialog bug fixes #156
    • Fix flashing when building a Window or Toplevel #159
    • Fixes bug when typing 0 in the index #165
    • Fix Scrolledframe geometry management behavior #179

    Changed

    • Make default root function part of window module #176
    • Update documentation for new classes, modules, and functions #180

    New Contributors

    • @NewbieXvwu made their first contribution in https://github.com/israel-dryer/ttkbootstrap/pull/148
    • @antrrax made their first contribution in https://github.com/israel-dryer/ttkbootstrap/pull/160

    Full Changelog: https://github.com/israel-dryer/ttkbootstrap/compare/v1.5.1...v1.6.0

    Source code(tar.gz)
    Source code(zip)
  • v1.5.1(Jan 18, 2022)

    Fixed

    • Irregular behavior when mixing pack and place geometry managers inside the ScrolledFrame widget #140
    • Missing font caused failure on certain linux distributions when drawing the checkbutton assets #143

    Full Changelog: https://github.com/israel-dryer/ttkbootstrap/compare/v1.5.0...v1.5.1

    Source code(tar.gz)
    Source code(zip)
  • v1.5.0(Jan 10, 2022)

    What's Changed

    Added

    • Add validation module by @israel-dryer in https://github.com/israel-dryer/ttkbootstrap/pull/129. The user can now easily add validation to any Entry type widget such as Entry, Combobox, and Spinbox. Several pre-defined validation functions are included by default, but instructions are in the API for how to easily build new custom validations.
    • Add Colors.make_transparent method to improve color handling. This will eventually replace the Colors.update_hsv method for building various widget colors that are not in the standard color scheme.

    Fixed

    • Fix disabled widget colors by @israel-dryer in https://github.com/israel-dryer/ttkbootstrap/pull/128
    • Custom stripecolors were not being applied in Tableview #130
    • Tableview now reverts to prev page if all rows are hidden or deleted on current page #130
    • Page number entered into Entry was adding 1 page to number #130

    Full Changelog: https://github.com/israel-dryer/ttkbootstrap/compare/v1.4.0...v1.5.0

    Source code(tar.gz)
    Source code(zip)
  • v1.4.0(Jan 8, 2022)

    What's Changed

    • Tableview bug fixes and feature upgrades by @israel-dryer in https://github.com/israel-dryer/ttkbootstrap/pull/124
    • Enable tableview value updates with property setter by @israel-dryer in https://github.com/israel-dryer/ttkbootstrap/pull/125

    Fixed

    • Entering a page less than 1 or greater than the max in the page entry no longer returns an empty or invalid page
    • The +/- column options in the right-click menu now update when columns are deleted or inserted into the table
    • Other miscellaneous not worthy of a write-up

    Added

    • Default stripe colors are added for all themes
    • Bulk delete and insert is now available via the Tableview.purge_table_data and Tableview.build_table_data methods. Along with the existing insert methods, delete methods have been added for columns and rows to make the data handling full-featured.
    • New command in the right-click cell menu
      • delete selected rows
    • New commands in the right-click header menu
      • delete column
      • hide column
      • show all columns
    • Table rows can now be updated with the TableRows.values property

    Changed

    • The stripecolor parameter is enhanced so that passing in a tuple with None for background and foreground colors will now cause that element to use a default color. For example: stripecolor=(None, None) will cause a default foreground and background color while stripecolor=('yellow', None) will cause a yellow background and default foreground color. The default setting of stripecolor=None will disabled stripecolors altogether.

    Full Changelog: https://github.com/israel-dryer/ttkbootstrap/compare/v1.3.1...v1.4.0

    Source code(tar.gz)
    Source code(zip)
  • v1.3.1(Jan 4, 2022)

    What's Changed

    • Bug fixes on ScrolledFrame by @israel-dryer in https://github.com/israel-dryer/ttkbootstrap/pull/120

    Full Changelog: https://github.com/israel-dryer/ttkbootstrap/compare/v1.3.0...v1.3.1

    Source code(tar.gz)
    Source code(zip)
  • v1.3.0(Jan 4, 2022)

    Added

    • ScrolledFrame and ScrolledText by @israel-dryer in #102, #104
    • Tableview by @israel-dryer in #110, #117
    • disabled and readonly state cursor for entry type widgets by @israel-dryer in #111

    Fixed

    • window module api issues by @israel-dryer in #109
    • disabled fg color for entry, combobox, spinbox by @israel-dryer in #112

    Changed

    • Removed black dependency with json formatter by @israel-dryer in #107

    Full Changelog: https://github.com/israel-dryer/ttkbootstrap/compare/v1.2.0...v1.3.0

    Source code(tar.gz)
    Source code(zip)
  • v1.2.0(Dec 26, 2021)

    Added

    • autostyle flag added to legacy tkinter widgets by @israel-dryer in #101. This will enable you to turn off the default ttkbootstrap styling to legacy widgets so that you can apply your own customizations.

    Fixed

    • predefined styles are now configurable even if not yet created by @israel-dryer in #100.

    Full Changelog: https://github.com/israel-dryer/ttkbootstrap/compare/v1.1.0...v1.2.0

    Source code(tar.gz)
    Source code(zip)
  • v1.1.0(Dec 21, 2021)

    What's Changed

    • Add toast and tooltip modules by @israel-dryer in https://github.com/israel-dryer/ttkbootstrap/pull/97

    Full Changelog: https://github.com/israel-dryer/ttkbootstrap/compare/v1.0.1...v1.1.0

    Source code(tar.gz)
    Source code(zip)
  • v1.0.1(Dec 20, 2021)

    What's Changed

    • added new themes cerculean and simplex
    • fixed several linux-related bugs noticed from repli.it by @israel-dryer in https://github.com/israel-dryer/ttkbootstrap/pull/94

    Full Changelog: https://github.com/israel-dryer/ttkbootstrap/compare/v1.0.0...v1.0.1

    Source code(tar.gz)
    Source code(zip)
  • v1.0.0(Dec 19, 2021)

    Version 1.0.0 has been officially release, introducing a completely new style engine and api.

    Checkout the new documentation if you haven't seen it already.

    python -m pip install ttkbootstrap
    

    What's Changed

    • styles and themes are created on demand, not loaded all at once; provides much greater flexibility and lower memory footprint
    • removed the dependency on json for themes and external resource files
    • enabled high-dpi scaling for high resolution displays, add scaling parameter to Window and Toplevel
    • updated existing theme colors and added new themes
    • added rounded scrollbar style
    • added new themed dialogs
    • add Window and Toplevel classes to parameterize commonly used methods + includes Style as a property
    • completely redesigned the ttkcreator application
    • delete all entry DateEntry when error occurs, and give it new value by @jongbatax in https://github.com/israel-dryer/ttkbootstrap/pull/49

    Full Changelog: https://github.com/israel-dryer/ttkbootstrap/compare/v0.5.1...v1.0.0

    New Contributors

    • @jongbatax made their first contribution in https://github.com/israel-dryer/ttkbootstrap/pull/49
    Source code(tar.gz)
    Source code(zip)
Owner
Israel Dryer
Israel Dryer
A lightweight Python module to interact with the Mitre Att&ck Enterprise dataset.

enterpriseattack - Mitre's Enterprise Att&ck A lightweight Python module to interact with the Mitre Att&ck Enterprise dataset. Built to be used in pro

xakepnz 7 Jan 01, 2023
A companion web application to connect stash to deovr

stash-vr-companion This is a companion web application to connect stash to deovr. Stash is a self hosted web application to manage your porn collectio

19 Sep 29, 2022
The little-endian version of MessagePack

MessagePackEL This is the little-endian version of MessagePack, except the endianness is different, the rest is exactly the same as MessagePack. C lib

dukelec 9 May 13, 2022
Telop - Encode and decode messages using an interpretation of the telegraphic code devised by José María Mathé

telop Telop (TELégrafoÓPtico) - Utilidad para codificar y descodificar mensajes de texto empleando una interpretación del código telegráfico ideado po

Ricardo F. 4 Nov 01, 2022
Age of Empires II recorded game parsing and summarization in Python 3.

mgz Age of Empires II recorded game parsing and summarization in Python 3. Supported Versions Age of Kings (.mgl) The Conquerors (.mgx) Userpatch 1.4

148 Dec 11, 2022
Slotscheck - Find mistakes in your slots definitions

🎰 Slotscheck Adding __slots__ to a class in Python is a great way to reduce mem

Arie Bovenberg 67 Dec 31, 2022
Fast Base64 encoding/decoding in Python

Fast Base64 implementation This project is a wrapper on libbase64. It aims to provide a fast base64 implementation for base64 encoding/decoding. Insta

Matthieu Darbois 96 Dec 26, 2022
A prototype COG-based tile server for sparse Mars datasets

Mars tiler Mars Tiler is a prototype web application that serves tiles from cloud-optimized GeoTIFFs, with an emphasis on supporting planetary dataset

Daven Quinn 3 Mar 23, 2022
Decoupled Smoothing in Probabilistic Soft Logic

Decoupled Smoothing in Probabilistic Soft Logic Experiments for "Decoupled Smoothing in Probabilistic Soft Logic". Probabilistic Soft Logic Probabilis

Kushal Shingote 1 Feb 08, 2022
All you need to understand CRUD and MVP in DRF

Book-Store-API This an API which has been put in place just to make you order for books, upload books with price, image and all, pay and automtically

Oladipo Adesiyan 6 Jul 03, 2022
Quanser Labs Robotic Arm With Python

Quanser-Labs-Robotic-Arm As a team, we programmed a Robotic-Arm in Python on the

1 Jul 11, 2022
A student information management system in Python

Student-information-management-system 本项目是一个学生信息管理系统,这个项目是用Python语言实现的,也实现了图形化界面的显示,同时也实现了管理员端,学生端两个登陆入口,同时底层使用的是Redis做的数据持久化。 This project is a stude

liuyunfei 7 Nov 15, 2022
LiteX-Acorn-Baseboard is a baseboard developed around the SQRL's Acorn board (or Nite/LiteFury) expanding their possibilities

LiteX-Acorn-Baseboard is a baseboard developed around the SQRL's Acorn board (or Nite/LiteFury) expanding their possibilities

33 Nov 26, 2022
Todo-backend - Todo backend with python

Todo-backend - Todo backend with python

Julio C. Diaz 1 Jan 07, 2022
Team collaborative evaluation tracker.

Team collaborative evaluation tracker.

2 Dec 19, 2021
Coinloggr - A learning resource and social platform for the coin collecting community

Coinloggr A learning resource and social platform for the coin collecting commun

John Galiszewski 1 Jan 10, 2022
GitHub saver for stargazers, forks, repos

GitHub backup repositories Save your repos and list of stargazers & list of forks for them. Pure python3 and git with no dependencies to install. GitH

Alexander Kapitanov 23 Aug 21, 2022
Simple cash register system made with guizero

Eje-Casher なにこれ guizeroで作った簡易レジシステムです。実際にコミケで使う予定です。 これを誰かがそのまま使うかどうかというよりは、guiz

Akira Ouchi 4 Nov 07, 2022
Extend the maya channel box with searchability and colour

channel-box-plus will add search-ability over its attributes, and it will colour user defined attributes, making them easier to distinguish.

Robert Joosten 12 Jun 08, 2022
A Snakemake workflow for standardised sc/snRNAseq analysis

single_snake_sequencing - sc/snRNAseq Snakemake Workflow A Snakemake workflow for standardised sc/snRNAseq analysis. Every single cell analysis is sli

IMS Bio2Core Facility 1 Nov 02, 2021