Я использую Python 2.7 и Tkinter. Я почти новичок в объектно-ориентированных программах. У меня есть длинная программа со многими окнами Tkinter, и в какой-то момент я прошу пользователя загрузить файл Excel, который я прочитал с помощью Pandas, и хочу постоянно использовать и обновлять это значение (переменной данных). То, как я это делаю сейчас, - это глобальные переменные, но я знаю, что это опасно, неэффективно и не очень элегантно.
Несмотря на то, что я мог делать controller.show_frame (framename) с учетом того, как мой класс gui построен, я в конечном итоге создал некоторые из фреймов, так что переменная данных обновила бы себя.
Я прочитал и попробовал несколько ответов в Stack Overflow, но, возможно, неправильно использовал их:
- Попробовал создать словарь внутри класса gui, что-то вроде
self.app_data = {data=[],filename=""}
и обновить его из других окон. Дело в том, что я считаю, что класс gui запускается только один раз и он создает все остальные классы окон так что это не сработало. Возможно, я сделал что-то не так. (не отображается в коде). - Пытался сделать что-то, что было предложено здесь, но я просто не мог заставить его работать.
Основной кадр - это своего рода промежуточный шаг, который мне нужен для других целей; следующий код - это упрощение моей программы.
Я знаю, что это ужасный кошмарный код! Спасибо:)
import Tkinter as tk
import pandas as pd
import tkFileDialog
import tkMessageBox
global data, strat_columns, filename
data = pd.DataFrame([])
strat_columns = []
filename = ""
class gui(tk.Tk):
data = pd.DataFrame([])
filename = ""
def __init__(self):
tk.Tk.__init__(self)
container = tk.Frame(self)
container.pack(side="top",fill="both",expand=True)
self.frames = {}
for F in (main_frame, first_frame):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame(main_frame)
def show_frame(self,sel_frame):
frame = self.frames[sel_frame]
frame.tkraise()
def get_page(self, page_class):
return self.frames[page_class]
class main_frame(tk.Frame):
def __init__(self,parent,controller):
tk.Frame.__init__(self,parent)
self.parent = parent
self.controller = controller
button_new = tk.Button(self,
text="New window",
command=lambda: self.button_new_callback())
button_new.pack()
def button_new_callback(self,*args,**kwargs):
self.controller.show_frame(first_frame)
class first_frame(tk.Frame):
def __init__(self,parent,controller):
tk.Frame.__init__(self,parent)
self.controller = controller
self.parent = parent
self.show_frame = controller.show_frame
statusText.set("Press Browse button and browse for file, then press the Go button")
label = tk.Label(self, text="Please load a file: ")
label.pack()
entry = tk.Entry(self, width=50)
entry.pack()
button_go = tk.Button(self,
text="Go",
command=lambda: self.button_go_callback(entry,statusText,message))
button_browse = tk.Button(self,
text="Browse",
command=lambda: self.button_browse_callback(entry))
button_go.pack()
button_browse.pack()
message = tk.Label(self, textvariable=statusText)
message.pack()
def button_browse_callback(self,entry):
global filename
filename = tkFileDialog.askopenfilename()
entry.delete(0, tk.END)
entry.insert(0, filename)
def button_go_callback(self,entry,statusText,message):
global data
input_file = entry.get()
data = pd.read_excel(filename)
sf = second_frame(self.parent, self)
sf.grid(row=0, column=0, sticky="nsew")
sf.tkraise()
class second_frame(tk.Frame):
pass
if __name__ == "__main__":
my_gui = gui()
my_gui.mainloop()
my_gui.title("TEST")