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
图2
我什么时候需要在 中声明
master争论ttk.Style()?
可能永远不会,除非tkinter不支持default root. 当您None作为 master传递时,master 将成为类的当前root实例Tk。
master(root或任何tk-widget)的主要目的是将 的实例委托tk给Style,以便Style能够执行Tcl相关的命令。
不多也不少。
是否有必要前缀
s=ttk.Style()用self?
这取决于您的要求。在您的代码上下文中 - self毫无意义,因为您正在__createStyle函数范围内设置样式。
否则,如果您希望保留引用,则添加前缀是有意义的 self.
如果我
my.TFrame在 myWidget 类中将类重命名为App.TFrame(此名称在 中使用class App),则其背景颜色也class App更改为紫色(与 颜色相同class myWidget。鉴于不同类中的变量名称是唯一的,为什么会发生这种情况?
因为两个类共享相同的框架样式,因此颜色相同。创建的样式是一个全局的东西,它可以在运行时改变,所有相关的小部件都会对这些改变做出反应。
名称
App.TFrame和my.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)