2022-11-26

How to change row-'value' every time i try to position a label using grid?

I am trying to create a terminal GUI using python tkinter module and I already managed to access the tk.Label from TextFrame class.

class TextFrame(tk.Frame):
    def __init__(self, container):
        super().__init__()
        self.container = container
        self['bg']='black'
        self.pack(fill='both', expand=True)
        self.label = tk.Label(self)

Now the problem is that, I can't change the row everytime I call show() function inside Instances class.

class Instances(Window):
    def __init__(self):
        super().__init__()
        self.string = tk.StringVar()

        self.index_row = 0

        self.text_frame = TextFrame(self)
        self.text_frame.pack()
        self.entry_frame = EntryFrame(self)
        self.entry_frame.pack(side='bottom',fill='both')

    def show(self, e):     
        textvar = self.string.get()
        self.entry_frame.entry.delete(0, 'end')
        self.text_frame.label.config(text=textvar)
        self.text_frame.label.grid(column=0, row=self.index_row, sticky="w")
        self.index_row += 1

Here is the full code of my problem:

import tkinter as tk

class Window(tk.Tk):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.geometry('800x600')
        self.title('Terminal')

                
class Instances(Window):
    def __init__(self):
        super().__init__()
        self.string = tk.StringVar()
        
        self.index_row = 0
        
        self.text_frame = TextFrame(self)
        self.text_frame.pack()
        self.entry_frame = EntryFrame(self)
        self.entry_frame.pack(side='bottom',fill='both')
        
    def show(self, e):     
        textvar = self.string.get()
        self.entry_frame.entry.delete(0, 'end')
        self.text_frame.label.config(text=textvar)
        self.text_frame.label.grid(column=0, row=self.index_row, sticky="w")
        self.index_row += 1
        

class TextFrame(tk.Frame):
    def __init__(self, container):
        super().__init__()
        self.container = container
        self['bg']='black'
        self.pack(fill='both', expand=True)
        self.label = tk.Label(self)
        
        
    
                                    
                                    
class EntryFrame(tk.Frame):
    def __init__(self, container):
        super().__init__()
        self.entry = tk.Entry(self,  textvariable=container.string)
        self.entry.pack(fill='both')
        self.entry.bind('<Return>', container.show) 
                                                                                                                          
if __name__ == '__main__':
    window = Instances()
    window.mainloop()
                   

Any help would be appreciated.

Problem Solved

I added 1 line of code on show() function

def show(self, e):     
        textvar = self.string.get()
        self.entry_frame.entry.delete(0, 'end')
        self.text_frame.label = tk.Label(self.text_frame, fg='green', bg='black')
        self.text_frame.label.config(text=textvar)
        if len(textvar) > 0 :
            self.text_frame.label.grid(column=0, row=self.index_row, sticky="w")
            self.index_row += 1


No comments:

Post a Comment