有关使用ttk.Style()的问题?

Sun*_*ear 6 python tkinter ttk

为了使ttk.Style()类的实例可用,这个tkinter 指南中说明了语法是:

import ttk
s=ttk.Style()
Run Code Online (Sandbox Code Playgroud)

在IDLE中输入这些命令时,我注意到ttk.Style()实际上有一个预定义的参数,即

s=ttk.Style(master=None)
Run Code Online (Sandbox Code Playgroud)

我写了以下测试脚本:

import tkinter as tk
import tkinter.ttk as ttk


class App(ttk.Frame):

    def __init__(self, parent):
        ttk.Frame.__init__(self, parent, style='App.TFrame', relief=tk.SUNKEN,
                           border=10)
        self.parent = parent
        self.__createStyle()
        self.__createWidgets()

    def __createStyle(self):
        self.s = ttk.Style()
        self.s.configure('.', background='orange', border=100)
        self.s.configure('App.TFrame', background='yellow')
        self.s.configure('Btn.TButton', background='light blue', border=10)

    def __createWidgets(self):
        self._label = ttk.Label(self.parent, text='Label packed in root.')
        self._label.pack()
        self._btn = ttk.Button(self, style='Btn.TButton', command=self.__click,
            text='Button packed inside self or class App, which is a ttk.Frame')
        self._btn.pack()

    def __click(self):
        return print('Left Button Clicked!')



class myWidget(ttk.Frame):

    def __init__(self, parent):
        ttk.Frame.__init__(self, parent, style='my.TFrame', relief=tk.GROOVE,
                           border=10)
        self.parent = parent
        self.__createStyle()
        self.__createWidgets()

    def __createStyle(self):
        self.s = ttk.Style()
        self.s.configure('my.TFrame', background='purple')
        self.s.configure('my.TLabel', background='pink', border=10)
        self.s.configure('my.TEntry', foreground='red', border=10)

    def __createWidgets(self):
        self._label = ttk.Label(self, style='my.TLabel',
            text='myWidget Label packed in self or class myWidget, which is a ttk.Frame.')

        self._label.pack()
        self._entry = ttk.Entry(self, style='my.TEntry')
        self._entry.pack()



if __name__ == "__main__":
    root = tk.Tk()
    root.title('Test Style')
    root.geometry('500x150')
    a = App(root)
    a.pack(fill='both', expand=1)
    b = myWidget(a)
    b.pack()

    root.mainloop()
Run Code Online (Sandbox Code Playgroud)

问题1:我什么时候需要申报master辩论ttk.Style()?例如,在上面的脚本中,如果我写入self.s = ttk.Style()self.s = ttk.Style(master=self.parent)输入class myWidget,我得到相同的结果(见图1).

问题2:是否有必要的前缀s=ttk.Style()self?我得到的结果如图1所示,带有和不带self前缀.

问题3:如果我'my.TFrame'在类myWidget中重命名为'App.TFrame'(此名称用于class App),则class App改变为紫色的背景颜色(颜色与...相同class myWidget.为什么在不同类中的变量名称是唯一的?

问题4:名字'App.TFrame''my.TFrame'被称为被宣布之前.为什么python或tkinter没有抱怨或给出错误但允许脚本执行?

图.1

图1

Fig2

图2

Com*_*nse 6

我什么时候需要在 中声明master争论ttk.Style()

可能永远不会,除非tkinter不支持default root. 当您None作为 master传递时,master 将成为类的当前root实例Tk

master(root或任何tk-widget)的主要目的是将 的实例委托tkStyle,以便Style能够执行Tcl相关的命令。

不多也不少。


是否有必要前缀s=ttk.Style()self

这取决于您的要求。在您的代码上下文中 - self毫无意义,因为您正在__createStyle函数范围内设置样式。

否则,如果您希望保留引用,则添加前缀是有意义的 self.


如果我my.TFrame在 myWidget 类中将类重命名为App.TFrame(此名称在 中使用class App),则其背景颜色也class App更改为紫色(与 颜色相同class myWidget。鉴于不同类中的变量名称是唯一的,为什么会发生这种情况?

因为两个类共享相同的框架样式,因此颜色相同。创建的样式是一个全局的东西,它可以在运行时改变,所有相关的小部件都会对这些改变做出反应。


名称App.TFramemy.TFrame在声明之前被调用。为什么 python 或 tkinter 没有抱怨或给出错误,而是允许脚本执行?

为什么你认为他们应该?当您传递类似<any_sensible_name>.<any_relevant_and_existing_basestyle>,ttk知道您想要基本样式的变体时,因此它会隐式创建一个继承所有基本属性的变体。

尝试使用更无意义的技巧,例如没有点 ( ttk.Frame.__init__(..., style='AppTFrame', ...)) 的当前样式名称,这会给您带来所需的错误:

_tkinter.TclError: Layout AppTFrame not found
Run Code Online (Sandbox Code Playgroud)