Как бы я хотел добавить опцию и дополнительные функции в этот код - PullRequest
0 голосов
/ 31 марта 2019

У меня есть кадр, который считывает данные из текстового файла и отображает их построчно. Каждая строка хранится в виде отдельной метки, и пользователь может щелкнуть эти метки. Если щелкнуть ярлык, он удаляется визуально со страницы, а также удаляется эта строка в текстовом файле. Теперь я хочу сделать так, чтобы при нажатии на метку у пользователя была возможность либо отредактировать данные из текстового файла / метки, либо удалить строку, как раньше.

def newbooking():

    def populate(frame2):
        count = 0
        removeLbl = Label(frame2,text='Click on the selected booking you wish to delete:',
                          font=('Courier',23),bg='#333333',fg='#CCCCCC')
        removeLbl.grid(row=0,column=0)

        #class to allow highlighting and deleting of displayed data
        class HighlightLabel(Label):
            def __init__(self,master=None,highlight='grey',lowlight=None,**kwargs):
                super().__init__(master,**kwargs)
                if lowlight is None:
                    lowlight = self['bg']

                self.bind('<Enter>', lambda *args: self.config(bg=highlight))
                self.bind('<Leave>', lambda *args: self.config(bg=lowlight))
                self.bind('<Button-1>',self.deleteClick)

            #function which stops the clicked label from being displayed
            def deleteClick(self,*args):
                if not deleteActiveBtn:
                    return
                deleteLine(self['text'])

                self.destroy()

        deleteActiveBtn = True

        #function which deletes clicked data from text file
        def deleteLine(deleteData):

            with open('Bookings.txt') as f:
                oldFile = f.readlines()

            with open('Bookings.txt','w') as f:
                print(deleteData)
                old1 =([[item for item in line.strip().split()] for line in oldFile])
                for old1 in oldFile:
                    print(old1)
                    if old1 != (deleteData+"\n"):
                        f.write(old1)
                    elif old1 != (deleteData): #last line in file doesn't have \n
                        f.write(old1)                       

        #displays the data from the text file in line by line format
        with open('Bookings.txt','r+') as f:
            bookings  = ([[item for item in line.strip().split()] for line in f])
        for booking in bookings:
            bookingData = HighlightLabel(frame2,text=booking,width=60,anchor='w',bg='#333333',fg='#CCCCCC')
            bookingData.grid(row=count,column=3)
            count+=5

Прямо сейчас все работает нормально, но я за кнопкой? возможность редактирования или удаления, а также функциональность для редактирования данных.

1 Ответ

0 голосов
/ 31 марта 2019

Вы можете создать всплывающее меню и привязать его к каждому виджету. В моем примере я только редактирую или удаляю метки, но не меняю файл.

from tkinter import *
from tkinter import simpledialog

class PopupMenuDemo(Frame):
    def __init__(self):
        Frame.__init__(self)
        self.pack(expand=True, fill='both')
        self.master.title("Popup Menu Demo")
        self.master.geometry("300x200")

        self.frame = Frame(self, bg='tan')
        self.frame.pack(expand=YES, fill=BOTH)

        # Create some sample data for labels
        file_lines = ['One', 'Two', 'Three', 'Four']
        # Create labels
        self.label_list = []    # Save label widgets in a list
        for line in file_lines:
            label = Label(self.frame, text=line, width=10, bg='white')
            label.pack(pady=(10,0))
            self.label_list.append(label)

        self.menu = Menu(self.frame, tearoff=0)
        self.menu.add_command(label='Delete', command=self.label_delete)
        self.menu.add_command(label='Edit', command=self.label_edit)
        # Bind every widget to <Button-1>
        for widget in self.label_list:
            widget.bind("<Button-1>", self.popup_menu)

    def popup_menu(self, event):
        self.widget = event.widget  # Remember which widget was clicked
        self.menu.post(event.x_root, event.y_root)

    def label_delete(self):
        self.widget.destroy()

    def label_edit(self):
        text = self.widget.cget('text')
        result = simpledialog.askstring('Change data', 'Edit the line',
                                        initialvalue=text)
        self.widget.config(text=result)

if __name__ == "__main__":
    PopupMenuDemo().mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...