ttk.Style() wirkungslos bei ttk.Entries/ttk.Comboboxes
Verfasst: Montag 9. November 2015, 23:37
Hallo zusammen,
mal wieder ne Frage in Tkinter: Ich habe ein kleines Testfenster programmiert, um dem Styling mit ``ttk.Style()`` näher zu kommen. Daher wollte ich verschiedene Stylings beim Klicken auf einen Radiobutton aktivieren. Nur leider ändert sich das Design nur bei den Labels?
Warum aber ändert sich bei den Entries/Comboboxes nichts, wenn man auf den zweiten Stylingbutton klickt?
Hier der Code:
mal wieder ne Frage in Tkinter: Ich habe ein kleines Testfenster programmiert, um dem Styling mit ``ttk.Style()`` näher zu kommen. Daher wollte ich verschiedene Stylings beim Klicken auf einen Radiobutton aktivieren. Nur leider ändert sich das Design nur bei den Labels?
Warum aber ändert sich bei den Entries/Comboboxes nichts, wenn man auf den zweiten Stylingbutton klickt?
Hier der Code:
Code: Alles auswählen
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk
from tkinter import ttk
from collections import OrderedDict
import os
NL = os.linesep
class App(ttk.Frame):
def __init__(self, master, **kwargs):
ttk.Frame.__init__(self, master, **kwargs)
self.winfo_toplevel().title("Styling in ttk")
# style names : widget1.entry.app.TEntry
self.widgetstyleformat = "widget{}.{}.app.T{}"
self._actual = tk.StringVar()
self._info = tk.StringVar()
self.widgetclasses = OrderedDict()
self.widgetclasses["Label"] = ttk.Label
self.widgetclasses["Entry"] = ttk.Entry
self.widgetclasses["Combobox"] = ttk.Combobox
self.widgetcounter = 4
self.row = 0
self._setup_styler()
self._setup_infolabel()
self._setup_widgetframes()
def _setup_infolabel(self):
tk.Label(self,
textvariable=self._info,
height=12,
relief="groove",
bd=2)\
.grid(row=self.row, column=0, columnspan=10, pady=5, padx=3,
sticky="news")
self.row += 1
def _setup_widgetframes(self):
for r, widget in enumerate(self.widgetclasses):
self.row += r
# self._setup_widgetframe(widget, row)
# frame : entry.app.TLabelframe
styling = widget.lower() + ".app.TLabelframe"
text = "Frame for {} - widgets".format(widget)
frm = ttk.Labelframe(self, style=styling, text=text)
frm.grid(row=self.row, column=0, sticky="news")
# widgets in the frame : entry.app.TEntry
wclass = self.widgetclasses[widget]
fmt = self.widgetstyleformat
for i in range(self.widgetcounter):
text = "{} {}".format(widget, i)
styling = fmt.format(i, widget.lower(), widget)
wclass(frm, style=styling,
text=text).grid(row=0, column=i)
self.row += 1
def _setup_styler(self):
styling = "styler.app.TLabelframe"
text = "Stylings"
frm = ttk.Labelframe(self, style=styling, text=text)
frm.grid(row=self.row, column=0, sticky="news")
radiobuttons = [str(x) for x in range(4)]
for c, name in enumerate(radiobuttons):
text = "Style " + name
styling = "radio{}.radio.app.TRadiobutton".format(c)
cbo = ttk.Radiobutton(frm,
style=styling,
variable=self._actual,
value=c,
text=text,
command=self.on_click_set_style)
cbo.grid(row=0, column=c, sticky="news")
self.row += 1
# Events
def on_click_set_style(self):
style = ttk.Style()
def _set_(**stylings):
info = ""
for styleclass in stylings:
options = stylings[styleclass]
info += "Styling Information: {}".format(styleclass) + NL
if options:
info += " - "
info += ",".join(["{}: '{}'".format(x, y) for x, y
in list(options.items())])
info += NL
self._info.set(value=info)
style.configure(styleclass, **options)
# style names : widget1.entry.app.TEntry
i = int(self._actual.get())
if i == 0:
styling = {
"label.app.TLabel": {
"relief": "sunken",
"padding": 0,
"fg": "red"},
}
_set_(**styling)
elif i == 1:
styling = {
"label.app.TLabel": {
"relief": "raised",
"padding": 3},
"label1.label.app.TLabel": {
"relief": "sunken",
"fg": "red",
"padding": 5},
"entry.app.TEntry": {
"relief": "raised",
"padding": 3},
"combobox.app.TCombobox": {
"bg": "red"
}
}
_set_(**styling)
elif i == 2:
pass
elif i == 3:
pass
if __name__ == '__main__':
root = tk.Tk()
app = App(root)
app.grid(sticky="news")
root.mainloop()