Макет в стиле tkinter ttk не найден - PullRequest
0 голосов
/ 01 мая 2020

Получение ошибки по следующему коду. Продолжайте смотреть на примеры и переоценивать код, но не можете определить причину, по которой это не должно выполняться. Что-то не так, что макет 'mRRed' не может быть найден? (И я уверен в последующем) ...

import tkinter as tk
from tkinter import ttk

class MainFrame:
    def __init__(self,parent):
        self.frame = ttk.Frame(parent,padding='3 3 12 12')
        self.frame.grid(column=0, row=0)

        self.mRRed = ttk.Style()
        self.mRBlue = ttk.Style()
        self.mPurple = ttk.Style()
        self.mPink = ttk.Style()
        self.mSCyan = ttk.Style()
        self.mVYellow = ttk.Style()
        self.mGreen  = ttk.Style()

        self.mRRed.configure("mRRed",background="#E61E50")
        self.mRBlue.configure("mRBlue",background="#0F69AF")
        self.mPurple.configure("mPurple",background="#503291")
        self.mPink.configure("mPink",background="#EB3C96")
        self.mSCyan.configure("mSCyan",background="#2BDECD")
        self.mVYellow.configure("mVYellow",background="#FFC832")
        self.mGreen.configure("mGreen",background="#149B5F")


        self.toolRibbon    = ttk.Frame(self.frame, style='mRRed')
        self.subtoolRibbon = ttk.Frame(self.frame, style='mRBlue')
        self.titleFrame    = ttk.Frame(self.frame, style='mPruple')
        self.contentFrame  = ttk.Frame(self.frame, style='mPink')
        self.optionRibbon  = ttk.Frame(self.frame, style='mSCyan')
        self.statusFrame   = ttk.Frame(self.frame, style='mVYellow')
        self.infoFrame     = ttk.Frame(self.frame, style='mGreen')

        self.toolRibbon.grid(column=0,row=0)
        self.subtoolRibbon.grid(column=0,row=1)
        self.titleFrame.grid(column=1,row=1)
        self.contentFrame.grid(column=1,row=2)
        self.optionRibbon.grid(column=1,row=3)
        self.statusFrame.grid(column=1,row=4)
        self.infoFrame.grid(column=4,row=1)

root = tk.Tk()
root.title("test")

main = MainFrame(root)
root.mainloop()

-------------------------- ------------------------------------------------- TclError Traceback (последний вызов был последним) в 43 root .title ("тест") 44 ---> 45 main = MainFrame (root) 46 root .mainl oop ()

в init (self, parent) 24 25 ---> 26 self.toolRibbon = ttk.Frame (self.frame, style = 'mRRed') 27 self.subtoolRibbon = ttk.Frame (self.frame , style = 'mRBlue') 28 self.titleFrame = ttk.Frame (self.frame, style = 'mPruple')

D: \ Programs \ Anaconda \ lib \ tkinter \ ttk.py в init (self, master, ** kw) 740 ширина полосы, рельеф, отступы, ширина, высота 741 "" "-> 742 Widget. init (self, master," ttk :: frame ", kw) 743 744

D: \ Programs \ Anaconda \ lib \ tkinter \ ttk.py в init (self, master, widgetname, kw) 557 # Загрузить плитку сейчас, если необходимо 558 _load_tile (master) -> 559 tkinter.Widget. init (self, master, widgetname, kw = kw) 560 561

D: \ Programs \ Anaconda \ lib \ t kinter__init__.py в init (self, master, widgetName, cnf, kw, extra) 2297 del cnf [k] 2298
self.tk.call (-> 2299 (widgetName, self._w) + extra + self._options (cnf)) 2300 для k, v в классах: 2301
k.configure (self, v)

TclError: Макет mRRed не найден

1 Ответ

2 голосов
/ 02 мая 2020

ttk.Style() соответствует соглашению об именах T<widget name> для пользовательских стилей. На самом деле это не относится к документам python tkinter, кроме того факта, что они используют соглашение об именах в примерах, но никогда не объясняют его.

Короче говоря, если вы хотите применить стиль для Frame виджета, вам нужно будет использовать суффикс .TFrame в названии вашего стиля.

Я также заметил, что я неправильно прочитал ваш вопрос и у вас сложилось впечатление, что вы используете Label, а не Frame.

Я добавил Label s, чтобы продемонстрировать эффект, но в вашем примере ваш код будет:

import tkinter as tk
from tkinter import ttk

class MainFrame:
    def __init__(self,parent):
        self.frame = ttk.Frame(parent,padding='3 3 12 12')
        self.frame.grid(column=0, row=0)

        self.mRRed = ttk.Style()
        self.mRBlue = ttk.Style()
        self.mPurple = ttk.Style()
        self.mPink = ttk.Style()
        self.mSCyan = ttk.Style()
        self.mVYellow = ttk.Style()
        self.mGreen  = ttk.Style()

        self.mRRed.configure("mRRed.TFrame",background="#E61E50")
        self.mRBlue.configure("mRBlue.TFrame",background="#0F69AF")
        self.mPurple.configure("mPurple.TFrame",background="#503291")
        self.mPink.configure("mPink.TFrame",background="#EB3C96")
        self.mSCyan.configure("mSCyan.TFrame",background="#2BDECD")
        self.mVYellow.configure("mVYellow.TFrame",background="#FFC832")
        self.mGreen.configure("mGreen.TFrame",background="#149B5F")


        self.toolRibbon    = ttk.Frame(self.frame, style='mRRed.TFrame',borderwidth=4)
        self.subtoolRibbon = ttk.Frame(self.frame, style='mRBlue.TFrame',borderwidth=4)
        self.titleFrame    = ttk.Frame(self.frame, style='mPurple.TFrame',borderwidth=4)
        self.contentFrame  = ttk.Frame(self.frame, style='mPink.TFrame',borderwidth=4)
        self.optionRibbon  = ttk.Frame(self.frame, style='mSCyan.TFrame',borderwidth=4)
        self.statusFrame   = ttk.Frame(self.frame, style='mVYellow.TFrame',borderwidth=4)
        self.infoFrame     = ttk.Frame(self.frame, style='mGreen.TFrame',borderwidth=4)

        self.toolRibbon.grid(column=0,row=0)
        self.subtoolRibbon.grid(column=0,row=1)
        self.titleFrame.grid(column=1,row=1)
        self.contentFrame.grid(column=1,row=2)
        self.optionRibbon.grid(column=1,row=3)
        self.statusFrame.grid(column=1,row=4)
        self.infoFrame.grid(column=4,row=1)

        self.test = ttk.Label(self.optionRibbon, text='cyan test')
        self.test.pack()

        self.test2 = ttk.Label(self.contentFrame, text='pink test')
        self.test2.pack()

root = tk.Tk()
root.title("test")

main = MainFrame(root)
root.mainloop()
...