繁体   English   中英

如何在python ttk中获得FLAT rel Entry小部件?

[英]How to get FLAT relief Entry widget in python ttk?

我正在python ttk中编写一个GUI FTP客户端应用程序。 我似乎无法按照我希望的方式获取文本条目。 在此输入图像描述

文本条目具有“SUNKEN”效果。 我想调整高度并让文本条目具有“FLAT”外观,更像是这个程序:

在此输入图像描述
我从这里看到按钮看起来很扁平,我很难让条目看起来平坦。
如何让参赛作品看起来平坦?

我不想要一个tk解决方案,我知道如何在tk中设置浮雕FLAT。

琐事:

ttk小部件的外观很大程度上取决于使用中的主题和/或平台。 在Windows上我可以用classic主题再现这种抑郁的灰色风格,所以让我们假设这个主题在使用中。 你可以在这里找到的主题列表(注意'clam'主题,与你的愿望最相似),就像你想知道的那样。

下一站,我们的layout ,换句话说,小部件主题的结构 您可以轻松打印此结构以查看可用选项。 够了,让我们尝试一下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'})]
})]

正如您所看到的 ,没有任何结构元素具有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浮雕):

远景

结论:

不幸的是,这个小部件将缺少字段和边框颜色的选项,因此另一个选项是为此目的创建自己的元素 ,但这是另一个问题。

所以,基本上我试着回答不是“如何解决这个问题” ,而是“为什么救济对进入没有影响” ,无论如何,你可以看到,一个条目的平坦浮雕是可以实现的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM