Skip to content

New Widgets #107

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 15 commits into
base: master
Choose a base branch
from
5 changes: 5 additions & 0 deletions AUTHORS.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,8 @@ This file contains a list of all the authors of widgets in this repository. Plea
* PR #59: Example runner (`examples/run.py`)
- [jnhyperion](https://github.com/jnhyperion)
* PR #31
- [Faraaz Kurawle](https://github.com/kurawlefaraaz)
* `DynamicNotebook`
* `NumberedText`, based on idea of [yelsayed](https://stackoverflow.com/a/37087317/16187613)
* `EditableTreeview`, based on idea of [dakov](https://stackoverflow.com/a/18815802/16187613)
* [found here](https://github.com/kurawlefaraaz/Tk-Themed-Utilities)
6 changes: 6 additions & 0 deletions docs/source/authors.rst
Original file line number Diff line number Diff line change
Expand Up @@ -61,3 +61,9 @@ List of all the authors of widgets in this repository. Please note that this lis
- Multiple authors:

* :class:`~ttkwidgets.ScaleEntry` (RedFantom and Juliette Monsel)

- `Faraaz Kurawle <https://github.com/kurawlefaraaz>`_

* :class:`~ttkwidgets.DynamicNotebook`
* :class:`NumberedText`, based on idea of, `yelsayed <https://stackoverflow.com/a/37087317/16187613>`_
* :class:`EditableTreeview`, based on idea of, `dakov <https://stackoverflow.com/a/18815802/16187613>`_
10 changes: 10 additions & 0 deletions docs/source/ttkwidgets/ttkwidgets/ttkwidgets.DynamicNotebook.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
DynamicNotebook
=====

.. currentmodule:: ttkwidgets

.. autoclass:: DynamicNotebook
:show-inheritance:
:members:

.. automethod:: __init__
10 changes: 10 additions & 0 deletions docs/source/ttkwidgets/ttkwidgets/ttkwidgets.EditableTreeview.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
EditableTreeview
=====

.. currentmodule:: ttkwidgets

.. autoclass:: EditableTreeview
:show-inheritance:
:members:

.. automethod:: __init__
10 changes: 10 additions & 0 deletions docs/source/ttkwidgets/ttkwidgets/ttkwidgets.NumberedText.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
NumberedText
=====

.. currentmodule:: ttkwidgets

.. autoclass:: NumberedText
:show-inheritance:
:members:

.. automethod:: __init__
11 changes: 11 additions & 0 deletions examples/example_dynamic_notebook.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from ttkwidgets.dynamic_notebook import DynamicNotebook
import tkinter as tk

def demo():
root = tk.Tk()
wksp =DynamicNotebook(root)
wksp.pack(fill="both", expand=1)
root.mainloop()

if __name__ == "__main__":
demo()
16 changes: 16 additions & 0 deletions examples/example_editable_treeview.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from ttkwidgets.editable_treeview import EditableTreeview
import tkinter as tk

def demo():
root = tk.Tk()
root.title("NumberedText Demo")
columns = ("attribute", "value")
data = {f"Demo {i}": f"Demo {i}" for i in range(1, 101)}

widget = EditableTreeview(root, columns=columns, show=" tree", bind_key="<Double-Button-1>", data=data)
widget.pack(expand=1, fill="both", padx=20, pady=20)

root.mainloop()

if __name__ == "__main__":
demo()
10 changes: 10 additions & 0 deletions examples/example_numberedtext.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
from ttkwidgets.numberedtext import NumberedText
import tkinter as tk
def demo():
root = tk.Tk()
root.title("NumberedText Demo")
NumberedText(root, bg="red").pack(side="left")
root.mainloop()

if __name__ == "__main__":
demo()
21 changes: 21 additions & 0 deletions tests/test_dynamicnotebook.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Copyright (c) FaraazKurawle 2024
# For license see LICENSE

from ttkwidgets.dynamic_notebook import DynamicNotebook
from tests import BaseWidgetTest

class TestDynamicNotebook(BaseWidgetTest):
def test_dynamicnotebook_init(self):
widget = DynamicNotebook(self.window)
widget.pack()
self.window.update()

def test_dynamicnotebook_buttons_functions(self):
widget = DynamicNotebook(self.window)
widget.pack()
widget.add_frame_button_func()
widget.remove_frame()

def test_dynamicnotebook_kw(self):
widget = DynamicNotebook(self.window)
widget.pack()
13 changes: 13 additions & 0 deletions tests/test_editable_treeview.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Copyright (c) FaraazKurawle 2024
# For license see LICENSE

from ttkwidgets.editable_treeview import EditableTreeview
from tests import BaseWidgetTest

class TestEditableTreeview(BaseWidgetTest):
def test_editabletreeview_init(self):
columns = ("attribute", "value")
data = {f"Demo {i}": f"Demo {i}" for i in range(1, 101)}

widget = EditableTreeview(self.window, columns=columns, show=" tree", bind_key="<Double-Button-1>", data=data)
widget.pack(expand=1, fill="both", padx=20, pady=20)
20 changes: 20 additions & 0 deletions tests/test_numberedtext.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Copyright (c) FaraazKurawle 2024
# For license see LICENSE

from ttkwidgets.numberedtext import NumberedText
from tests import BaseWidgetTest

class TestNumberedText(BaseWidgetTest):
def test_numberedtext_init(self):
widget = NumberedText(self.window)
widget.pack()
self.window.update()

def test_numberedtext_buttons_functions(self):
widget = NumberedText(self.window)
widget.pack()
# No buttons

def test_numberedtextr_kw(self):
widget = NumberedText(self.window, bg="red")
widget.pack()
72 changes: 72 additions & 0 deletions ttkwidgets/dynamic_notebook.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
"""
Author: Faraaz Kurawle
License: GNU GPLv3
Source: This repository
"""

import tkinter as tk
import tkinter.ttk as ttk

class DynamicNotebook(ttk.Notebook):
"""
Notebook widget with ablity to add or remove tabs in the runtime.

:param parent: parent widget of this widget.
"""
def __init__(self, parent):
super().__init__(parent)

self.root = parent
self.frame_dict = {}
self.intial_Frames()

self.bind("<<NotebookTabChanged>>", self.watcher)


def intial_Frames(self):
frame1 = tk.Frame(self, bg="white")

self.add(frame1, text="Frame 1")
self.add(tk.Label(self), text="-")
self.add(tk.Label(self), text="+")

self.frame_dict.update({"Frame 1": frame1})

def add_frame_button_func(self):
c = self.index("current")
self.insert_frame(c - 1)

def insert_frame(self, index):
tab_text = f"Frame {index+1}"
frame = tk.Frame(self, bg="white")

self.insert(index, frame, text=tab_text)

self.frame_dict.update({tab_text: frame})
self.select(index)

def remove_frame(self, index):
self.forget(index)
self.select(index - 1)

def get_current_frame_tcl_name(self):
current_index = self.index("current")
return self.root.nametowidget(self.tabs()[current_index])

def watcher(self, e):
tab_name = self.tab(self.select(), "text")

if tab_name not in ("-", "+"):
return

if tab_name == "-":
c = self.index("current")
if self.index("end") > 3:
self.remove_frame(c - 1)
else:
self.select(c - 1)

elif tab_name == "+":
c = self.index("current")
self.insert_frame(c - 1)

Loading