用条目小部件

时间:2017-08-30 17:54:58

标签: python python-3.x tkinter

我想启用双击以编辑标签。有没有办法用条目小部件替换用户双击的标签而不破坏它? 此示例列出了标签窗口小部件,并在双击后将其截断并在最后设置条目窗口小部件:

from tkinter import *
class MainWindow:
    def __init__(self, root):
        self.root = root
        self.tasks = ['text1', 'text2', 'text3']
        self.list_tasks()
    def list_tasks(self):
        self.tasks_frame = Frame(self.root)
        for task in self.tasks:
            task_label = Label(self.tasks_frame, text=task)
            task_label.bind('<Double-Button-1>', self.replace_with_entry)
            task_label.pack()
        self.tasks_frame.pack()
    def replace_with_entry(self, event):
        widget = event.widget
        widget.destroy()
        entry_widget = Entry(self.tasks_frame)
        entry_widget.pack()
root = Tk()
main_window = MainWindow(root)
root.mainloop()

我希望条目小部件完全位于标签所在的位置。我认为有可能使用网格,但也许有更好的方法?

2 个答案:

答案 0 :(得分:1)

最简单的解决方案不是替换它,而是覆盖它。这是place非常有用的一种情况。

例如:

def replace_with_entry(self, event):
    widget = event.widget
    entry_widget = Entry(widget)
    entry_widget.place(x=0, y=0, anchor="nw", relwidth=1.0, relheight=1.0)
    entry_widget.bind("<Return>", self.remove_entry)
    entry_widget.focus_set()

def remove_entry(self, event):
    entry = event.widget
    label = entry.place_info()["in"]
    label.configure(text=entry.get())
    entry.destroy()

答案 1 :(得分:0)

这是网格解决方案。我认为这是可以接受的,但你可以等一下,看看其他人是否提供了更好的解决方案。

from tkinter import *
from functools import partial
class MainWindow:
    def __init__(self, root):
        self.root = root
        self.tasks = ['text1', 'text2', 'text3']
        self.list_tasks()
    def list_tasks(self):
        self.tasks_frame = Frame(self.root)
        for i, task in enumerate(self.tasks):
            task_label = Label(self.tasks_frame, text=task)
            task_label.bind('<Double-Button-1>', partial(self.replace_with_entry, i))
            task_label.grid(row=i, column=0)
        self.tasks_frame.pack()
    def replace_with_entry(self, i, event):
        widget = event.widget
        widget.destroy()
        entry_widget = Entry(self.tasks_frame)
        entry_widget.grid(row=i, column=0)
root = Tk()
main_window = MainWindow(root)
root.mainloop()

我还创建了另一个版本,它使用tkinter变量来包含条目中标签的文本。可以修改它以允许使用修改后的文本切换回标签。

from tkinter import *
from functools import partial
class MainWindow:
    def __init__(self, root):
        self.root = root
        self.tasks = ['text1', 'text2', 'text3']
        self.list_tasks()
    def list_tasks(self):
        self.tasks_frame = Frame(self.root)
        self.task_widgets = []
        for i, task in enumerate(self.tasks):
            textvar = StringVar()
            textvar.set(task)
            task_label = Label(self.tasks_frame, textvariable=textvar)
            task_label.bind('<Double-Button-1>', partial(self.replace_with_entry, i))
            task_label.grid(row=i, column=0)
            task_entry = Entry(self.tasks_frame, textvariable=textvar)
            self.task_widgets.append((task_label, task_entry, textvar))
        self.tasks_frame.pack()
    def replace_with_entry(self, i, event):
        widget = event.widget
        widget.grid_forget()
        self.task_widgets[i][1].grid(row=i, column=0)

root = Tk()
main_window = MainWindow(root)
root.mainloop()