ttk.Style() wirkungslos bei ttk.Entries/ttk.Comboboxes

Fragen zu Tkinter.
Antworten
sedi
User
Beiträge: 104
Registriert: Sonntag 9. Dezember 2007, 19:22

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:

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()
CU sedi
----------------------------------------------------------
Python 3.5; Python 3.6
LinuxMint18
sedi
User
Beiträge: 104
Registriert: Sonntag 9. Dezember 2007, 19:22

Niemand ne Idee wie das mit dem Styling bei ttk.Entry - Feldern läuft? Vllt einfach nur wie man die Schriftart ändert?
CU sedi
----------------------------------------------------------
Python 3.5; Python 3.6
LinuxMint18
Antworten