2017-08-30 123 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() 
相关问题