【发布时间】:2018-01-30 09:12:08
【问题描述】:
为了提供 ttk.Style() 类的实例,tkinter guide 中说明了语法是:
import ttk
s=ttk.Style()
在 IDLE 中输入这些命令时,我注意到 ttk.Style() 实际上有一个预定义的参数,即
s=ttk.Style(master=None)
我编写了以下测试脚本:
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()
问题 1: 我什么时候需要在 ttk.Style() 中声明 master 争论?例如。在上面的脚本中,如果我在class myWidget 中写入self.s = ttk.Style() 和self.s = ttk.Style(master=self.parent),我会得到相同的结果(见图1)。
问题 2: 是否需要在 s=ttk.Style() 前加上 self?我得到与 Fig1 相同的结果,有和没有 self 前缀。
问题3:如果我将myWidget类中的'my.TFrame'重命名为'App.TFrame'(这个名字在class App中使用过),class App的背景颜色也会变成紫色(与class myWidget 相同的颜色。鉴于不同类中的变量名称是唯一的,为什么会发生这种情况?
问题 4: 名称 'App.TFrame' 和 'my.TFrame' 在声明之前被调用。为什么 python 或 tkinter 没有抱怨或给出错误但允许脚本执行?
图 1
图2
【问题讨论】: