Je n'arrive pas à trouver un moyen de supprimer une rangée de widgets dans mon application de partage. J'expérimente actuellement avec la méthode grid_forget
; Cependant, cela ne fait que supprimer la toute dernière instance de l'objet. Mon but est de pouvoir entrer le code relatif à la ligne que je veux supprimer, qui trouvera alors le code dans la liste des étiquettes et supprimera cette ligne entière, après quoi les lignes s'ajusteront automatiquement et se déplaceront pour remplir tout espace blanc. Pour être honnête je ne suis pas sûr que ce soit réalisable avec tkinter et python, mais je ne suis qu'un débutant donc je ne sais pas vraiment. Le code de suppression ressemble à ceci:Comment supprimer une ligne spécifique de widgets d'étiquettes dans l'application tkinter
def delete(self, event = None):
if self.code_entry_delete.get() in self.code_list:
self.label1.grid_forget()
self.label2.grid_forget()
…
self.label10.grid_forget()
Le problème que je vais avoir est que self.label1…label10
sont répétées sur plusieurs lignes, donc oublier self.label1
ne sera oublier l'entrée la plus récente. Cela signifie que j'ai besoin de trouver un moyen d'oublier self.label1
à self.label10
à la ligne x, où x est égal au numéro de ligne que je veux supprimer/oublier.
Code complet pour mon programme incomplet mais fonctionnel ci-dessous. Si quelqu'un copie et colle le code pour le tester, l'Australie utilise des codes à trois lettres pour les sociétés sur notre marché des actions, à savoir. STO, NAB, ABC. etc ...
#!/usr/bin/env python3.4
from tkinter import *
import ystockquote
import urllib.request
from urllib.request import urlopen
from bs4 import BeautifulSoup
class Shares(Frame):
def __init__(self, master):
Frame.__init__(self, master)
Frame.__init__(self, master)
self.frame = Frame(master, bg = "#ededed")
self.frame.grid(row = 9, column = 0)
self.canvas = Canvas(self.frame, bg = "#ffffff")
self.data_frame = Frame(self.canvas, bg = "#ffffff")
self.vscrollbar = Scrollbar(self.frame, orient = "vertical", command = self.canvas.yview)
self.canvas.configure(yscrollcommand = self.vscrollbar.set)
self.vscrollbar.grid(row = 9, column = 11, sticky = NS)
self.canvas.config(width = 1210, height = 200)
self.canvas.grid(row = 9, column = 0, columnspan = 11, sticky = E)
self.canvas.create_window((0, 0), window = self.data_frame, anchor = "nw", tags = "self.frame")
self.data_frame.bind("<Configure>", self.onFrameConfig)
self.data_frame.grid_columnconfigure(0, minsize = 352)
self.data_frame.grid_columnconfigure(1, minsize = 96)
self.data_frame.grid_columnconfigure(2, minsize = 96)
self.data_frame.grid_columnconfigure(3, minsize = 96)
self.data_frame.grid_columnconfigure(4, minsize = 96)
self.data_frame.grid_columnconfigure(5, minsize = 96)
self.data_frame.grid_columnconfigure(6, minsize = 96)
self.data_frame.grid_columnconfigure(7, minsize = 96)
self.data_frame.grid_columnconfigure(8, minsize = 96)
self.data_frame.grid_columnconfigure(9, minsize = 96)
master.bind("<Return>", self.company_details)
Label(self.frame, bg = "#ededed", font = "Helvetica 20", text = "Enter ASX Code").grid(row = 0, column = 0, sticky = W, padx = 5, pady = 5)
Label(self.frame, bg = "#ededed", font = "Helvetica 20", text = "Current Price").grid(row = 2, column = 0, sticky = W, padx = 5, pady = 5)
self.entryVar = StringVar()
Entry(self.frame, width = 12, font = "Helvetica 20", textvariable = self.entryVar).grid(row = 0, column = 1, padx = 5, pady = 5)
self.companyVar = StringVar()
Label(self.frame, font = "Helvetica 20", textvariable = self.companyVar).grid(row = 1, column = 0, columnspan = 2, sticky = W, padx = 5, pady = 5)
self.priceVar = DoubleVar()
Label(self.frame, font = "Helvetica 20", textvariable = self.priceVar).grid(row = 2, column = 1, sticky = W, padx = 5, pady = 5)
self.priceVar.set("")
Label(self.frame, bg = "#ededed", font = "Helvetica 20", text = "Current Action").grid(row = 3, column = 0, sticky = W, padx = 5, pady = 5)
Label(self.frame, bg = "#ededed", font = "Helvetica 20", text = "Current Holdings").grid(row = 7, column = 0, pady = 5)
Label(self.frame, bg = "#ededed", width = 10, font = "Helvetica 14 bold", text = "Name").grid(row = 8, column = 0, columnspan = 2, padx = 5, pady = 5)
Label(self.frame, bg = "#ededed", width = 10, font = "Helvetica 14 bold", text = "Code").grid(row = 8, column = 2, padx = 5, pady = 5, sticky = E)
Label(self.frame, bg = "#ededed", width = 10, font = "Helvetica 14 bold", text = "Buy Date").grid(row = 8, column = 3, padx = 5, pady = 5)
Label(self.frame, bg = "#ededed", width = 10, font = "Helvetica 14 bold", text = "Quantity").grid(row = 8, column = 4, padx = 5, pady = 5)
Label(self.frame, bg = "#ededed", width = 10, font = "Helvetica 14 bold", text = "Paid").grid(row = 8, column = 5, padx = 5, pady = 5)
Label(self.frame, bg = "#ededed", width = 10, font = "Helvetica 14 bold", text = "Brokerage").grid(row = 8, column = 6, padx = 5, pady = 5)
Label(self.frame, bg = "#ededed", width = 10, font = "Helvetica 14 bold", text = "Total").grid(row = 8, column = 7, padx = 5, pady = 5)
Label(self.frame, bg = "#ededed", width = 10, font = "Helvetica 14 bold", text = "Current").grid(row = 8, column = 8, padx = 5, pady = 5)
Label(self.frame, bg = "#ededed", width = 10, font = "Helvetica 14 bold", text = "Total").grid(row = 8, column = 9,padx = 5, pady = 5)
Label(self.frame, bg = "#ededed", width = 10, font = "Helvetica 14 bold", text = "Loss/Gain").grid(row = 8, column = 10, padx = 5, pady = 5)
Label(self.frame, bg = "#ededed", text = "Amount").grid(row = 16, column = 10, padx = 5, pady = 5, sticky = E)
Label(self.frame, bg = "#ededed", text = "Amount").grid(row = 16, column = 9, padx = 5, pady = 5, sticky = E)
Label(self.frame, bg = "#ededed", text = "Amount").grid(row = 16, column = 8, padx = 5, pady = 5, sticky = E)
Button(self.frame, width = 11, text = "New Record", command = self.new_record).grid(row = 16, column = 0, padx = 5, pady = 5, sticky = E)
#Button(self.frame, width = 11, text = "Modify Record", command = self.new_record).grid(row = 16, column = 1, padx = 5, pady = 5)
Button(self.frame, width = 11, text = "Delete Record", command = self.delete_record).grid(row = 16, column = 2, padx = 5, pady = 5, sticky = E)
self.rows = 0
self.code_list = []
def validate_code(self):
soup = BeautifulSoup(urllib.request.urlopen("https://au.finance.yahoo.com/q?s=" + (self.code_entry.get() + ".AX")).read(), "html.parser")
element = soup.find("div", ("class", "title"))
name = element.find("h2")
self.name_entry.set(name.text[:-9])
def new_record(self):
top = self.top = Toplevel()
top.bind("<Return>", self.add)
Label(top, text = "Code: ").grid(row = 0, column = 0, sticky = E, padx = 5, pady = 5)
Label(top, text = "Name: ").grid(row = 2, column = 0, sticky = E, padx = 5, pady = 5)
Label(top, text = "Buy Date: ").grid(row = 3, column = 0, sticky = E, padx = 5, pady = 5)
Label(top, text = "Quantity: ").grid(row = 4, column = 0, sticky = E, padx = 5, pady = 5)
Label(top, text = "Paid: ").grid(row = 5, column = 0, sticky = E, padx = 5, pady = 5)
Label(top, text = "Brokerage: ").grid(row = 6, column = 0, sticky = E, padx = 5, pady = 5)
self.name_main = StringVar()
self.label1 = Label(self.data_frame, textvariable = self.name_main)
self.label1.grid(row = self.rows, column = 0, sticky = W)
self.name_main.set("")
self.name_entry = StringVar()
Entry(top, textvariable = self.name_entry).grid(row = 2, column = 1, padx = 5, pady = 5)
self.name_entry.set("")
self.code_main = StringVar()
self.label2 = Label(self.data_frame, textvariable = self.code_main)
self.label2.grid(row = self.rows, column = 1, sticky = EW)
self.code_main.set("")
self.code_entry = StringVar()
Entry(top, textvariable = self.code_entry, validatecommand = self.validate_code).grid(row = 0, column = 1, padx = 5, pady = 5)
self.code_entry.set("")
self.date_main = StringVar()
self.label3 = Label(self.data_frame, textvariable = self.date_main)
self.label3.grid(row = self.rows, column = 2, sticky = EW)
self.date_main.set("")
self.date_entry = StringVar()
Entry(top, textvariable = self.date_entry).grid(row = 3, column = 1, padx = 5, pady = 5)
self.date_entry.set("")
self.quantity_main = IntVar()
self.label4 = Label(self.data_frame, textvariable = self.quantity_main)
self.label4.grid(row = self.rows, column = 3, sticky = E)
self.quantity_main.set("")
self.quantity_entry = IntVar()
Entry(top, textvariable = self.quantity_entry).grid(row = 4, column = 1, padx = 5, pady = 5)
self.quantity_entry.set("")
self.paid_main = DoubleVar()
self.label5 = Label(self.data_frame, textvariable = self.paid_main)
self.label5.grid(row = self.rows, column = 4, sticky = E)
self.paid_main.set("")
self.paid_entry = DoubleVar()
Entry(top, textvariable = self.paid_entry).grid(row = 5, column = 1, padx = 5, pady = 5)
self.paid_entry.set("")
self.brokerage_main = DoubleVar()
self.label6 = Label(self.data_frame, textvariable = self.brokerage_main)
self.label6.grid(row = self.rows, column = 5, sticky = E)
self.brokerage_main.set("")
self.brokerage_entry = DoubleVar()
Entry(top, textvariable = self.brokerage_entry).grid(row = 6, column = 1, padx = 5, pady = 5)
self.brokerage_entry.set(29.95)
self.total_main = DoubleVar()
self.label7 = Label(self.data_frame, textvariable = self.total_main)
self.label7.grid(row = self.rows, column = 6, sticky = E)
self.total_main.set("")
self.current_main = DoubleVar()
self.label8 = Label(self.data_frame, textvariable = self.current_main)
self.label8.grid(row = self.rows, column = 7, sticky = E)
self.current_main.set("")
self.total_two_main = DoubleVar()
self.label9 = Label(self.data_frame, textvariable = self.total_two_main)
self.label9.grid(row = self.rows, column = 8, sticky = E)
self.total_two_main.set("")
self.loss_gain_main = DoubleVar()
self.label10 = Label(self.data_frame, textvariable = self.loss_gain_main)
self.label10.grid(row = self.rows, column = 9, sticky = E)
self.loss_gain_main.set("")
Button(top, text = "Validate code", command = self.validate_code).grid(row = 1, column = 1, padx = 5, pady = 5)
Button(top, text = "Add", command = self.add).grid(row = 7, column = 1, sticky = W, padx = 5, pady = 5)
Button(top, text = "Cancel", command = self.cancel).grid(row = 7, column = 1, sticky = E, padx = 5, pady = 5)
def add(self, event = None):
self.rows += 1
self.code_list.append(self.code_entry.get())
code = str.upper(self.code_entry.get())
self.code_main.set(code)
self.name_main.set(self.name_entry.get())
self.date_main.set(self.date_entry.get())
self.quantity_main.set(self.quantity_entry.get())
paid = self.paid_entry.get()
self.paid_main.set("$%.2f" % paid)
brokerage = self.brokerage_entry.get()
self.brokerage_main.set("$%.2f" % brokerage)
total = self.quantity_entry.get() * self.paid_entry.get() + self.brokerage_entry.get()
self.total_main.set("$%.2f" % total)
self.current_main.set("$" + str(ystockquote.get_price(self.code_entry.get() + ".AX")))
curent_main = float(ystockquote.get_price(self.code_entry.get() + ".AX"))
total_two = curent_main * self.quantity_entry.get()
self.total_two_main.set("$%.2f" % total_two)
rounded = ((total_two/total * 100) - 100)
self.loss_gain_main.set("%.2f" % rounded + "%")
self.top.destroy()
def cancel(self, event = None):
self.top.destroy()
def delete_record(self):
top = self.top = Toplevel()
top.bind("<Return>", self.delete)
Label(top, text = "Please enter code of record to be deleted: ").grid(row = 0, column = 0, sticky = E, padx = 5, pady = 5)
self.code_entry_delete = StringVar()
Entry(top, textvariable = self.code_entry_delete).grid(row = 0, column = 1, padx = 5, pady = 5)
self.code_entry_delete.set("")
Button(top, text = "Delete Record", command = self.delete).grid(row = 1, column = 1, padx = 5, pady = 5)
Button(top, text = "Cancel", command = self.cancel).grid(row = 1, column = 0, padx = 5, pady = 5)
def delete(self, event = None):
if self.code_entry_delete.get() in self.code_list:
self.label1.grid_forget()
self.label2.grid_forget()
self.label3.grid_forget()
self.label4.grid_forget()
self.label5.grid_forget()
self.label6.grid_forget()
self.label7.grid_forget()
self.label8.grid_forget()
self.label9.grid_forget()
self.label10.grid_forget()
self.top.destroy()
def company_details(self, event):
self.priceVar.set("$" + (ystockquote.get_price(self.entryVar.get() + ".AX")))
soup = BeautifulSoup(urllib.request.urlopen("https://au.finance.yahoo.com/q?s=" + (self.entryVar.get() + ".AX")).read(), "html.parser")
element = soup.find("div", ("class", "title"))
name = element.find("h2")
self.companyVar.set(name.text[:-9])
def onFrameConfig(self, event):
self.canvas.configure(scrollregion = self.canvas.bbox("all"))
if __name__ == "__main__":
master = Tk()
master.title("Share Program")
app = Shares(master)
master.geometry("1235x528+20+40")
master.mainloop()
Je suggère la création d'un bon nombre de cadres pour garder les étiquettes de sorte que vous pouvez simplement supprimer tout le cadre. –
Merci pour la suggestion - Je n'arrive pas vraiment à comprendre comment cela fonctionnerait, mais je ne pense pas que ce soit faisable puisque j'ai placé mon cadre dans une toile avec une barre de défilement pour que vous puissiez ajouter autant de lignes comme vous voulez et la toile s'élargira pour répondre à cela. La façon dont je le vois, en créant beaucoup d'images limitera les entrées au nombre d'images que je crée. – SGB
Oui, mais vous pouvez créer autant d'images que vous le souhaitez. –