2017-08-30 129 views
0

我想啓用雙擊來編輯標籤。有沒有一種方法可以用條目窗口小部件替換標籤,哪個用戶雙擊,而不會破壞它? 此示例列出標籤控件和破壞後,雙擊它,將進入小部件結尾:用條目小部件替換python 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() 

我想在完全相同的地方,那裏是標籤進入小部件。我認爲這可能與網格,但也許有更好的辦法?

回答

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

甜菜我給它。儘管你的解決方案需要更少的代碼 –

+0

我喜歡在這裏使用的地方。我打算用一個入口小部件替換網格位置處的標籤小部件,然後用'get()'值替換一個帶有標籤小部件的入口。然而,你做這件事的方式要乾淨得多。 –

+0

這正是我所期待的。 –

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