tkinter 使用菜单中的文件名更新标签 class

tkinter update label with filename from menu class

我正在尝试遵循面向对象的方法来创建一个简单的 tkinter 应用程序来显示一些数据,但我正在努力在选择文件的菜单栏 class 和主应用程序之间传递值class 我最终将在何处处理该文件。现在我只是想在标签中的屏幕上显示文件名。我已尝试将文件名作为 tk.StringVar 传递,但这并未在屏幕上更新。下面是简化的代码。

import tkinter as tk
from tkinter import filedialog as fd #needed for file dialogues
from tkinter import ttk

class MenuBar(tk.Menu):
  def __init__(self):
    super().__init__()
    self.file_audio = tk.StringVar()

    fileMenu = tk.Menu(self, tearoff=0)
    fileMenu.add_command(label="Select file...", command=self.select_file)
    self.add_cascade(label="File", menu=fileMenu)

  # method to select a single file
  def select_file(self):
    self.file_audio = fd.askopenfilename(title='Open a file')
    
class App(tk.Tk):
  def __init__(self):
    super().__init__()

    self.title('Title')
    self.geometry("800x300")
    
    self.menubar = MenuBar()
    self.config(menu=self.menubar)

    self.createWidgets()

  def createWidgets(self):
    self.file_info = ttk.Label(self, text = self.menubar.file_audio)
    self.file_info.grid(column=1, row=1)

def main():
  app = App()
  app.mainloop()
    
if __name__ == "__main__":
  main()

不确定这是否是您要查找的内容。但是我添加了一行我认为可能有用的代码。在“createWidgets”方法中,您应该调用 self.menubar.select_file().

import tkinter as tk
from tkinter import filedialog as fd #needed for file dialogues
from tkinter import ttk

class MenuBar(tk.Menu):
  def __init__(self):
    super().__init__()
    self.file_audio = tk.StringVar()

    fileMenu = tk.Menu(self, tearoff=0)
    fileMenu.add_command(label="Select file...", command=self.select_file)
    self.add_cascade(label="File", menu=fileMenu)

  # method to select a single file
  def select_file(self):
    self.file_audio = fd.askopenfilename(title='Open a file')

class App(tk.Tk):
  def __init__(self):
    super().__init__()

    self.title('Title')
    self.geometry("800x300")
 
    self.menubar = MenuBar()
    self.config(menu=self.menubar)

    self.createWidgets()

  def createWidgets(self):
    self.menubar.select_file() #Added line of code
    self.file_info = ttk.Label(self, text = self.menubar.file_audio)
    self.file_info.grid(column=1, row=1)

def main():
  app = App()
  app.mainloop()

if __name__ == "__main__":
  main()

您的代码中有两个问题:

    应使用
  1. textvariable 选项,而不是 ttk.Label(...)
  2. 中的 text 选项
  def createWidgets(self):
    self.file_info = ttk.Label(self, textvariable = self.menubar.file_audio)
    self.file_info.grid(column=1, row=1)
  1. MenuBar.select_file()
  2. 中使用self.file_audio.set(...)代替赋值
  def select_file(self):
    self.file_audio.set(fd.askopenfilename(title='Open a file'))