【问题标题】:Can I edit a Label Frame that is not in the same function in tkinter?我可以在 tkinter 中编辑不在同一功能中的标签框吗?
【发布时间】:2020-01-15 19:39:17
【问题描述】:

我正在编写一个程序,单击按钮后,用户将打开一个文本文件。然后,还应该将文本文件的内容打印到按钮的父窗口中的标签框架中。当我尝试执行此操作时,出现错误:NameError: name 'LabelFrame' is not defined。是否可以编辑不在同一功能中的标签Frame?

编辑: 这是代码的sn-p。间距可能有点偏,抱歉。

import tkinter as tk
from tkinter import *
from tkinter import filedialog

def PerformTestScreen():
     performTestScreen = Toplevel(window)
     performTestScreen.geometry("400x225+10+560")
     performTestScreen.title("Perform Test")

     loadProg = Button(performTestScreen, text="Load Test", command=openPrevTest).grid(row = 0, column= 0, pady=10,padx=10, ipadx=30)

     paramFrame = LabelFrame(performTestScreen, text="Parameters",padx=15, pady=30)
     paramFrame.grid(row=1,column=0, pady=10, padx=10)
     test = Label(paramFrame, text = "this is a test label").grid(row=0, column=0)

def openPrevTest():
     fileName = filedialog.askopenfilename(filetypes = (("txt files", "*.txt"),("All Files", "*.*")))

     print(fileName)
     data = open(fileName).read()
     print(data) # prints contents of text file to terminal
     printParam = Label(performTestScreen.paramFrame, text=data)
     printParam.grid(row=2,column=0)

window=tk.Tk()

btn=Button(window, text="Perform Test", command = PerformTestScreen).grid(row=1, column=1, pady=20, padx=20, ipadx=30)

window.title('Entry Screen')
window.geometry("400x160+10+10")
window.mainloop()

【问题讨论】:

  • 你能分享一些相关的sn-ps吗?谢谢。
  • 我可以在这里看到一些问题。首先,您的函数中有缩进问题。 5 个空格而不是 4 个。第二个你引用 performTestScreen 作为一个函数和一个容器。您对 2 个不同的事物使用相同的名称。这会导致问题。
  • 我更改了名称,所以它们不一样,但我仍然收到相同的错误@Mike-SMT

标签: python python-3.x tkinter


【解决方案1】:

你需要在这里纠正一些事情。

  1. 你的缩进不好。我看到 5 个空格而不是 4 个。

  2. 你有几行代码属于你的函数,但在函数之外。将代码移动到问题时可能是一个错误,但现在它是一个问题。

  3. 您需要将 labelFrame 传递给您的第二个函数才能使用它。除非您将其定义为全局变量,否则您不能简单地在它创建的函数之外调用顶层窗口变量名称。

  4. 不要同时使用from tkinter import *import tkinter as tk。我想说最好的方法就是使用import tkinter as tk,因为这有助于防止任何方法被错误地覆盖。

  5. 最后我重写了一些名称和固定间距,以遵循 PEP8 样式指南以获得更简洁的代码。

这是您的代码经过必要的更正清理了一下。

如果您有任何问题,请告诉我。

import tkinter as tk
from tkinter import filedialog


def perform_test_screen():
    top = tk.Toplevel(window)
    top.geometry('400x225+10+560')
    top.title('Perform Test')
    param_frame = tk.LabelFrame(top, text='Parameters', padx=15, pady=30)
    param_frame.grid(row=1, column=0, pady=10, padx=10)
    tk.Button(top, text='Load Test',
              command=lambda: open_prev_test(param_frame)).grid(row=0, column=0, pady=10, padx=10, ipadx=30)
    tk.Label(param_frame, text='this is a test label').grid(row=0, column=0)


def open_prev_test(param_frame):
    file_name = filedialog.askopenfilename(filetypes=(('txt files', '*.txt'), ('All Files', '*.*')))
    print(file_name)
    data = open(file_name).read()
    print(data)  # prints contents of text file to terminal
    print_param = tk.Label(param_frame, text=data)
    print_param.grid(row=2, column=0)


window = tk.Tk()
window.title('Entry Screen')
window.geometry('400x160+10+10')
tk.Button(window, text='Perform Test', command=perform_test_screen).grid(row=1, column=1, pady=20, padx=20, ipadx=30)
window.mainloop()

【讨论】:

  • 非常感谢!我最近才开始用 Python 编码,我一直在尝试解决这个问题。再次感谢!
  • @sergio 欢迎您。请记住,函数是自包含的,除非另有说明,否则函数内部的所有内容都保留在那里。
猜你喜欢
  • 2013-06-06
  • 2021-12-23
  • 2021-11-29
  • 2021-07-23
  • 2020-01-30
  • 1970-01-01
  • 1970-01-01
  • 2020-10-24
  • 1970-01-01
相关资源
最近更新 更多