Ceci est mon exemple de code. Je souhaite que les éléments saisis dans l'entrée soient insérés dans l'arborescence lorsque le bouton Entrée est enfoncé. Im nouveau pour python et tkinter et il n'y a pas beaucoup de tuts sur treeview.
class PurchaseEntry(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
PurchaseEntry.configure(self, bg='white')
label = ttk.Label(self, text='Purchase Entry', font=LARGE_FONT2)
label.grid(row=0, columnspan=3, sticky='w')
purchase_entry = ttk.Label(self, text='Purchase Entry:')
purchase_entry.grid(row=1, column=0)
self.entry_val = tk.StringVar()
self.entry_1 = ttk.Entry(self, width=100, textvariable=self.entry_val)
self.entry_1.grid(row=1, column=2, columnspan=2, sticky='w')
self.entry_1.focus()
self.entry_btn = ttk.Button(self,text='Enter', command=self.insert_value)
self.entry_btn.grid(row=1, column=4, columnspan=2, sticky='w')
self.chat1 = ttk.Treeview(self)
chat1 = ttk.Treeview( self, height=28, columns=('dose', 'date modified'), selectmode="extended")
chat1.heading('#0', text='item', anchor=tk.CENTER)
chat1.heading('#1', text='dose', anchor=tk.CENTER)
chat1.heading('#2', text='date modified', anchor=tk.CENTER)
chat1.column('#1', stretch=tk.YES, minwidth=50, width=100)
chat1.column('#2', stretch=tk.YES, minwidth=50, width=120)
chat1.column('#0', stretch=tk.YES, minwidth=50, width=400)
chat1.grid(row=2, column=2, columnspan=4, sticky='nsew')
def insert_value(self):
value = self.entry_val.get()
# Inserts data written in the entry box to the treeview widget when Enter button is pressed.
# Clears the Entry box, ready for another data entry.
self.entry_1.delete(0, 'end')
self.chat1.insert('WHAT SHOULD I GIVE AS AN ARGUMENT?')
Que dois-je passer comme argument? Ou est-ce que l'arborescence est le bon widget pour cela ou quelqu'un peut-il suggérer un widget adapté à ce problème? Merci
Vous semblez intéressé uniquement à savoir comment insérer des données que l'utilisateur saisit dans les widgets Tkinter.Entry()
dans ttk.Treeview()
après un clic sur Tkinter.Button()
.
J'ai conçu une interface simple pour vous montrer comment résoudre ce problème. Vous pouvez adapter ma solution à votre problème.
Voici à quoi ressemble la démo de l'application:
J'ai donc mis un compteur self.i
Pour nommer les articles. Mais vous pouvez ajouter une étiquette et une entrée à cet effet à la place et vous insérez des noms d'éléments de la même manière que les autres entrées Tkinter.Entry()
.
La méthode d'insertion est celle-ci:
def insert_data(self):
"""
Insertion method.
"""
self.treeview.insert('', 'end', text="Item_"+str(self.i),
values=(self.dose_entry.get() + " mg",
self.modified_entry.get()))
# Increment counter
self.i = self.i + 1
La principale astuce consiste ici à récupérer les données saisies par l'utilisateur à l'aide de la méthode get()
qui est représentée par self.dose_entry.get()
et self.dose_modified.get()
Actions.
Ceci est fait, vous devez maintenant lier cette méthode au bouton à appuyer pour déclencher l'action d'insertion à l'aide de l'option command
:
self.submit_button = Tkinter.Button(self.parent, text="Insert",
command=self.insert_data)
'''
Created on Mar 21, 2016
@author: Bill Begueradj
'''
try:
import Tkinter
import ttk
except ImportError: # Python 3
import tkinter as Tkinter
import tkinter.ttk as ttk
class Begueradj(Tkinter.Frame):
'''
classdocs
'''
def __init__(self, parent):
'''
Constructor
'''
Tkinter.Frame.__init__(self, parent)
self.parent=parent
self.initialize_user_interface()
def initialize_user_interface(self):
"""Draw a user interface allowing the user to type
items and insert them into the treeview
"""
self.parent.title("Canvas Test")
self.parent.grid_rowconfigure(0, weight=1)
self.parent.grid_columnconfigure(0, weight=1)
self.parent.config(background="lavender")
# Define the different GUI widgets
self.dose_label = Tkinter.Label(self.parent, text="Dose:")
self.dose_entry = Tkinter.Entry(self.parent)
self.dose_label.grid(row=0, column=0, sticky=Tkinter.W)
self.dose_entry.grid(row=0, column=1)
self.modified_label = Tkinter.Label(self.parent,
text="Date Modified:")
self.modified_entry = Tkinter.Entry(self.parent)
self.modified_label.grid(row=1, column=0, sticky=Tkinter.W)
self.modified_entry.grid(row=1, column=1)
self.submit_button = Tkinter.Button(self.parent, text="Insert",
command=self.insert_data)
self.submit_button.grid(row=2, column=1, sticky=Tkinter.W)
self.exit_button = Tkinter.Button(self.parent, text="Exit",
command=self.parent.quit)
self.exit_button.grid(row=0, column=3)
# Set the treeview
self.tree = ttk.Treeview(self.parent,
columns=('Dose', 'Modification date'))
self.tree.heading('#0', text='Item')
self.tree.heading('#1', text='Dose')
self.tree.heading('#2', text='Modification Date')
self.tree.column('#1', stretch=Tkinter.YES)
self.tree.column('#2', stretch=Tkinter.YES)
self.tree.column('#0', stretch=Tkinter.YES)
self.tree.grid(row=4, columnspan=4, sticky='nsew')
self.treeview = self.tree
# Initialize the counter
self.i = 0
def insert_data(self):
"""
Insertion method.
"""
self.treeview.insert('', 'end', text="Item_"+str(self.i),
values=(self.dose_entry.get() + " mg",
self.modified_entry.get()))
# Increment counter
self.i = self.i + 1
def main():
root=Tkinter.Tk()
d=Begueradj(root)
root.mainloop()
if __name__=="__main__":
main()
Remarque:
J'ai codé cela en Python 2.7, mais cela devrait fonctionner si vous utilisez Python 3.x.