Python Tkinter 输入板文本
Python Tkinter Entry pad text
如何填充条目小部件,使其不会在小部件的边界处开始书写?从视觉上看,入口小部件边框有一点 space。
我的进步:
entry_widget.bind('<FocusIn>', lambda f: entry_widget.insert(0, ' '))
当用户单击小部件时会添加一个空 space,但此解决方案存在多个问题:
单击退出并重新单击时,它会在空白 space 或用户填写的任何文本之上添加另一个 space。我考虑过清除FocusOut
上的条目小部件,但这也会清除用户可能编写的所有文本。
用户可以删除插入的space
获取内容时,开头多了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()
如何填充条目小部件,使其不会在小部件的边界处开始书写?从视觉上看,入口小部件边框有一点 space。
我的进步:
entry_widget.bind('<FocusIn>', lambda f: entry_widget.insert(0, ' '))
当用户单击小部件时会添加一个空 space,但此解决方案存在多个问题:
单击退出并重新单击时,它会在空白 space 或用户填写的任何文本之上添加另一个 space。我考虑过清除
FocusOut
上的条目小部件,但这也会清除用户可能编写的所有文本。用户可以删除插入的space
获取内容时,开头多了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()