Python Tkinter 输入板文本

Pro*_*ner 2 python tkinter pad tkinter-entry

我怎样才能填充入口小部件,使其不会在小部件的边界处开始书写?在视觉上,与入口小部件边框有一点空间。

我的进度:

entry_widget.bind('<FocusIn>', lambda f: entry_widget.insert(0, ' '))
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

Kev*_*vin 8

我不知道调整条目填充的本机方式,但这是获得类似内容的一种方法。通过给它一个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()
Run Code Online (Sandbox Code Playgroud)

结果:

在此处输入图片说明


小智 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()
Run Code Online (Sandbox Code Playgroud)

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

ttk.Style().configure('pad.TEntry', padding='5 1 1 1')
ent1 = ttk.Entry(root, style='pad.TEntry')
ent2 = ttk.Entry(root)
Run Code Online (Sandbox Code Playgroud)

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

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