Python Tkinter 输入板文本

Python Tkinter Entry pad text

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

我的进步:

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

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

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

  2. 用户可以删除插入的space

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

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

我认为我的代码前进的方向很糟糕,因此我想问问是否有人知道如何 'properly' 填充条目小部件?

这是一个简单的示例,说明如何强制 space 开始,然后在用户键入时使用绑定保持 space。

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

我不知道调整条目填充的本机方法,但这里有一种方法可以得到类似的东西。通过给它一个 FLAT 样式使条目的边框不可见,并将条目嵌入到充当条目边框的框架中。然后您可以通过调整条目的 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()

结果:

使用 tkinter 8.6U

entry.config(padx = 15)

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

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' 参数确实会改变每个 ttk.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')) 存在 'padding' 选项 returns TEntry 的所有样式选项(在这种情况下它只是 'padding').但这带来了一个问题; ttk 的小部件通常没有很多可用的自定义选项(TEntry 缺少背景、边框宽度、浮雕等),这意味着您必须 'create' 它们。有关详细信息,请参阅以下链接:ttk widgets || Using and customizing ttk styles || ttk.Entry information || (example) adding fieldbackground to ttk.Entry

试试这个定制的 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()