我正在嘗試構建一個用于資料分析的工具。我希望這種應用程式變得更大,所以我遵循 MVC 模式盡可能地組織它。
我的結果保存在 .csv 檔案中,所以目標應該是將它們“匯入”到 GUI 中。我想使用“CTRL O”作為鍵系結打開這些檔案,當然也使用選單欄中的相應選項。
現在到實際問題:點擊“CTRL O”時呼叫的函式在 Controller 類中并按預期作業,我可以打開一堆檔案,串列保存每個名稱。但是當使用選單欄時,我很困惑如何實作“command=”選項。
這是我的代碼:
import tkinter as tk
from tkinter.filedialog import askopenfilename
from tkinter.constants import ANCHOR, TRUE
from tkinter import Label, filedialog
from tkinter import ttk
class Model():
# more to come
pass
class View:
def __init__(self, view):
self.view = view
self.view.title("analyzer")
self.view.geometry("640x480")
self.view.resizable(False, False)
# menubar
self.menubar = tk.Menu(self.view)
self.view.config(menu=self.menubar)
self.filemenu = tk.Menu(self.menubar, tearoff=False)
self.menubar.add_cascade(label="File", menu=self.filemenu)
self.filemenu.add_command(label="Open", accelerator="Ctrl O", command=Controller.get_open_filename())
self.filemenu.add_separator()
self.filemenu.add_command(label="Remove", accelerator="Ctrl R")
self.filemenu.add_command(label="Information", accelerator="Ctrl I")
self.filemenu.add_separator()
self.filemenu.add_command(label="Exit", accelerator="Ctrl E", command=self.view.quit)
class Controller:
def __init__(self):
self.root = tk.Tk()
self.view = View(self.root)
# keybindings / shortcuts
self.root.bind_all("<Control-e>", lambda event: self.root.quit())
self.root.bind_all("<Control-o>", lambda event: self.get_open_filename())
self.list_of_files = []
def run(self):
self.root.mainloop()
def get_open_filename(self):
self.filename = askopenfilename(title="Select data file", filetypes=(("csv files", "*.csv"), ("all files", "*.*")))
self.list_of_files.append(self.filename)
print(self.list_of_files)
if __name__ == "__main__":
c = Controller()
c.run()
我真的很感激如果有人能給我一個提示,希望我做錯了。謝謝!
uj5u.com熱心網友回復:
您試圖從 View 物件呼叫 Controller 函式,但 View 不知道 Controller 具有該函式。它不知道 Controller 存在。
可能有比這更好的方法,但您可以將函式作為引數傳遞給 View 的建構式。通過將該get_open_filename()函式作為引數傳遞給 View 的建構式,您可以將其用作命令。
注意:我呼叫了引數func以便您可以看到我在做什么。不過我建議給它一個更好的名字。
import tkinter as tk
from tkinter.filedialog import askopenfilename
from tkinter.constants import ANCHOR, TRUE
from tkinter import Label, filedialog
from tkinter import ttk
class Model():
# more to come
pass
class View:
def __init__(self, view, func):
self.view = view
self.view.title("analyzer")
self.view.geometry("640x480")
self.view.resizable(False, False)
# menubar
self.menubar = tk.Menu(self.view)
self.view.config(menu=self.menubar)
self.filemenu = tk.Menu(self.menubar, tearoff=False)
self.menubar.add_cascade(label="File", menu=self.filemenu)
self.filemenu.add_command(label="Open", accelerator="Ctrl O", command=func)
self.filemenu.add_separator()
self.filemenu.add_command(label="Remove", accelerator="Ctrl R")
self.filemenu.add_command(label="Information", accelerator="Ctrl I")
self.filemenu.add_separator()
self.filemenu.add_command(label="Exit", accelerator="Ctrl E", command=self.view.quit)
class Controller:
def __init__(self):
self.root = tk.Tk()
self.view = View(self.root, lambda: self.get_open_filename())
# keybindings / shortcuts
self.root.bind_all("<Control-e>", lambda event: self.root.quit())
self.root.bind_all("<Control-o>", lambda event: self.get_open_filename())
self.list_of_files = []
def run(self):
self.root.mainloop()
def get_open_filename(self):
self.filename = askopenfilename(title="Select data file", filetypes=(("csv files", "*.csv"), ("all files", "*.*")))
self.list_of_files.append(self.filename)
print(self.list_of_files)
if __name__ == "__main__":
c = Controller()
c.run()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/383972.html
