2

我如何填充条目小部件,使其不会在小部件的边界处开始写入?在视觉上,与入口小部件边框有一点空间。

我的进步:

entry_widget.bind('<FocusIn>', lambda f: entry_widget.insert(0, ' '))

当用户单击小部件时会添加一个空白区域,但此解决方案存在多个问题:

  1. 单击退出并重新单击时,它将在空白空间或用户填写的任何文本之上添加另一个空间。我考虑清除条目小部件,FocusOut但这也会清除用户可能编写的所有文本。

  2. 用户可以删除插入的空间

  3. 获取内容时,开头有额外的空格。虽然这是一个小问题,可以通过删除内容的第一个字符来解决。

可能还有更多我没有考虑的问题。

我认为我的代码前进的方式很糟糕,因此我问是否有人知道如何“正确”填充条目小部件?

4

5 回答 5

9

我不知道调整条目填充的本地方法,但这是获得类似内容的一种方法。通过赋予条目FLAT样式使条目的边框不可见,并将条目嵌入到充当条目边框的 Frame 中。然后您可以通过调整条目的borderwidth. 例子:

import tkinter as tk

root = tk.Tk()
frame = tk.Frame(root, borderwidth=5, relief=tk.SUNKEN)
frame.pack()
entry = tk.Entry(frame, borderwidth=15, relief=tk.FLAT)
entry.pack()
root.mainloop()

结果:

在此处输入图像描述

于 2018-08-13T13:05:04.230 回答
5

我遇到了这个问题,经过一番挖掘,我发现您可以在内部填充 ttk 的 Entry 小部件:

import tkinter as tk
import tkinter.ttk as ttk

root = tk.Tk()

ttk.Style().configure('pad.TEntry', padding='5 1 1 1')
ent = ttk.Entry(root, style='pad.TEntry')
ent.pack()

root.mainloop()

'5 1 1 1'' ' 在哪里ipad_left ipad_top ipad_right ipad_bottom(以像素为单位)(默认为'1 1 1 1')。使用'TEntry'参数确实会改变 everyttk.Entry然而的风格,所以如果你想避免这种情况,你可以创建一个新的风格:

ttk.Style().configure('pad.TEntry', padding='5 1 1 1')
ent1 = ttk.Entry(root, style='pad.TEntry')
ent2 = ttk.Entry(root)

哪里ent1会有额外的填充,ent2不会。

我通过运行print(Style().configure('TEntry'))返回所有样式选项TEntry(在本例中只是“填充”)发现存在“填充”选项。但是,这带来了一个问题;ttk 的小部件通常没有很多现成的自定义选项(TEntry 缺少背景、边框宽度、浮雕等),这意味着您必须“创建”它们。有关更多信息,请参阅这些链接:ttk 小部件|| 使用和自定义 ttk 样式|| ttk.进入信息|| (示例)将 fieldbackground 添​​加到 ttk.Entry

于 2020-03-10T12:08:33.850 回答
1

使用 tkinter 8.6U

entry.config(padx = 15)
于 2019-07-03T17:07:56.917 回答
0

试试这个定制entry

from tkinter import Entry,Tk

class MyEntry(Entry):
    def __init__(self,root,placeholder,*args,**kw):
        self.root = root
        self.placeholder = placeholder
        Entry.__init__(self,self.root,*args,**kw)

        self.add()

        self.bind("<FocusIn>",self.focusin)
        self.bind("<FocusOut>",self.focusout)

    def add(self):
        if self.get()=='':
            self.insert(0,self.placeholder)

    def focusin(self,event=None):
        if self.get()=='' or self.get()==self.placeholder:
            self.delete(0,END)

    def focusout(self,event=None):
        if self.get()=='':
            self.add()

root = Tk()

a = MyEntry(root,placeholder='<Name>')
a.pack()
b = MyEntry(root,placeholder='<Contact>')
b.pack()
于 2021-09-24T10:08:31.143 回答
0

这是一个简单的示例,说明如何强制以空格开头,然后在用户键入时使用绑定保留空格。

import tkinter as tk

root = tk.Tk()

def check_for_space(event):
    if entry.get() == "":
        entry.insert(0, " ")
    elif entry.get()[0] != " ":
        entry.insert(0, " ")
    else:
        pass

entry = tk.Entry(root)
entry.insert(0, " ")
entry.pack()
entry.bind("<Key>", check_for_space)

root.mainloop()
于 2018-08-13T13:01:45.290 回答