如何在 python ttk 中获取 FLAT relief Entry 小部件?
How to get FLAT relief Entry widget in python ttk?
我正在 python ttk 中编写一个 GUI FTP 客户端应用程序。我似乎无法按照我希望的方式获取文本条目。
文本条目具有 "SUNKEN" 效果。我想调整高度并使文本条目具有 "FLAT" 外观,更像这个程序:
我从 开始让按钮看起来平坦,我正在努力让条目看起来平坦。
如何让条目看起来平坦?
我不想要 tk 解决方案,我知道如何在 tk 中设置 relief FLAT。
琐事:
ttk 小部件的外观在很大程度上取决于使用的主题 and/or 平台。在 windows 我可以用 classic
主题重现这种压抑的灰色风格,所以让我们假设这个主题在使用中。您可以找到的主题列表 here(请注意 'clam'
主题,它与您的愿望最相似),如果您想知道的话。
下一站,我们的 layout
or, in other words, a structure 小部件主题。
您可以轻松打印此结构以查看可用选项。够多的话,让我们尝试一个 ttk.Entry
小部件的结构。
>>> print(s.layout('TEntry'))
# formatted result, actual result is one-line string
[('Entry.highlight', {
'sticky': 'nswe',
'children': [(
'Entry.field', {
'sticky': 'nswe',
'children': [(
'Entry.padding', {
'sticky': 'nswe',
'children': [(
'Entry.textarea', {
'sticky': 'nswe'})]
})],
'border': '1'})]
})]
As you can see,没有一个结构元素有relief
选项,所以relief='flat'
对我们的入口没有影响!
>>> print(s.element_options('Entry.field'))
('-bordercolor', '-lightcolor', '-darkcolor', '-fieldbackground')
解决方法:
但是,我们可以编辑所需小部件的布局,并将一个元素替换为另一个元素,从而能够识别 relief
选项(注意已删除 Entry.field
,替换为 Entry.border
).
所以试试这个小片段:
try:
import tkinter as tk
import tkinter.ttk as ttk
except ImportError:
import Tkinter as tk
import ttk
# root
root = tk.Tk()
# declare style variable
s = ttk.Style()
# assume that classic theme in use
s.theme_use('classic')
# configure relief
s.configure('SOExample.TEntry', relief='flat')
# lets try to change this structure
s.layout('SOExample.TEntry', [
('Entry.highlight', {
'sticky': 'nswe',
'children':
[('Entry.border', {
'border': '1',
'sticky': 'nswe',
'children':
[('Entry.padding', {
'sticky': 'nswe',
'children':
[('Entry.textarea',
{'sticky': 'nswe'})]
})]
})]
})])
# let's find some differences between this two
print(s.layout('SOExample.TEntry'))
print(s.layout('TEntry'))
# packing
frame1 = tk.Frame(root)
label1 = tk.Label(frame1, text='Flat Entry')
entry1 = ttk.Entry(frame1, style='SOExample.TEntry')
label1.pack()
entry1.pack()
frame1.pack(side='left')
frame2 = tk.Frame(root)
label2 = tk.Label(frame2, text='Default Entry')
entry2 = ttk.Entry(frame2)
label2.pack()
entry2.pack()
frame2.pack(side='right')
# mainloop
root.mainloop()
...最后的出现是:
此外,在我的机器上,默认主题是 vista
,我什至无法识别其中的条目:
Entry
的结构也取决于主题,因此 vista
是:
# formatted result, actual result is one-line string
[('Entry.field', {
'sticky': 'nswe',
'children': [(
'Entry.background', {
'sticky': 'nswe',
'children': [(
'Entry.padding', {
'sticky': 'nswe',
'children': [(
'Entry.textarea', {
'sticky': 'nswe'})]
})]
})]
})]
...如果我们在这个结构中用border
元素替换field
,外观非常接近您的要求(在这种情况下也可以尝试groove
relief) :
结论:
不幸的是,这个小部件将缺少字段和边框颜色的选项,因此另一个选项是 create own element 用于此目的,但这是另一个问题。
所以,基本上我试着回答不是 "how to workaround this",而是 "why a relief has no effect on Entry",无论如何你可以看,一个条目的平缓是可以实现的。
我正在 python ttk 中编写一个 GUI FTP 客户端应用程序。我似乎无法按照我希望的方式获取文本条目。
文本条目具有 "SUNKEN" 效果。我想调整高度并使文本条目具有 "FLAT" 外观,更像这个程序:
我从
如何让条目看起来平坦?
我不想要 tk 解决方案,我知道如何在 tk 中设置 relief FLAT。
琐事:
ttk 小部件的外观在很大程度上取决于使用的主题 and/or 平台。在 windows 我可以用 classic
主题重现这种压抑的灰色风格,所以让我们假设这个主题在使用中。您可以找到的主题列表 here(请注意 'clam'
主题,它与您的愿望最相似),如果您想知道的话。
下一站,我们的 layout
or, in other words, a structure 小部件主题。
您可以轻松打印此结构以查看可用选项。够多的话,让我们尝试一个 ttk.Entry
小部件的结构。
>>> print(s.layout('TEntry'))
# formatted result, actual result is one-line string
[('Entry.highlight', {
'sticky': 'nswe',
'children': [(
'Entry.field', {
'sticky': 'nswe',
'children': [(
'Entry.padding', {
'sticky': 'nswe',
'children': [(
'Entry.textarea', {
'sticky': 'nswe'})]
})],
'border': '1'})]
})]
As you can see,没有一个结构元素有relief
选项,所以relief='flat'
对我们的入口没有影响!
>>> print(s.element_options('Entry.field'))
('-bordercolor', '-lightcolor', '-darkcolor', '-fieldbackground')
解决方法:
但是,我们可以编辑所需小部件的布局,并将一个元素替换为另一个元素,从而能够识别 relief
选项(注意已删除 Entry.field
,替换为 Entry.border
).
所以试试这个小片段:
try:
import tkinter as tk
import tkinter.ttk as ttk
except ImportError:
import Tkinter as tk
import ttk
# root
root = tk.Tk()
# declare style variable
s = ttk.Style()
# assume that classic theme in use
s.theme_use('classic')
# configure relief
s.configure('SOExample.TEntry', relief='flat')
# lets try to change this structure
s.layout('SOExample.TEntry', [
('Entry.highlight', {
'sticky': 'nswe',
'children':
[('Entry.border', {
'border': '1',
'sticky': 'nswe',
'children':
[('Entry.padding', {
'sticky': 'nswe',
'children':
[('Entry.textarea',
{'sticky': 'nswe'})]
})]
})]
})])
# let's find some differences between this two
print(s.layout('SOExample.TEntry'))
print(s.layout('TEntry'))
# packing
frame1 = tk.Frame(root)
label1 = tk.Label(frame1, text='Flat Entry')
entry1 = ttk.Entry(frame1, style='SOExample.TEntry')
label1.pack()
entry1.pack()
frame1.pack(side='left')
frame2 = tk.Frame(root)
label2 = tk.Label(frame2, text='Default Entry')
entry2 = ttk.Entry(frame2)
label2.pack()
entry2.pack()
frame2.pack(side='right')
# mainloop
root.mainloop()
...最后的出现是:
此外,在我的机器上,默认主题是 vista
,我什至无法识别其中的条目:
Entry
的结构也取决于主题,因此 vista
是:
# formatted result, actual result is one-line string
[('Entry.field', {
'sticky': 'nswe',
'children': [(
'Entry.background', {
'sticky': 'nswe',
'children': [(
'Entry.padding', {
'sticky': 'nswe',
'children': [(
'Entry.textarea', {
'sticky': 'nswe'})]
})]
})]
})]
...如果我们在这个结构中用border
元素替换field
,外观非常接近您的要求(在这种情况下也可以尝试groove
relief) :
结论:
不幸的是,这个小部件将缺少字段和边框颜色的选项,因此另一个选项是 create own element 用于此目的,但这是另一个问题。
所以,基本上我试着回答不是 "how to workaround this",而是 "why a relief has no effect on Entry",无论如何你可以看,一个条目的平缓是可以实现的。