V1.0
@@ -0,0 +1,45 @@
|
||||
{
|
||||
"Version": 1,
|
||||
"WorkspaceRootPath": "C:\\Users\\William\\Documents\\HawkEye\\Dante Tones\\Dante\\",
|
||||
"Documents": [
|
||||
{
|
||||
"AbsoluteMoniker": "D:0:0:{5E5BA753-ACEA-4DC7-912D-3CFCF80D955C}|Dante.pyproj|C:\\Users\\William\\Documents\\HawkEye\\Dante Tones\\Dante\\Dante.py||{8B382828-6202-11D1-8870-0000F87579D2}",
|
||||
"RelativeMoniker": "D:0:0:{5E5BA753-ACEA-4DC7-912D-3CFCF80D955C}|Dante.pyproj|solutionrelative:Dante.py||{8B382828-6202-11D1-8870-0000F87579D2}"
|
||||
}
|
||||
],
|
||||
"DocumentGroupContainers": [
|
||||
{
|
||||
"Orientation": 0,
|
||||
"VerticalTabListWidth": 256,
|
||||
"DocumentGroups": [
|
||||
{
|
||||
"DockedWidth": 209,
|
||||
"SelectedChildIndex": 2,
|
||||
"Children": [
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:0:0:{e506b91c-c606-466a-90a9-123d1d1e12b3}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:0:0:{cce594b6-0c39-4442-ba28-10c64ac7e89f}"
|
||||
},
|
||||
{
|
||||
"$type": "Document",
|
||||
"DocumentIndex": 0,
|
||||
"Title": "Dante.py",
|
||||
"DocumentMoniker": "C:\\Users\\William\\Documents\\HawkEye\\Dante Tones\\Dante\\Dante.py",
|
||||
"RelativeDocumentMoniker": "Dante.py",
|
||||
"ToolTip": "C:\\Users\\William\\Documents\\HawkEye\\Dante Tones\\Dante\\Dante.py",
|
||||
"RelativeToolTip": "Dante.py",
|
||||
"ViewState": "AgIAAAIAAAAAAAAAAAAowBAAAABSAAAAAAAAAA==",
|
||||
"Icon": "00000000-0000-0000-0000-000000000000.000000|iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHfSURBVDhPpZCxaxNhGMZ/9zVJaUuDUlq1FBWLZBFTCXo4BFyU1qGKi4OkIHhkzF/g0KF00M2lR9YUdDDQQVAcJILoQUd1UNRmkhoRm8RL777v7nOoCZd4AcEH3uF5nvd73vd74X\u002BgtTai3LIsHeWDEEJct217a1DvwbIs7bpubFUqFW3b9naxWLwWfSOipAvHcfqqi0KhkMtms3cty1rsaomeG4FpmoMSANVqlXQ6nQMWgacMC4hOBchduEj\u002ByjKjScGh8SS1Wq3nxQZEN3j1eY/Vrfe8rTeQvsf89ARLS1cz5XIZ/uUGXxptQiVRUhJIybudXaZn52a7vbEBpmkyNb/A69YM9W8tDEJOTI2hpI\u002BSkvOZH2f13sNAB\u002B07sV9wHIdH9Unquz9RvoeUPtL3UFISKkky\u002BAT7HwTi6FpsgGma3N9\u002Bg5I\u002BKaFZyU8wOpJChwHnjiuE9wKCXyC/zsQGOI7DeELjtiUPbgky6Wd/HA3KBelC4AIpNfQGl88cQ0mfI5PugRhKkM2DUk0INYwtPI/dAGAlf4rbl06T6DyBVgeCABJzYPhwcm0V8ICNvwJKpVIf37h3IxSyKVAuBMDIYQAMw1jvaxwGrYNl3Xq5o79vat3Y3Nedj4\u002B11je7/m\u002BXOuyzFtDhUgAAAABJRU5ErkJggg==",
|
||||
"WhenOpened": "2025-02-14T16:33:07.888Z",
|
||||
"EditorCaption": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
{
|
||||
"Version": 1,
|
||||
"WorkspaceRootPath": "C:\\Users\\William\\Documents\\HawkEye\\Dante Tones\\Dante\\",
|
||||
"Documents": [
|
||||
{
|
||||
"AbsoluteMoniker": "D:0:0:{5E5BA753-ACEA-4DC7-912D-3CFCF80D955C}|Dante.pyproj|C:\\Users\\William\\Documents\\HawkEye\\Dante Tones\\Dante\\Dante.py||{8B382828-6202-11D1-8870-0000F87579D2}",
|
||||
"RelativeMoniker": "D:0:0:{5E5BA753-ACEA-4DC7-912D-3CFCF80D955C}|Dante.pyproj|solutionrelative:Dante.py||{8B382828-6202-11D1-8870-0000F87579D2}"
|
||||
}
|
||||
],
|
||||
"DocumentGroupContainers": [
|
||||
{
|
||||
"Orientation": 0,
|
||||
"VerticalTabListWidth": 256,
|
||||
"DocumentGroups": [
|
||||
{
|
||||
"DockedWidth": 209,
|
||||
"SelectedChildIndex": 1,
|
||||
"Children": [
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:0:0:{e506b91c-c606-466a-90a9-123d1d1e12b3}"
|
||||
},
|
||||
{
|
||||
"$type": "Document",
|
||||
"DocumentIndex": 0,
|
||||
"Title": "Dante.py",
|
||||
"DocumentMoniker": "C:\\Users\\William\\Documents\\HawkEye\\Dante Tones\\Dante\\Dante.py",
|
||||
"RelativeDocumentMoniker": "Dante.py",
|
||||
"ToolTip": "C:\\Users\\William\\Documents\\HawkEye\\Dante Tones\\Dante\\Dante.py",
|
||||
"RelativeToolTip": "Dante.py",
|
||||
"ViewState": "AgIAAAIAAAAAAAAAAAAowBAAAABSAAAAAAAAAA==",
|
||||
"Icon": "00000000-0000-0000-0000-000000000000.000000|iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd\u002BUAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAUqSURBVEhLvZbRb1RVHsc/5947l3ZaZ6YtbUkVOwxMmlpWhGhCspIASVfTZPvgCxsxGn0xGUkMpvKyf8AmbLJRnzS8sESiWfABE6xEgmsq6mIt6KYpBYemFtthWqaUTtuZe\u002B85v30YatrLOBgf9pt8c3N/55zfJ7/fvefcC/9PiYgKxwCi0ejDjuNEw/EHSAO5u3fvLocH1qoqsK\u002Bv7/zevXv3O44THqqqfD5PsVic9Tzv7\u002BfOnXtvcnJyMTxnVb8KPHbs2P5EIhEeqqqzZ8\u002BysLBwJ5/P356YmDg\u002BNDT01vj4\u002BFJ4HoAVDvxebd26NdHf39\u002BcTCYP7t69e6Cnp6chPAfADgcA0un0i/39/Vtc1\u002BXq1avMzc3d50KhQHNzM0oprl\u002B/TjQapaenpz6VSm2Ynp7e6Lpuu9b60uzsrL829wMrTCaTVd3Z2YlS9z\u002BRTZs2PXTw4MGuVCrVl0gkMuHxmkClFK7r/qpXZVkWp06d4siRIwwMDHD06NGGXC63C0itSwjUfA1FhNHR0XAYANu26e7uRilFb28v\u002B/btWzeezWY5fPjwuhi/pcLt27dXdXd3N7ZtY1B4YlEWB48IOC7RaHRdB9aqJhBgZmamqktlj7HcMh9fzvHBNz9x4ssJTgxlef/LLJ9euYknNi0tLeF0tYEiguM4VR0oh9PDU0zNLzF8Y47PfrjJ4Mgkp7/6kffO/Zeh7AKP79gRTlkbqJSira2tqsvGYqawTGpjA/E6B6M1YgKM1iwUVxifWeSFl16xDxw4sG7r1QSKCCMjI1Xta0NufpETX1xjbOo2Wmt0YDBao41GB5q29k1WR0fHOuD9G2nN0RaPxzHGwL1qA6PI3i4xM7\u002BMrw0rZR9jNMYIN3J3uDg6xd3lEkZrHn80xj9e7iIWKYDTfhu3828bWzvefiCwWCziOA6\u002Bcvnw25/5fDRH2Qsw2icIKi3U2scEGq0DdKAxQcCOznreeUloMN\u002BBWBA7oIk\u002B2ffAlt66dYtCocDoVIEfJucpez7G\u002BGgdVKrTq9DK1egAIwG2Mth4YDToZSh\u002BYQOv1gQqpUilUmzevJlFX1FYXKkkDHQl\u002BWqFq/daY4wmXu\u002BypzuKa26CLlVcugqin67Z0lgsRjabJR6P8/W04fi/r6O1jw4ClAi7kg\u002BxJw0b7DIics\u002BGeN0Sf2idJGZNgCmDeKA9SP5TalZI5TAmkUhgK1AYTGAw2pBur\u002BPN3jx96a/o3fotf9o2zDPp73h22yX\u002B\u002BPAwMSsLegXMvQp1GVRE1QQqpWhsbKSuro6maIRG10JLpW19O1tojVzGYQFLFrHMAlYwhxXMgj8fgpUg0gEqcq0mUES4cuUKY2NjtNYLyZYGlA7QOqApalAYEKm8GMGa5LpUAepSJW40NO41KPV\u002BTaBlWezcuZOuri66O9t5bvcW9jzWwa5UK/GGDSAGjA9mBRBQDaBiYMXAaYUNXVC/HeLPlmh6ZuTChQvv1vw8rZXWml1bWnhqWxsAjuRgtlwBag\u002BsOrCbwIpU4M5GaHnhGnbDxcHBwdzk5L9OZzKZuZoVhmWMwfd9fN\u002BvnIprW\u002BjloTgMlgtOK7L0PSLBxTNnzrx26NChv2YymcvU\u002BgCfPHmSWr\u002BJz//lz7TZreDfAOOB9kHKUJ6DCBjnkfmzn1wYfeONgdLExMQv66ruw9/yIzw7m38iYm6\u002By53BJoqXwJsGDLhpJL5fTOO\u002B/xw7/tHLmUxmPLz2d6m5uVmJSFpE3haRH0XEE5ElEflaRF4/f/58LLwG4H9\u002BJsjcTp8b4QAAAABJRU5ErkJggg==",
|
||||
"WhenOpened": "2025-02-14T16:33:07.888Z",
|
||||
"EditorCaption": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,121 @@
|
||||
import sounddevice as sd
|
||||
import numpy as np
|
||||
import threading
|
||||
import tkinter as tk
|
||||
from tkinter import ttk
|
||||
import re
|
||||
|
||||
playing_threads = {}
|
||||
|
||||
def list_dante_devices():
|
||||
"""List all unique Dante Virtual Soundcard output devices sorted by channel order."""
|
||||
devices = sd.query_devices()
|
||||
seen = {}
|
||||
|
||||
for d in devices:
|
||||
if "DVS Transmit" in d['name'] and d['max_output_channels'] == 2:
|
||||
match = re.search(r'(\d+)-', d['name']) # Extract first number before '-'
|
||||
if match:
|
||||
channel_number = int(match.group(1))
|
||||
if channel_number not in seen:
|
||||
seen[channel_number] = d
|
||||
|
||||
return [seen[key] for key in sorted(seen.keys())]
|
||||
|
||||
def generate_tone(frequency=440, sample_rate=48000):
|
||||
"""Generate a continuous sine wave tone."""
|
||||
t = np.linspace(0, 1, sample_rate, False)
|
||||
wave = 0.5 * np.sin(2 * np.pi * frequency * t)
|
||||
return wave.astype(np.float32)
|
||||
|
||||
def play_sound_on_device(device_index, channel, frequency=440, sample_rate=48000):
|
||||
"""Continuously play a sine wave on a specific stereo Dante Virtual Soundcard channel using OutputStream."""
|
||||
if channel not in [1, 2]:
|
||||
print("Invalid channel. Must be 1 (Left) or 2 (Right).")
|
||||
return
|
||||
|
||||
tone = generate_tone(frequency, sample_rate)
|
||||
output = np.zeros((len(tone), 2), dtype=np.float32) # Stereo output
|
||||
output[:, channel - 1] = tone # Assign tone to the selected channel
|
||||
|
||||
def callback(outdata, frames, time, status):
|
||||
if status:
|
||||
print(status)
|
||||
outdata[:frames] = output[:frames]
|
||||
|
||||
stream = sd.OutputStream(device=device_index, samplerate=sample_rate, channels=2, callback=callback)
|
||||
playing_threads[(device_index, channel)] = stream
|
||||
stream.start()
|
||||
|
||||
def stop_sound(device_index, channel):
|
||||
"""Stop playing sound on a given device and channel."""
|
||||
stream = playing_threads.pop((device_index, channel), None)
|
||||
if stream:
|
||||
stream.stop()
|
||||
stream.close()
|
||||
|
||||
def stop_all_sounds():
|
||||
"""Stop all currently playing sounds."""
|
||||
for key in list(playing_threads.keys()):
|
||||
stop_sound(*key)
|
||||
|
||||
def play_all_sounds(frequency):
|
||||
"""Play sound on all available Dante channels."""
|
||||
devices = list_dante_devices()
|
||||
for device in devices:
|
||||
for channel in [1, 2]:
|
||||
play_sound_on_device(device['index'], channel, frequency)
|
||||
|
||||
def start_gui():
|
||||
devices = list_dante_devices()
|
||||
root = tk.Tk()
|
||||
root.title("Dante Virtual Soundcard Player")
|
||||
|
||||
frame = ttk.Frame(root)
|
||||
frame.pack(padx=10, pady=10)
|
||||
|
||||
ttk.Label(frame, text="Frequency (Hz):").grid(row=0, column=1)
|
||||
frequency_entry = ttk.Entry(frame)
|
||||
frequency_entry.grid(row=0, column=2)
|
||||
frequency_entry.insert(0, "440")
|
||||
|
||||
def toggle_all_play():
|
||||
freq = float(frequency_entry.get())
|
||||
play_all_sounds(freq)
|
||||
|
||||
def toggle_all_stop():
|
||||
stop_all_sounds()
|
||||
|
||||
all_on_btn = ttk.Button(frame, text="All ON", command=toggle_all_play)
|
||||
all_on_btn.grid(row=1, column=3, padx=5)
|
||||
|
||||
all_off_btn = ttk.Button(frame, text="All OFF", command=toggle_all_stop)
|
||||
all_off_btn.grid(row=1, column=4, padx=5)
|
||||
|
||||
buttons = []
|
||||
|
||||
for idx, device in enumerate(devices):
|
||||
device_name = device['name']
|
||||
device_index = device['index']
|
||||
ttk.Label(frame, text=device_name).grid(row=idx + 2, column=0, sticky="w")
|
||||
|
||||
for channel in [1, 2]:
|
||||
btn = ttk.Button(frame, text=f"Ch {channel} ON", width=10)
|
||||
btn.grid(row=idx + 2, column=channel, padx=5)
|
||||
|
||||
def toggle_play(dev_idx=device_index, ch=channel, button=btn):
|
||||
if (dev_idx, ch) in playing_threads:
|
||||
stop_sound(dev_idx, ch)
|
||||
button.config(text=f"Ch {ch} ON")
|
||||
else:
|
||||
freq = float(frequency_entry.get())
|
||||
play_sound_on_device(dev_idx, ch, freq)
|
||||
button.config(text=f"Ch {ch} OFF")
|
||||
|
||||
btn.config(command=toggle_play)
|
||||
buttons.append(btn)
|
||||
|
||||
root.mainloop()
|
||||
|
||||
if __name__ == "__main__":
|
||||
start_gui()
|
||||
@@ -0,0 +1,35 @@
|
||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>5e5ba753-acea-4dc7-912d-3cfcf80d955c</ProjectGuid>
|
||||
<ProjectHome>.</ProjectHome>
|
||||
<StartupFile>Dante.py</StartupFile>
|
||||
<SearchPath>
|
||||
</SearchPath>
|
||||
<WorkingDirectory>.</WorkingDirectory>
|
||||
<OutputPath>.</OutputPath>
|
||||
<Name>Dante</Name>
|
||||
<RootNamespace>Dante</RootNamespace>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<EnableUnmanagedDebugging>false</EnableUnmanagedDebugging>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<EnableUnmanagedDebugging>false</EnableUnmanagedDebugging>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Dante.py" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Python Tools\Microsoft.PythonTools.targets" />
|
||||
<!-- Uncomment the CoreCompile target to enable the Build command in
|
||||
Visual Studio and specify your pre- and post-build commands in
|
||||
the BeforeBuild and AfterBuild targets below. -->
|
||||
<!--<Target Name="CoreCompile" />-->
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
</Project>
|
||||
@@ -0,0 +1,23 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.13.35806.99 d17.13
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{888888A0-9F3D-457C-B088-3A5042F75D52}") = "Dante", "Dante.pyproj", "{5E5BA753-ACEA-4DC7-912D-3CFCF80D955C}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{5E5BA753-ACEA-4DC7-912D-3CFCF80D955C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{5E5BA753-ACEA-4DC7-912D-3CFCF80D955C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {1D410C2F-2713-4E1C-AADF-650AB25B7904}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
@@ -0,0 +1,87 @@
|
||||
# Copyright © 2021 rdbende <rdbende@gmail.com>
|
||||
|
||||
source [file join [file dirname [info script]] theme light.tcl]
|
||||
source [file join [file dirname [info script]] theme dark.tcl]
|
||||
|
||||
option add *tearOff 0
|
||||
|
||||
proc set_theme {mode} {
|
||||
if {$mode == "dark"} {
|
||||
ttk::style theme use "azure-dark"
|
||||
|
||||
array set colors {
|
||||
-fg "#ffffff"
|
||||
-bg "#333333"
|
||||
-disabledfg "#ffffff"
|
||||
-disabledbg "#737373"
|
||||
-selectfg "#ffffff"
|
||||
-selectbg "#007fff"
|
||||
}
|
||||
|
||||
ttk::style configure . \
|
||||
-background $colors(-bg) \
|
||||
-foreground $colors(-fg) \
|
||||
-troughcolor $colors(-bg) \
|
||||
-focuscolor $colors(-selectbg) \
|
||||
-selectbackground $colors(-selectbg) \
|
||||
-selectforeground $colors(-selectfg) \
|
||||
-insertcolor $colors(-fg) \
|
||||
-insertwidth 1 \
|
||||
-fieldbackground $colors(-selectbg) \
|
||||
-font {"Segoe Ui" 10} \
|
||||
-borderwidth 1 \
|
||||
-relief flat
|
||||
|
||||
tk_setPalette background [ttk::style lookup . -background] \
|
||||
foreground [ttk::style lookup . -foreground] \
|
||||
highlightColor [ttk::style lookup . -focuscolor] \
|
||||
selectBackground [ttk::style lookup . -selectbackground] \
|
||||
selectForeground [ttk::style lookup . -selectforeground] \
|
||||
activeBackground [ttk::style lookup . -selectbackground] \
|
||||
activeForeground [ttk::style lookup . -selectforeground]
|
||||
|
||||
ttk::style map . -foreground [list disabled $colors(-disabledfg)]
|
||||
|
||||
option add *font [ttk::style lookup . -font]
|
||||
option add *Menu.selectcolor $colors(-fg)
|
||||
|
||||
} elseif {$mode == "light"} {
|
||||
ttk::style theme use "azure-light"
|
||||
|
||||
array set colors {
|
||||
-fg "#000000"
|
||||
-bg "#ffffff"
|
||||
-disabledfg "#737373"
|
||||
-disabledbg "#ffffff"
|
||||
-selectfg "#ffffff"
|
||||
-selectbg "#007fff"
|
||||
}
|
||||
|
||||
ttk::style configure . \
|
||||
-background $colors(-bg) \
|
||||
-foreground $colors(-fg) \
|
||||
-troughcolor $colors(-bg) \
|
||||
-focuscolor $colors(-selectbg) \
|
||||
-selectbackground $colors(-selectbg) \
|
||||
-selectforeground $colors(-selectfg) \
|
||||
-insertcolor $colors(-fg) \
|
||||
-insertwidth 1 \
|
||||
-fieldbackground $colors(-selectbg) \
|
||||
-font {"Segoe Ui" 10} \
|
||||
-borderwidth 1 \
|
||||
-relief flat
|
||||
|
||||
tk_setPalette background [ttk::style lookup . -background] \
|
||||
foreground [ttk::style lookup . -foreground] \
|
||||
highlightColor [ttk::style lookup . -focuscolor] \
|
||||
selectBackground [ttk::style lookup . -selectbackground] \
|
||||
selectForeground [ttk::style lookup . -selectforeground] \
|
||||
activeBackground [ttk::style lookup . -selectbackground] \
|
||||
activeForeground [ttk::style lookup . -selectforeground]
|
||||
|
||||
ttk::style map . -foreground [list disabled $colors(-disabledfg)]
|
||||
|
||||
option add *font [ttk::style lookup . -font]
|
||||
option add *Menu.selectcolor $colors(-fg)
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 1.5 MiB |
@@ -0,0 +1,537 @@
|
||||
# Copyright (c) 2021 rdbende <rdbende@gmail.com>
|
||||
|
||||
# The Azure theme is a beautiful modern ttk theme inspired by Microsoft's fluent design.
|
||||
|
||||
package require Tk 8.6
|
||||
|
||||
namespace eval ttk::theme::azure-dark {
|
||||
variable version 2.0
|
||||
package provide ttk::theme::azure-dark $version
|
||||
|
||||
ttk::style theme create azure-dark -parent clam -settings {
|
||||
proc load_images {imgdir} {
|
||||
variable I
|
||||
foreach file [glob -directory $imgdir *.png] {
|
||||
set img [file tail [file rootname $file]]
|
||||
set I($img) [image create photo -file $file -format png]
|
||||
}
|
||||
}
|
||||
|
||||
load_images [file join [file dirname [info script]] dark]
|
||||
|
||||
array set colors {
|
||||
-fg "#ffffff"
|
||||
-bg "#333333"
|
||||
-disabledfg "#ffffff"
|
||||
-disabledbg "#737373"
|
||||
-selectfg "#ffffff"
|
||||
-selectbg "#007fff"
|
||||
}
|
||||
|
||||
ttk::style layout TButton {
|
||||
Button.button -children {
|
||||
Button.padding -children {
|
||||
Button.label -side left -expand true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ttk::style layout Toolbutton {
|
||||
Toolbutton.button -children {
|
||||
Toolbutton.padding -children {
|
||||
Toolbutton.label -side left -expand true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ttk::style layout TMenubutton {
|
||||
Menubutton.button -children {
|
||||
Menubutton.padding -children {
|
||||
Menubutton.indicator -side right
|
||||
Menubutton.label -side right -expand true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ttk::style layout TOptionMenu {
|
||||
OptionMenu.button -children {
|
||||
OptionMenu.padding -children {
|
||||
OptionMenu.indicator -side right
|
||||
OptionMenu.label -side right -expand true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ttk::style layout Accent.TButton {
|
||||
AccentButton.button -children {
|
||||
AccentButton.padding -children {
|
||||
AccentButton.label -side left -expand true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ttk::style layout TCheckbutton {
|
||||
Checkbutton.button -children {
|
||||
Checkbutton.padding -children {
|
||||
Checkbutton.indicator -side left
|
||||
Checkbutton.label -side right -expand true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ttk::style layout Switch.TCheckbutton {
|
||||
Switch.button -children {
|
||||
Switch.padding -children {
|
||||
Switch.indicator -side left
|
||||
Switch.label -side right -expand true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ttk::style layout Toggle.TButton {
|
||||
ToggleButton.button -children {
|
||||
ToggleButton.padding -children {
|
||||
ToggleButton.label -side left -expand true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ttk::style layout TRadiobutton {
|
||||
Radiobutton.button -children {
|
||||
Radiobutton.padding -children {
|
||||
Radiobutton.indicator -side left
|
||||
Radiobutton.label -side right -expand true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ttk::style layout Vertical.TScrollbar {
|
||||
Vertical.Scrollbar.trough -sticky ns -children {
|
||||
Vertical.Scrollbar.thumb -expand true
|
||||
}
|
||||
}
|
||||
|
||||
ttk::style layout Horizontal.TScrollbar {
|
||||
Horizontal.Scrollbar.trough -sticky ew -children {
|
||||
Horizontal.Scrollbar.thumb -expand true
|
||||
}
|
||||
}
|
||||
|
||||
ttk::style layout TCombobox {
|
||||
Combobox.field -sticky nswe -children {
|
||||
Combobox.padding -expand true -sticky nswe -children {
|
||||
Combobox.textarea -sticky nswe
|
||||
}
|
||||
}
|
||||
Combobox.button -side right -sticky ns -children {
|
||||
Combobox.arrow -sticky nsew
|
||||
}
|
||||
}
|
||||
|
||||
ttk::style layout TSpinbox {
|
||||
Spinbox.field -sticky nsew -children {
|
||||
Spinbox.padding -expand true -sticky nswe -children {
|
||||
Spinbox.textarea -sticky nswe
|
||||
}
|
||||
|
||||
}
|
||||
Spinbox.button -side right -sticky ns -children {
|
||||
null -side right -children {
|
||||
Spinbox.uparrow -side top
|
||||
Spinbox.downarrow -side bottom
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ttk::style layout Horizontal.TSeparator {
|
||||
Horizontal.separator -sticky nswe
|
||||
}
|
||||
|
||||
ttk::style layout Vertical.TSeparator {
|
||||
Vertical.separator -sticky nswe
|
||||
}
|
||||
|
||||
ttk::style layout Horizontal.Tick.TScale {
|
||||
Horizontal.TickScale.trough -sticky ew -children {
|
||||
Horizontal.TickScale.slider -sticky w
|
||||
}
|
||||
}
|
||||
|
||||
ttk::style layout Vertical.Tick.TScale {
|
||||
Vertical.TickScale.trough -sticky ns -children {
|
||||
Vertical.TickScale.slider -sticky n
|
||||
}
|
||||
}
|
||||
|
||||
ttk::style layout Card.TFrame {
|
||||
Card.field {
|
||||
Card.padding -expand 1
|
||||
}
|
||||
}
|
||||
|
||||
ttk::style layout TLabelframe {
|
||||
Labelframe.border {
|
||||
Labelframe.padding -expand 1 -children {
|
||||
Labelframe.label -side right
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ttk::style layout TNotebook.Tab {
|
||||
Notebook.tab -children {
|
||||
Notebook.padding -side top -children {
|
||||
Notebook.label -side top -sticky {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ttk::style layout Treeview.Item {
|
||||
Treeitem.padding -sticky nswe -children {
|
||||
Treeitem.indicator -side left -sticky {}
|
||||
Treeitem.image -side left -sticky {}
|
||||
Treeitem.text -side left -sticky {}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
# Elements
|
||||
|
||||
# Button
|
||||
ttk::style configure TButton -padding {8 4 8 4} -width -10 -anchor center
|
||||
|
||||
ttk::style element create Button.button image \
|
||||
[list $I(rect-basic) \
|
||||
{selected disabled} $I(rect-basic) \
|
||||
disabled $I(rect-basic) \
|
||||
pressed $I(rect-basic) \
|
||||
selected $I(rect-basic) \
|
||||
active $I(button-hover) \
|
||||
] -border 4 -sticky ewns
|
||||
|
||||
# Toolbutton
|
||||
ttk::style configure Toolbutton -padding {8 4 8 4} -width -10 -anchor center
|
||||
|
||||
ttk::style element create Toolbutton.button image \
|
||||
[list $I(empty) \
|
||||
{selected disabled} $I(empty) \
|
||||
disabled $I(empty) \
|
||||
pressed $I(rect-basic) \
|
||||
selected $I(rect-basic) \
|
||||
active $I(rect-basic) \
|
||||
] -border 4 -sticky ewns
|
||||
|
||||
# Menubutton
|
||||
ttk::style configure TMenubutton -padding {8 4 4 4}
|
||||
|
||||
ttk::style element create Menubutton.button \
|
||||
image [list $I(rect-basic) \
|
||||
disabled $I(rect-basic) \
|
||||
pressed $I(rect-basic) \
|
||||
active $I(button-hover) \
|
||||
] -border 4 -sticky ewns
|
||||
|
||||
ttk::style element create Menubutton.indicator \
|
||||
image [list $I(down) \
|
||||
active $I(down) \
|
||||
pressed $I(down) \
|
||||
disabled $I(down) \
|
||||
] -width 15 -sticky e
|
||||
|
||||
# OptionMenu
|
||||
ttk::style configure TOptionMenu -padding {8 4 4 4}
|
||||
|
||||
ttk::style element create OptionMenu.button \
|
||||
image [list $I(rect-basic) \
|
||||
disabled $I(rect-basic) \
|
||||
pressed $I(rect-basic) \
|
||||
active $I(button-hover) \
|
||||
] -border 4 -sticky ewns
|
||||
|
||||
ttk::style element create OptionMenu.indicator \
|
||||
image [list $I(down) \
|
||||
active $I(down) \
|
||||
pressed $I(down) \
|
||||
disabled $I(down) \
|
||||
] -width 15 -sticky e
|
||||
|
||||
# AccentButton
|
||||
ttk::style configure Accent.TButton -padding {8 4 8 4} -width -10 -anchor center
|
||||
|
||||
ttk::style element create AccentButton.button image \
|
||||
[list $I(rect-accent) \
|
||||
{selected disabled} $I(rect-accent-hover) \
|
||||
disabled $I(rect-accent-hover) \
|
||||
pressed $I(rect-accent) \
|
||||
selected $I(rect-accent) \
|
||||
active $I(rect-accent-hover) \
|
||||
] -border 4 -sticky ewns
|
||||
|
||||
# Checkbutton
|
||||
ttk::style configure TCheckbutton -padding 4
|
||||
|
||||
ttk::style element create Checkbutton.indicator image \
|
||||
[list $I(box-basic) \
|
||||
{alternate disabled} $I(check-tri-basic) \
|
||||
{selected disabled} $I(check-basic) \
|
||||
disabled $I(box-basic) \
|
||||
{pressed alternate} $I(check-tri-hover) \
|
||||
{active alternate} $I(check-tri-hover) \
|
||||
alternate $I(check-tri-accent) \
|
||||
{pressed selected} $I(check-hover) \
|
||||
{active selected} $I(check-hover) \
|
||||
selected $I(check-accent) \
|
||||
{pressed !selected} $I(rect-hover) \
|
||||
active $I(box-hover) \
|
||||
] -width 26 -sticky w
|
||||
|
||||
# Switch
|
||||
ttk::style element create Switch.indicator image \
|
||||
[list $I(off-basic) \
|
||||
{selected disabled} $I(on-basic) \
|
||||
disabled $I(off-basic) \
|
||||
{pressed selected} $I(on-accent) \
|
||||
{active selected} $I(on-accent) \
|
||||
selected $I(on-accent) \
|
||||
{pressed !selected} $I(off-basic) \
|
||||
active $I(off-basic) \
|
||||
] -width 46 -sticky w
|
||||
|
||||
# ToggleButton
|
||||
ttk::style configure Toggle.TButton -padding {8 4 8 4} -width -10 -anchor center
|
||||
|
||||
ttk::style element create ToggleButton.button image \
|
||||
[list $I(rect-basic) \
|
||||
{selected disabled} $I(rect-accent-hover) \
|
||||
disabled $I(rect-basic) \
|
||||
{pressed selected} $I(rect-basic) \
|
||||
{active selected} $I(rect-accent) \
|
||||
selected $I(rect-accent) \
|
||||
{pressed !selected} $I(rect-accent) \
|
||||
active $I(rect-basic) \
|
||||
] -border 4 -sticky ewns
|
||||
|
||||
# Radiobutton
|
||||
ttk::style configure TRadiobutton -padding 4
|
||||
|
||||
ttk::style element create Radiobutton.indicator image \
|
||||
[list $I(outline-basic) \
|
||||
{alternate disabled} $I(radio-tri-basic) \
|
||||
{selected disabled} $I(radio-basic) \
|
||||
disabled $I(outline-basic) \
|
||||
{pressed alternate} $I(radio-tri-hover) \
|
||||
{active alternate} $I(radio-tri-hover) \
|
||||
alternate $I(radio-tri-accent) \
|
||||
{pressed selected} $I(radio-hover) \
|
||||
{active selected} $I(radio-hover) \
|
||||
selected $I(radio-accent) \
|
||||
{pressed !selected} $I(circle-hover) \
|
||||
active $I(outline-hover) \
|
||||
] -width 26 -sticky w
|
||||
|
||||
# Scrollbar
|
||||
ttk::style element create Horizontal.Scrollbar.trough image $I(hor-basic) \
|
||||
-sticky ew
|
||||
|
||||
ttk::style element create Horizontal.Scrollbar.thumb \
|
||||
image [list $I(hor-accent) \
|
||||
disabled $I(hor-basic) \
|
||||
pressed $I(hor-hover) \
|
||||
active $I(hor-hover) \
|
||||
] -sticky ew
|
||||
|
||||
ttk::style element create Vertical.Scrollbar.trough image $I(vert-basic) \
|
||||
-sticky ns
|
||||
|
||||
ttk::style element create Vertical.Scrollbar.thumb \
|
||||
image [list $I(vert-accent) \
|
||||
disabled $I(vert-basic) \
|
||||
pressed $I(vert-hover) \
|
||||
active $I(vert-hover) \
|
||||
] -sticky ns
|
||||
|
||||
# Scale
|
||||
ttk::style element create Horizontal.Scale.trough image $I(scale-hor) \
|
||||
-border 5 -padding 0
|
||||
|
||||
ttk::style element create Horizontal.Scale.slider \
|
||||
image [list $I(circle-accent) \
|
||||
disabled $I(circle-basic) \
|
||||
pressed $I(circle-hover) \
|
||||
active $I(circle-hover) \
|
||||
] -sticky {}
|
||||
|
||||
ttk::style element create Vertical.Scale.trough image $I(scale-vert) \
|
||||
-border 5 -padding 0
|
||||
|
||||
ttk::style element create Vertical.Scale.slider \
|
||||
image [list $I(circle-accent) \
|
||||
disabled $I(circle-basic) \
|
||||
pressed $I(circle-hover) \
|
||||
active $I(circle-hover) \
|
||||
] -sticky {}
|
||||
|
||||
# Tickscale
|
||||
ttk::style element create Horizontal.TickScale.trough image $I(scale-hor) \
|
||||
-border 5 -padding 0
|
||||
|
||||
ttk::style element create Horizontal.TickScale.slider \
|
||||
image [list $I(tick-hor-accent) \
|
||||
disabled $I(tick-hor-basic) \
|
||||
pressed $I(tick-hor-hover) \
|
||||
active $I(tick-hor-hover) \
|
||||
] -sticky {}
|
||||
|
||||
ttk::style element create Vertical.TickScale.trough image $I(scale-vert) \
|
||||
-border 5 -padding 0
|
||||
|
||||
ttk::style element create Vertical.TickScale.slider \
|
||||
image [list $I(tick-vert-accent) \
|
||||
disabled $I(tick-vert-basic) \
|
||||
pressed $I(tick-vert-hover) \
|
||||
active $I(tick-vert-hover) \
|
||||
] -sticky {}
|
||||
|
||||
# Progressbar
|
||||
ttk::style element create Horizontal.Progressbar.trough image $I(hor-basic) \
|
||||
-sticky ew
|
||||
|
||||
ttk::style element create Horizontal.Progressbar.pbar image $I(hor-accent) \
|
||||
-sticky ew
|
||||
|
||||
ttk::style element create Vertical.Progressbar.trough image $I(vert-basic) \
|
||||
-sticky ns
|
||||
|
||||
ttk::style element create Vertical.Progressbar.pbar image $I(vert-accent) \
|
||||
-sticky ns
|
||||
|
||||
# Entry
|
||||
ttk::style element create Entry.field \
|
||||
image [list $I(box-basic) \
|
||||
{focus hover} $I(box-accent) \
|
||||
invalid $I(box-invalid) \
|
||||
disabled $I(box-basic) \
|
||||
focus $I(box-accent) \
|
||||
hover $I(box-hover) \
|
||||
] -border 5 -padding {8} -sticky news
|
||||
|
||||
# Combobox
|
||||
ttk::style map TCombobox -selectbackground [list \
|
||||
{!focus} $colors(-selectbg) \
|
||||
{readonly hover} $colors(-selectbg) \
|
||||
{readonly focus} $colors(-selectbg) \
|
||||
]
|
||||
|
||||
ttk::style map TCombobox -selectforeground [list \
|
||||
{!focus} $colors(-selectfg) \
|
||||
{readonly hover} $colors(-selectfg) \
|
||||
{readonly focus} $colors(-selectfg) \
|
||||
]
|
||||
|
||||
ttk::style element create Combobox.field \
|
||||
image [list $I(box-basic) \
|
||||
{readonly disabled} $I(rect-basic) \
|
||||
{readonly pressed} $I(rect-basic) \
|
||||
{readonly focus hover} $I(button-hover) \
|
||||
{readonly focus} $I(button-hover) \
|
||||
{readonly hover} $I(button-hover) \
|
||||
{focus hover} $I(box-accent) \
|
||||
readonly $I(rect-basic) \
|
||||
invalid $I(box-invalid) \
|
||||
disabled $I(box-basic) \
|
||||
focus $I(box-accent) \
|
||||
hover $I(box-hover) \
|
||||
] -border 5 -padding {8}
|
||||
|
||||
ttk::style element create Combobox.button \
|
||||
image [list $I(combo-button-basic) \
|
||||
{!readonly focus} $I(combo-button-focus) \
|
||||
{readonly focus} $I(combo-button-hover) \
|
||||
{readonly hover} $I(combo-button-hover)
|
||||
] -border 5 -padding {2 6 6 6}
|
||||
|
||||
ttk::style element create Combobox.arrow image $I(down) \
|
||||
-width 15 -sticky e
|
||||
|
||||
# Spinbox
|
||||
ttk::style element create Spinbox.field \
|
||||
image [list $I(box-basic) \
|
||||
invalid $I(box-invalid) \
|
||||
disabled $I(box-basic) \
|
||||
focus $I(box-accent) \
|
||||
hover $I(box-hover) \
|
||||
] -border 5 -padding {8} -sticky news
|
||||
|
||||
ttk::style element create Spinbox.uparrow \
|
||||
image [list $I(up) \
|
||||
disabled $I(up) \
|
||||
pressed $I(up-accent) \
|
||||
active $I(up-accent) \
|
||||
] -border 4 -width 15 -sticky e
|
||||
|
||||
ttk::style element create Spinbox.downarrow \
|
||||
image [list $I(down) \
|
||||
disabled $I(down) \
|
||||
pressed $I(down-accent) \
|
||||
active $I(down-accent) \
|
||||
] -border 4 -width 15 -sticky e
|
||||
|
||||
ttk::style element create Spinbox.button \
|
||||
image [list $I(combo-button-basic) \
|
||||
{!readonly focus} $I(combo-button-focus) \
|
||||
{readonly focus} $I(combo-button-hover) \
|
||||
{readonly hover} $I(combo-button-hover)
|
||||
] -border 5 -padding {2 6 6 6}
|
||||
|
||||
# Sizegrip
|
||||
ttk::style element create Sizegrip.sizegrip image $I(size) \
|
||||
-sticky ewns
|
||||
|
||||
# Separator
|
||||
ttk::style element create Horizontal.separator image $I(separator)
|
||||
|
||||
ttk::style element create Vertical.separator image $I(separator)
|
||||
|
||||
# Card
|
||||
ttk::style element create Card.field image $I(card) \
|
||||
-border 10 -padding 4 -sticky news
|
||||
|
||||
# Labelframe
|
||||
ttk::style element create Labelframe.border image $I(card) \
|
||||
-border 5 -padding 4 -sticky news
|
||||
|
||||
# Notebook
|
||||
ttk::style element create Notebook.client \
|
||||
image $I(notebook) -border 5
|
||||
|
||||
ttk::style element create Notebook.tab \
|
||||
image [list $I(tab-disabled) \
|
||||
selected $I(tab-basic) \
|
||||
active $I(tab-hover) \
|
||||
] -border 5 -padding {14 4}
|
||||
|
||||
# Treeview
|
||||
ttk::style element create Treeview.field image $I(card) \
|
||||
-border 5
|
||||
|
||||
ttk::style element create Treeheading.cell \
|
||||
image [list $I(tree-basic) \
|
||||
pressed $I(tree-pressed)
|
||||
] -border 5 -padding 4 -sticky ewns
|
||||
|
||||
ttk::style element create Treeitem.indicator \
|
||||
image [list $I(right) \
|
||||
user2 $I(empty) \
|
||||
user1 $I(down) \
|
||||
] -width 26 -sticky {}
|
||||
|
||||
ttk::style configure Treeview -background $colors(-bg)
|
||||
ttk::style configure Treeview.Item -padding {2 0 0 0}
|
||||
ttk::style map Treeview \
|
||||
-background [list selected $colors(-selectbg)] \
|
||||
-foreground [list selected $colors(-selectfg)]
|
||||
|
||||
# Panedwindow
|
||||
# Insane hack to remove clam's ugly sash
|
||||
ttk::style configure Sash -gripcount 0
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 424 B |
|
After Width: | Height: | Size: 330 B |
|
After Width: | Height: | Size: 357 B |
|
After Width: | Height: | Size: 405 B |
|
After Width: | Height: | Size: 346 B |
|
After Width: | Height: | Size: 457 B |
|
After Width: | Height: | Size: 482 B |
|
After Width: | Height: | Size: 423 B |
|
After Width: | Height: | Size: 453 B |
|
After Width: | Height: | Size: 346 B |
|
After Width: | Height: | Size: 310 B |
|
After Width: | Height: | Size: 326 B |
|
After Width: | Height: | Size: 484 B |
|
After Width: | Height: | Size: 437 B |
|
After Width: | Height: | Size: 470 B |
|
After Width: | Height: | Size: 242 B |
|
After Width: | Height: | Size: 248 B |
|
After Width: | Height: | Size: 297 B |
|
After Width: | Height: | Size: 234 B |
|
After Width: | Height: | Size: 261 B |
|
After Width: | Height: | Size: 130 B |
|
After Width: | Height: | Size: 154 B |
|
After Width: | Height: | Size: 156 B |
|
After Width: | Height: | Size: 154 B |
|
After Width: | Height: | Size: 410 B |
|
After Width: | Height: | Size: 677 B |
|
After Width: | Height: | Size: 736 B |
|
After Width: | Height: | Size: 668 B |
|
After Width: | Height: | Size: 587 B |
|
After Width: | Height: | Size: 644 B |
|
After Width: | Height: | Size: 629 B |
|
After Width: | Height: | Size: 561 B |
|
After Width: | Height: | Size: 625 B |
|
After Width: | Height: | Size: 524 B |
|
After Width: | Height: | Size: 505 B |
|
After Width: | Height: | Size: 466 B |
|
After Width: | Height: | Size: 289 B |
|
After Width: | Height: | Size: 319 B |
|
After Width: | Height: | Size: 286 B |
|
After Width: | Height: | Size: 297 B |
|
After Width: | Height: | Size: 255 B |
|
After Width: | Height: | Size: 161 B |
|
After Width: | Height: | Size: 161 B |
|
After Width: | Height: | Size: 128 B |
|
After Width: | Height: | Size: 477 B |
|
After Width: | Height: | Size: 249 B |
|
After Width: | Height: | Size: 234 B |
|
After Width: | Height: | Size: 260 B |
|
After Width: | Height: | Size: 302 B |
|
After Width: | Height: | Size: 267 B |
|
After Width: | Height: | Size: 280 B |
|
After Width: | Height: | Size: 295 B |
|
After Width: | Height: | Size: 257 B |
|
After Width: | Height: | Size: 277 B |
|
After Width: | Height: | Size: 149 B |
|
After Width: | Height: | Size: 168 B |
|
After Width: | Height: | Size: 242 B |
|
After Width: | Height: | Size: 271 B |
|
After Width: | Height: | Size: 158 B |
|
After Width: | Height: | Size: 158 B |
|
After Width: | Height: | Size: 158 B |
@@ -0,0 +1,537 @@
|
||||
# Copyright (c) 2021 rdbende <rdbende@gmail.com>
|
||||
|
||||
# The Azure theme is a beautiful modern ttk theme inspired by Microsoft's fluent design.
|
||||
|
||||
package require Tk 8.6
|
||||
|
||||
namespace eval ttk::theme::azure-light {
|
||||
variable version 2.0
|
||||
package provide ttk::theme::azure-light $version
|
||||
|
||||
ttk::style theme create azure-light -parent clam -settings {
|
||||
proc load_images {imgdir} {
|
||||
variable I
|
||||
foreach file [glob -directory $imgdir *.png] {
|
||||
set img [file tail [file rootname $file]]
|
||||
set I($img) [image create photo -file $file -format png]
|
||||
}
|
||||
}
|
||||
|
||||
load_images [file join [file dirname [info script]] light]
|
||||
|
||||
array set colors {
|
||||
-fg "#000000"
|
||||
-bg "#ffffff"
|
||||
-disabledfg "#737373"
|
||||
-disabledbg "#ffffff"
|
||||
-selectfg "#ffffff"
|
||||
-selectbg "#007fff"
|
||||
}
|
||||
|
||||
ttk::style layout TButton {
|
||||
Button.button -children {
|
||||
Button.padding -children {
|
||||
Button.label -side left -expand true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ttk::style layout Toolbutton {
|
||||
Toolbutton.button -children {
|
||||
Toolbutton.padding -children {
|
||||
Toolbutton.label -side left -expand true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ttk::style layout TMenubutton {
|
||||
Menubutton.button -children {
|
||||
Menubutton.padding -children {
|
||||
Menubutton.indicator -side right
|
||||
Menubutton.label -side right -expand true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ttk::style layout TOptionMenu {
|
||||
OptionMenu.button -children {
|
||||
OptionMenu.padding -children {
|
||||
OptionMenu.indicator -side right
|
||||
OptionMenu.label -side right -expand true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ttk::style layout Accent.TButton {
|
||||
AccentButton.button -children {
|
||||
AccentButton.padding -children {
|
||||
AccentButton.label -side left -expand true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ttk::style layout TCheckbutton {
|
||||
Checkbutton.button -children {
|
||||
Checkbutton.padding -children {
|
||||
Checkbutton.indicator -side left
|
||||
Checkbutton.label -side right -expand true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ttk::style layout Switch.TCheckbutton {
|
||||
Switch.button -children {
|
||||
Switch.padding -children {
|
||||
Switch.indicator -side left
|
||||
Switch.label -side right -expand true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ttk::style layout Toggle.TButton {
|
||||
ToggleButton.button -children {
|
||||
ToggleButton.padding -children {
|
||||
ToggleButton.label -side left -expand true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ttk::style layout TRadiobutton {
|
||||
Radiobutton.button -children {
|
||||
Radiobutton.padding -children {
|
||||
Radiobutton.indicator -side left
|
||||
Radiobutton.label -side right -expand true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ttk::style layout Vertical.TScrollbar {
|
||||
Vertical.Scrollbar.trough -sticky ns -children {
|
||||
Vertical.Scrollbar.thumb -expand true
|
||||
}
|
||||
}
|
||||
|
||||
ttk::style layout Horizontal.TScrollbar {
|
||||
Horizontal.Scrollbar.trough -sticky ew -children {
|
||||
Horizontal.Scrollbar.thumb -expand true
|
||||
}
|
||||
}
|
||||
|
||||
ttk::style layout TCombobox {
|
||||
Combobox.field -sticky nswe -children {
|
||||
Combobox.padding -expand true -sticky nswe -children {
|
||||
Combobox.textarea -sticky nswe
|
||||
}
|
||||
}
|
||||
Combobox.button -side right -sticky ns -children {
|
||||
Combobox.arrow -sticky nsew
|
||||
}
|
||||
}
|
||||
|
||||
ttk::style layout TSpinbox {
|
||||
Spinbox.field -sticky nsew -children {
|
||||
Spinbox.padding -expand true -sticky nswe -children {
|
||||
Spinbox.textarea -sticky nswe
|
||||
}
|
||||
|
||||
}
|
||||
Spinbox.button -side right -sticky ns -children {
|
||||
null -side right -children {
|
||||
Spinbox.uparrow -side top
|
||||
Spinbox.downarrow -side bottom
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ttk::style layout Horizontal.TSeparator {
|
||||
Horizontal.separator -sticky nswe
|
||||
}
|
||||
|
||||
ttk::style layout Vertical.TSeparator {
|
||||
Vertical.separator -sticky nswe
|
||||
}
|
||||
|
||||
ttk::style layout Horizontal.Tick.TScale {
|
||||
Horizontal.TickScale.trough -sticky ew -children {
|
||||
Horizontal.TickScale.slider -sticky w
|
||||
}
|
||||
}
|
||||
|
||||
ttk::style layout Vertical.Tick.TScale {
|
||||
Vertical.TickScale.trough -sticky ns -children {
|
||||
Vertical.TickScale.slider -sticky n
|
||||
}
|
||||
}
|
||||
|
||||
ttk::style layout Card.TFrame {
|
||||
Card.field {
|
||||
Card.padding -expand 1
|
||||
}
|
||||
}
|
||||
|
||||
ttk::style layout TLabelframe {
|
||||
Labelframe.border {
|
||||
Labelframe.padding -expand 1 -children {
|
||||
Labelframe.label -side right
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ttk::style layout TNotebook.Tab {
|
||||
Notebook.tab -children {
|
||||
Notebook.padding -side top -children {
|
||||
Notebook.label -side top -sticky {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ttk::style layout Treeview.Item {
|
||||
Treeitem.padding -sticky nswe -children {
|
||||
Treeitem.indicator -side left -sticky {}
|
||||
Treeitem.image -side left -sticky {}
|
||||
Treeitem.text -side left -sticky {}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
# Elements
|
||||
|
||||
# Button
|
||||
ttk::style configure TButton -padding {8 4 8 4} -width -10 -anchor center
|
||||
|
||||
ttk::style element create Button.button image \
|
||||
[list $I(rect-basic) \
|
||||
{selected disabled} $I(rect-basic) \
|
||||
disabled $I(rect-basic) \
|
||||
selected $I(rect-basic) \
|
||||
pressed $I(rect-basic) \
|
||||
active $I(button-hover) \
|
||||
] -border 4 -sticky ewns
|
||||
|
||||
# Toolbutton
|
||||
ttk::style configure Toolbutton -padding {8 4 8 4} -width -10 -anchor center
|
||||
|
||||
ttk::style element create Toolbutton.button image \
|
||||
[list $I(empty) \
|
||||
{selected disabled} $I(empty) \
|
||||
disabled $I(empty) \
|
||||
selected $I(rect-basic) \
|
||||
pressed $I(rect-basic) \
|
||||
active $I(rect-basic) \
|
||||
] -border 4 -sticky ewns
|
||||
|
||||
# Menubutton
|
||||
ttk::style configure TMenubutton -padding {8 4 4 4}
|
||||
|
||||
ttk::style element create Menubutton.button \
|
||||
image [list $I(rect-basic) \
|
||||
disabled $I(rect-basic) \
|
||||
pressed $I(rect-basic) \
|
||||
active $I(button-hover) \
|
||||
] -border 4 -sticky ewns
|
||||
|
||||
ttk::style element create Menubutton.indicator \
|
||||
image [list $I(down) \
|
||||
active $I(down) \
|
||||
pressed $I(down) \
|
||||
disabled $I(down) \
|
||||
] -width 15 -sticky e
|
||||
|
||||
# OptionMenu
|
||||
ttk::style configure TOptionMenu -padding {8 4 4 4}
|
||||
|
||||
ttk::style element create OptionMenu.button \
|
||||
image [list $I(rect-basic) \
|
||||
disabled $I(rect-basic) \
|
||||
pressed $I(rect-basic) \
|
||||
active $I(button-hover) \
|
||||
] -border 4 -sticky ewns
|
||||
|
||||
ttk::style element create OptionMenu.indicator \
|
||||
image [list $I(down) \
|
||||
active $I(down) \
|
||||
pressed $I(down) \
|
||||
disabled $I(down) \
|
||||
] -width 15 -sticky e
|
||||
|
||||
# AccentButton
|
||||
ttk::style configure Accent.TButton -padding {8 4 8 4} -width -10 -anchor center
|
||||
|
||||
ttk::style element create AccentButton.button image \
|
||||
[list $I(rect-accent) \
|
||||
{selected disabled} $I(rect-accent-hover) \
|
||||
disabled $I(rect-accent-hover) \
|
||||
selected $I(rect-accent) \
|
||||
pressed $I(rect-accent) \
|
||||
active $I(rect-accent-hover) \
|
||||
] -border 4 -sticky ewns
|
||||
|
||||
# Checkbutton
|
||||
ttk::style configure TCheckbutton -padding 4
|
||||
|
||||
ttk::style element create Checkbutton.indicator image \
|
||||
[list $I(box-basic) \
|
||||
{alternate disabled} $I(check-tri-basic) \
|
||||
{selected disabled} $I(check-basic) \
|
||||
disabled $I(box-basic) \
|
||||
{pressed alternate} $I(check-tri-hover) \
|
||||
{active alternate} $I(check-tri-hover) \
|
||||
alternate $I(check-tri-accent) \
|
||||
{pressed selected} $I(check-hover) \
|
||||
{active selected} $I(check-hover) \
|
||||
selected $I(check-accent) \
|
||||
{pressed !selected} $I(rect-hover) \
|
||||
active $I(box-hover) \
|
||||
] -width 26 -sticky w
|
||||
|
||||
# Switch
|
||||
ttk::style element create Switch.indicator image \
|
||||
[list $I(off-basic) \
|
||||
{selected disabled} $I(on-basic) \
|
||||
disabled $I(off-basic) \
|
||||
{pressed selected} $I(on-hover) \
|
||||
{active selected} $I(on-hover) \
|
||||
selected $I(on-accent) \
|
||||
{pressed !selected} $I(off-hover) \
|
||||
active $I(off-hover) \
|
||||
] -width 46 -sticky w
|
||||
|
||||
# ToggleButton
|
||||
ttk::style configure Toggle.TButton -padding {8 4 8 4} -width -10 -anchor center
|
||||
|
||||
ttk::style element create ToggleButton.button image \
|
||||
[list $I(rect-basic) \
|
||||
{selected disabled} $I(rect-accent-hover) \
|
||||
disabled $I(rect-basic) \
|
||||
{pressed selected} $I(rect-basic) \
|
||||
{active selected} $I(rect-accent) \
|
||||
selected $I(rect-accent) \
|
||||
{pressed !selected} $I(rect-accent) \
|
||||
active $I(rect-basic) \
|
||||
] -border 4 -sticky ewns
|
||||
|
||||
# Radiobutton
|
||||
ttk::style configure TRadiobutton -padding 4
|
||||
|
||||
ttk::style element create Radiobutton.indicator image \
|
||||
[list $I(outline-basic) \
|
||||
{alternate disabled} $I(radio-tri-basic) \
|
||||
{selected disabled} $I(radio-basic) \
|
||||
disabled $I(outline-basic) \
|
||||
{pressed alternate} $I(radio-tri-hover) \
|
||||
{active alternate} $I(radio-tri-hover) \
|
||||
alternate $I(radio-tri-accent) \
|
||||
{pressed selected} $I(radio-hover) \
|
||||
{active selected} $I(radio-hover) \
|
||||
selected $I(radio-accent) \
|
||||
{pressed !selected} $I(circle-hover) \
|
||||
active $I(outline-hover) \
|
||||
] -width 26 -sticky w
|
||||
|
||||
# Scrollbar
|
||||
ttk::style element create Horizontal.Scrollbar.trough image $I(hor-basic) \
|
||||
-sticky ew
|
||||
|
||||
ttk::style element create Horizontal.Scrollbar.thumb \
|
||||
image [list $I(hor-accent) \
|
||||
disabled $I(hor-basic) \
|
||||
pressed $I(hor-hover) \
|
||||
active $I(hor-hover) \
|
||||
] -sticky ew
|
||||
|
||||
ttk::style element create Vertical.Scrollbar.trough image $I(vert-basic) \
|
||||
-sticky ns
|
||||
|
||||
ttk::style element create Vertical.Scrollbar.thumb \
|
||||
image [list $I(vert-accent) \
|
||||
disabled $I(vert-basic) \
|
||||
pressed $I(vert-hover) \
|
||||
active $I(vert-hover) \
|
||||
] -sticky ns
|
||||
|
||||
# Scale
|
||||
ttk::style element create Horizontal.Scale.trough image $I(scale-hor) \
|
||||
-border 5 -padding 0
|
||||
|
||||
ttk::style element create Horizontal.Scale.slider \
|
||||
image [list $I(circle-accent) \
|
||||
disabled $I(circle-basic) \
|
||||
pressed $I(circle-hover) \
|
||||
active $I(circle-hover) \
|
||||
] -sticky {}
|
||||
|
||||
ttk::style element create Vertical.Scale.trough image $I(scale-vert) \
|
||||
-border 5 -padding 0
|
||||
|
||||
ttk::style element create Vertical.Scale.slider \
|
||||
image [list $I(circle-accent) \
|
||||
disabled $I(circle-basic) \
|
||||
pressed $I(circle-hover) \
|
||||
active $I(circle-hover) \
|
||||
] -sticky {}
|
||||
|
||||
# Tickscale
|
||||
ttk::style element create Horizontal.TickScale.trough image $I(scale-hor) \
|
||||
-border 5 -padding 0
|
||||
|
||||
ttk::style element create Horizontal.TickScale.slider \
|
||||
image [list $I(tick-hor-accent) \
|
||||
disabled $I(tick-hor-basic) \
|
||||
pressed $I(tick-hor-hover) \
|
||||
active $I(tick-hor-hover) \
|
||||
] -sticky {}
|
||||
|
||||
ttk::style element create Vertical.TickScale.trough image $I(scale-vert) \
|
||||
-border 5 -padding 0
|
||||
|
||||
ttk::style element create Vertical.TickScale.slider \
|
||||
image [list $I(tick-vert-accent) \
|
||||
disabled $I(tick-vert-basic) \
|
||||
pressed $I(tick-vert-hover) \
|
||||
active $I(tick-vert-hover) \
|
||||
] -sticky {}
|
||||
|
||||
# Progressbar
|
||||
ttk::style element create Horizontal.Progressbar.trough image $I(hor-basic) \
|
||||
-sticky ew
|
||||
|
||||
ttk::style element create Horizontal.Progressbar.pbar image $I(hor-accent) \
|
||||
-sticky ew
|
||||
|
||||
ttk::style element create Vertical.Progressbar.trough image $I(vert-basic) \
|
||||
-sticky ns
|
||||
|
||||
ttk::style element create Vertical.Progressbar.pbar image $I(vert-accent) \
|
||||
-sticky ns
|
||||
|
||||
# Entry
|
||||
ttk::style element create Entry.field \
|
||||
image [list $I(box-basic) \
|
||||
{focus hover} $I(box-accent) \
|
||||
invalid $I(box-invalid) \
|
||||
disabled $I(box-basic) \
|
||||
focus $I(box-accent) \
|
||||
hover $I(box-hover) \
|
||||
] -border 5 -padding {8} -sticky news
|
||||
|
||||
# Combobox
|
||||
ttk::style map TCombobox -selectbackground [list \
|
||||
{!focus} $colors(-selectbg) \
|
||||
{readonly hover} $colors(-selectbg) \
|
||||
{readonly focus} $colors(-selectbg) \
|
||||
]
|
||||
|
||||
ttk::style map TCombobox -selectforeground [list \
|
||||
{!focus} $colors(-selectfg) \
|
||||
{readonly hover} $colors(-selectfg) \
|
||||
{readonly focus} $colors(-selectfg) \
|
||||
]
|
||||
|
||||
ttk::style element create Combobox.field \
|
||||
image [list $I(box-basic) \
|
||||
{readonly disabled} $I(rect-basic) \
|
||||
{readonly pressed} $I(rect-basic) \
|
||||
{readonly focus hover} $I(button-hover) \
|
||||
{readonly focus} $I(button-hover) \
|
||||
{readonly hover} $I(button-hover) \
|
||||
{focus hover} $I(box-accent) \
|
||||
readonly $I(rect-basic) \
|
||||
invalid $I(box-invalid) \
|
||||
disabled $I(box-basic) \
|
||||
focus $I(box-accent) \
|
||||
hover $I(box-hover) \
|
||||
] -border 5 -padding {8}
|
||||
|
||||
ttk::style element create Combobox.button \
|
||||
image [list $I(combo-button-basic) \
|
||||
{!readonly focus} $I(combo-button-focus) \
|
||||
{readonly focus} $I(combo-button-hover) \
|
||||
{readonly hover} $I(combo-button-hover)
|
||||
] -border 5 -padding {2 6 6 6}
|
||||
|
||||
ttk::style element create Combobox.arrow image $I(down) \
|
||||
-width 15 -sticky e
|
||||
|
||||
# Spinbox
|
||||
ttk::style element create Spinbox.field \
|
||||
image [list $I(box-basic) \
|
||||
invalid $I(box-invalid) \
|
||||
disabled $I(box-basic) \
|
||||
focus $I(box-accent) \
|
||||
hover $I(box-hover) \
|
||||
] -border 5 -padding {8} -sticky news
|
||||
|
||||
ttk::style element create Spinbox.uparrow \
|
||||
image [list $I(up) \
|
||||
disabled $I(up) \
|
||||
pressed $I(up-accent) \
|
||||
active $I(up-accent) \
|
||||
] -border 4 -width 15 -sticky e
|
||||
|
||||
ttk::style element create Spinbox.downarrow \
|
||||
image [list $I(down) \
|
||||
disabled $I(down) \
|
||||
pressed $I(down-accent) \
|
||||
active $I(down-accent) \
|
||||
] -border 4 -width 15 -sticky e
|
||||
|
||||
ttk::style element create Spinbox.button \
|
||||
image [list $I(combo-button-basic) \
|
||||
{!readonly focus} $I(combo-button-focus) \
|
||||
{readonly focus} $I(combo-button-hover) \
|
||||
{readonly hover} $I(combo-button-hover)
|
||||
] -border 5 -padding {2 6 6 6}
|
||||
|
||||
# Sizegrip
|
||||
ttk::style element create Sizegrip.sizegrip image $I(size) \
|
||||
-sticky ewns
|
||||
|
||||
# Separator
|
||||
ttk::style element create Horizontal.separator image $I(separator)
|
||||
|
||||
ttk::style element create Vertical.separator image $I(separator)
|
||||
|
||||
# Card
|
||||
ttk::style element create Card.field image $I(card) \
|
||||
-border 10 -padding 4 -sticky news
|
||||
|
||||
# Labelframe
|
||||
ttk::style element create Labelframe.border image $I(card) \
|
||||
-border 5 -padding 4 -sticky news
|
||||
|
||||
# Notebook
|
||||
ttk::style element create Notebook.client \
|
||||
image $I(notebook) -border 5
|
||||
|
||||
ttk::style element create Notebook.tab \
|
||||
image [list $I(tab-disabled) \
|
||||
selected $I(tab-basic) \
|
||||
active $I(tab-hover) \
|
||||
] -border 5 -padding {14 4}
|
||||
|
||||
# Treeview
|
||||
ttk::style element create Treeview.field image $I(card) \
|
||||
-border 5
|
||||
|
||||
ttk::style element create Treeheading.cell \
|
||||
image [list $I(tree-basic) \
|
||||
pressed $I(tree-pressed)
|
||||
] -border 5 -padding 4 -sticky ewns
|
||||
|
||||
ttk::style element create Treeitem.indicator \
|
||||
image [list $I(right) \
|
||||
user2 $I(empty) \
|
||||
user1 $I(down) \
|
||||
] -width 26 -sticky {}
|
||||
|
||||
ttk::style configure Treeview -background $colors(-bg)
|
||||
ttk::style configure Treeview.Item -padding {2 0 0 0}
|
||||
ttk::style map Treeview \
|
||||
-background [list selected #ccc] \
|
||||
-foreground [list selected $colors(-fg)]
|
||||
|
||||
# Panedwindow
|
||||
# Insane hack to remove clam's ugly sash
|
||||
ttk::style configure Sash -gripcount 0
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 346 B |
|
After Width: | Height: | Size: 319 B |
|
After Width: | Height: | Size: 329 B |
|
After Width: | Height: | Size: 285 B |
|
After Width: | Height: | Size: 326 B |
|
After Width: | Height: | Size: 444 B |
|
After Width: | Height: | Size: 442 B |
|
After Width: | Height: | Size: 390 B |
|
After Width: | Height: | Size: 451 B |
|
After Width: | Height: | Size: 314 B |
|
After Width: | Height: | Size: 281 B |
|
After Width: | Height: | Size: 319 B |
|
After Width: | Height: | Size: 440 B |
|
After Width: | Height: | Size: 128 B |
|
After Width: | Height: | Size: 429 B |
|
After Width: | Height: | Size: 247 B |
|
After Width: | Height: | Size: 254 B |
|
After Width: | Height: | Size: 299 B |
|
After Width: | Height: | Size: 234 B |
|
After Width: | Height: | Size: 271 B |
|
After Width: | Height: | Size: 130 B |
|
After Width: | Height: | Size: 153 B |
|
After Width: | Height: | Size: 157 B |
|
After Width: | Height: | Size: 154 B |
|
After Width: | Height: | Size: 389 B |
|
After Width: | Height: | Size: 547 B |