簡體   English   中英

用條目小部件替換python tkinter標簽小部件

[英]Replace python tkinter label widget with entry widget

我想啟用雙擊來編輯標簽。 有沒有一種方法可以用條目窗口小部件替換用戶雙擊的標簽而不破壞它? 此示例列出了標簽小部件,雙擊銷毀它,並在最后設置條目小部件:

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

我希望條目小部件位於標簽所在的完全相同的位置。 我認為使用網格是可能的,但是也許有更好的方法?

最簡單的解決方案不是替換它,而是覆蓋它。 這是一種情況,其中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()

這是網格解決方案。 我認為這是可以接受的,但是您可以等待其他人提供更好的解決方案。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM