Reputation: 512
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
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