user215865
user215865

Reputation: 512

Print Dataframe in a window in Tkinter

I am trying to click a button on Window 1 which should open a new Window2 to display a dataframe which was created in a function in Window1. I am also trying to create a quit button on window2 to just close the window2 and go back to window1. I am new to tkinter, found out i can use treeview to display a datafrae, written below code but i am getting a blank window2.

Can someone tell me what wrong Iam doing here or if any other methods i need to use?

import tkinter as tk
from tkinter import filedialog, messagebox, ttk
import pandas as pd



class Window1():
    
    def __init__(self, master):
        # Create labels, entries,buttons
        self.master = master
        self.master.geometry("500x400")
        self.frame = tk.Frame(self.master)
        self.frame.pack()
        
        self.label6 = tk.Label(self.frame, height=1, width=15, text="Display dataframe on new window.") 
        self.label6.grid(row=8, column=1, columnspan=1,padx=10, pady=10)
        self.button6 = tk.Button(self.frame, height=1, width=15, text="Print", command= self.f6)
        self.button6.grid(row=8,column=2,columnspan=1, padx=10, pady=10)
        
        
        self.label8 = tk.Label(self.frame, height=1, width=15, text="Exit") 
        self.label8.grid(row=20, column=1, columnspan=1,padx=10, pady=10)
        self.button8 =tk.Button(self.frame,height=1, width=15, text='Exit Program', command=master.destroy)
        self.button8.grid(row=20,column=2,columnspan=1, padx=10, pady=10)
        
        self.spacelabel3 = tk.Label(self.frame, text="        ")
        self.spacelabel3.grid(row=21,padx=10, pady=30)
    

# If button is clicked, run this methods
   def f5(self):
        #dataframe is created in this function and used in one of the buttons.)            
        return(df1)
    

  def f6(self):
     self.newWindow = tk.Toplevel(self.master)
     self.app = Window2(self.newWindow)

class Window2:
    def __init__(self,master,df1):
        self.master = master
        # self.master.geometry("500x400")
        self.frame = tk.Frame(self.master)
        # Frame for TreeView
        frame1 = tk.LabelFrame(self, text="Input Data")
        frame1.pack(fill="both", expand="true")
        frame1.pack_propagate(0)
        
        # the size of the window.
        self.geometry("500x500")
        self.resizable(0, 0)
        self.title("Data Collected for Transformation") # the window title
        
        # This creates your Treeview widget.
        tv1 = ttk.Treeview(frame1)
        tv1.place(relheight=1, relwidth=1) # set the height and width of the widget to 100% of its container (frame1).

        treescrolly = tk.Scrollbar(frame1, orient="vertical", command=tv1.yview) # command means update the yaxis view of the widget
        treescrollx = tk.Scrollbar(frame1, orient="horizontal", command=tv1.xview) # command means update the xaxis view of the widget
        tv1.configure(xscrollcommand=treescrollx.set, yscrollcommand=treescrolly.set) # assign the scrollbars to the Treeview Widget
        treescrollx.pack(side="bottom", fill="x") # make the scrollbar fill the x axis of the Treeview widget
        treescrolly.pack(side="right", fill="y") # make the scrollbar fill the y axis of the Treeview widget
        
        
        # this loads the dataframe into the treeview widget
        tv1["column"] = list(df1.columns)
        tv1["show"] = "headings"
        for column in tv1["columns"]:
            tv1.heading(column, text=column) # let the column heading = column name

        df_rows = df1.to_numpy().tolist() # turns the dataframe into a list of lists
        for row in df_rows:
            tv1.insert("", "end", values=row) # inserts each list into the treeview. For parameters see https://docs.python.org/3/library/tkinter.ttk.html#tkinter.ttk.Treeview.insert


        self.button7 = tk.Button(self.frame, text = 'Close Window', width = 25, command = self.close_windows)
        self.button7.grid(row=10,column=2,columnspan=1, padx=10, pady=10)
        
    def close_windows(self):
        self.master.destroy()
    


def main(): #run mianloop 
    root = tk.Tk()
    app = Window1(root)
    root.mainloop()
    app.title('Hi')

if __name__ == '__main__':
    main()

Upvotes: 0

Views: 419

Answers (1)

Yash Makan
Yash Makan

Reputation: 764

Try this :

import tkinter as tk
from tkinter import filedialog, messagebox, ttk
import pandas as pd


def f5(): # change
    #dataframe is created in this function and used in one of the buttons.)            
    return(df1)

class Window1():
    
    def __init__(self, master):
        # Create labels, entries,buttons
        self.master = master
        self.master.geometry("500x400")
        self.frame = tk.Frame(self.master)
        self.frame.pack()
        
        self.label6 = tk.Label(self.frame, height=1, width=15, text="Display dataframe on new window.") 
        self.label6.grid(row=8, column=1, columnspan=1,padx=10, pady=10)
        self.button6 = tk.Button(self.frame, height=1, width=15, text="Print", command= self.f6)
        self.button6.grid(row=8,column=2,columnspan=1, padx=10, pady=10)
        
        
        self.label8 = tk.Label(self.frame, height=1, width=15, text="Exit") 
        self.label8.grid(row=20, column=1, columnspan=1,padx=10, pady=10)
        self.button8 =tk.Button(self.frame,height=1, width=15, text='Exit Program', command=master.destroy)
        self.button8.grid(row=20,column=2,columnspan=1, padx=10, pady=10)
        
        self.spacelabel3 = tk.Label(self.frame, text="        ")
        self.spacelabel3.grid(row=21,padx=10, pady=30)
    

    def f6(self):
        self.newWindow = tk.Toplevel(self.master)
        self.app = Window2(self.newWindow,f5())

class Window2:
    def __init__(self,master,df1):
        self.master = master
        # self.master.geometry("500x400")
        self.frame = tk.Frame(self.master)
        # Frame for TreeView
        frame1 = tk.LabelFrame(self, text="Input Data")
        frame1.pack(fill="both", expand="true")
        frame1.pack_propagate(0)
        
        # the size of the window.
        self.geometry("500x500")
        self.resizable(0, 0)
        self.title("Data Collected for Transformation") # the window title
        
root=tk.Tk()
Window1(root)

Take f5() out of the class

Upvotes: 0

Related Questions