Python Tkinter 文本框输入框文本

3

我该如何填充输入框(widget)的内部,以使它不会从widget的边界开始写入?在视觉上,这样可以为输入框留出一点空间。

我的进展:

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

当用户点击小部件时,它会添加一个空格,但这种解决方案存在多个问题:
  1. 当点击外部并再次点击进入时,会在空白处或用户填写的任何文本上面添加另一个空格。我考虑在 FocusOut 上清除条目窗口小部件,但这也会清除用户可能编写的所有文本。

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

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

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

我认为我的代码走了一条不好的路线,因此我想问是否有人有什么想法可以'正确地'填充条目窗口小部件?


你可以将所有键绑定到输入小部件,以便转到一个函数,该函数首先检查开头是否有空格,如果没有,则添加一个。 - Mike - SMT
1
不完全是您所要求的,但使用 justify='center' 创建条目将使文本远离两侧,除非您实际上需要全部宽度来容纳它。 - jasonharper
5个回答

13

我不知道有一种原生的方法来调整Entry的填充,但是这里有一种方法可以获得类似的效果。通过将Entry的边框设置为FLAT样式,并将Entry嵌入到充当Entry边框的Frame中,使边框不可见。然后,您可以通过调整Entry的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()

结果:

输入图像描述


我喜欢这个。可惜它只能在“平面”输入字段中使用。 - Mike - SMT
如果你说“很遗憾你不能为Entry指定边框样式,因为它必须是平的”,这就是框架的作用。通过指定其边框样式,你实际上也在指定entry的边框样式。 - Kevin
哦,那我得尝试一下。我觉得在我的应用程序中视觉上留一点间距会很不错。 - Mike - SMT
非常好的解决方案。使用 entry.pack(padx=N) 我可以自定义填充大小。 - Programer Beginner

7

我曾经遇到这个问题,经过一番深入探查,我发现你可以在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()

在IT技术中,有一些和像素相关的设置需要注意。比如,在代码中,'5 1 1 1'表示的是像素值,分别对应着iPad屏幕左、上、右、下的边距(默认值为'1 1 1 1')。如果使用'TEntry'参数,会改变所有ttk.Entry的样式,所以您可以创建一个新的样式来避免这种情况。请注意,不要删除任何HTML标签。

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'))找到了存在'padding'选项的方法,该选项返回所有TEntry的样式选项(在这种情况下仅为“填充”)。这带来了一个问题; ttk的小部件通常没有很多可用的自定义选项(例如TEntry缺少background,borderwidth,relief等),这意味着您必须“创建”它们。请参阅以下链接以获取更多信息:ttk小部件 || 使用和自定义ttk样式 || ttk.Entry信息 || (示例) 在ttk.Entry中添加fieldbackground


1
使用tkinter 8.6U
entry.config(padx = 15)

@giodamelio 打扰一下,我认为正确的语法应该是 entry.pack_configure(padx=15) ... 你能告诉我在 "tkinter 8.6U" 中你添加的 "U" 代表什么吗? - danicotra

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()

用户仍然可以使用箭头键移动到空间的前面。此外,用户可以删除该空间。第二个问题仍然存在。 - Programer Beginner
@ProgramerBeginner 只要他们在空格前面输入任何其他内容,就会添加一个新的空格。话虽如此,我理解你的意思。我可能可以尝试其他方法,但我认为你的解决方案是正确的答案。 - Mike - SMT

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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接