Могу ли я изменить рамку метки, которая не входит в ту же функцию в tkinter? - PullRequest
2 голосов
/ 15 января 2020

Я пишу программу, которая после нажатия кнопки позволяет пользователю открыть текстовый файл. Затем следует также распечатать содержимое текстового файла во фрейме метки, который находится в родительском окне кнопки. Когда я пытаюсь это сделать, я получаю сообщение об ошибке: NameError: имя 'LabelFrame' не определено. Можно ли отредактировать метку Frame, которая не входит в ту же функцию?

EDIT: здесь приведен фрагмент кода. Пространство может быть немного не очень, извините.

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()

1 Ответ

2 голосов
/ 15 января 2020

Здесь нужно исправить несколько вещей.

  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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...