Python странная ошибка NameError для def - PullRequest
0 голосов
/ 18 июня 2020

Мой код не слишком длинный, поэтому вот вся программа, когда я запускаю ее, она говорит:

NameError: имя 'xmlp' не определено для строки 88

Это кажется слишком простым, что здесь происходит? Он работал прямо перед тем, как я взял извлечение, скопировал его и переименовал в xmlp, затем я сделал новую кнопку для его выполнения, но затем он сломался, почему он говорит, что он не определен, когда это очень четко?

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

import xml.etree.ElementTree as ET

interface = tk.Tk()
interface.geometry("900x500")
interface.title("Text display")

T = tk.Text(interface, height=20, width=150)
T.grid(column=1, row=2, columnspan=3)

def openfile(): # open your file and load it into the text widget

    global filename
    filename = filedialog.askopenfilename()
    print(filename)
    file = open(filename)
    global txt
    txt = file.read()

    T.delete('1.0', END)
    T.insert(tk.END, txt)

    return txt

def extract(): # take the opened file and write it to a text file
    open('somefile.txt', 'w').close()

    root = ET.fromstring(txt)

    str_params = root.findall('.//parameter/[parameterid="str"]')
    for param in str_params:
        if param.find('./name').text == 'Text':
            print(format(param.find('./value').text))
            with open('somefile.txt', 'a') as the_file:
                the_file.write(format(param.find('./value').text))
                the_file.write("\n")

    exportFileDir = open('somefile.txt',)

    txtExport = exportFileDir.read()

    T.delete('1.0', END)
    T.insert(tk.END,txtExport)

    def xmlp():  # take the opened file and write it to a text file
        open('somefile.txt', 'w').close()

        root = ET.fromstring(txt)

        str_params = root.findall('.//parameter/[parameterid="str"]')
        for param in str_params:
            if param.find('./name').text == 'Text2':
                print(format(param.find('./value').text))
                with open('somefile.txt', 'a') as the_file:
                    the_file.write(format(param.find('./value').text))
                    the_file.write("\n")

        exportFileDir = open('somefile.txt', )

        txtExport = exportFileDir.read()

        T.delete('1.0', END)
        T.insert(tk.END, txtExport)



def file_save():
    f = filedialog.asksaveasfile(mode='w', defaultextension=".txt")
    if f is None: # asksaveasfile return `None` if dialog closed with "cancel".
        return
    exportFileDir = open('somefile.txt')

    txtExport = exportFileDir.read()

    f.write(txtExport)
    f.close() # `()` was missing.

button = ttk.Button(interface, text="Open text File", command=openfile)  # <------
button.grid(column=1, row=3, sticky = W)

buttonex = ttk.Button(interface, text="Extract subtitles", command=extract)  # <------
buttonex.grid(column=2, row=3, sticky = W)

buttonexp = ttk.Button(interface, text="X XML P", command=xmlp)  # <------
buttonexp.grid(column=2, row=4, sticky = W)

buttonsv = ttk.Button(interface, text="Save as", command=file_save)  # <------
buttonsv.grid(column=3, row=3, sticky = W)

interface.mainloop()

Ответы [ 2 ]

2 голосов
/ 18 июня 2020

Вы определили функцию внутри функции:

def hi():
    def hello():
        print("Hello")
    hello()
    print("Hi")
hello()  # <- Error

, которая будет существовать только в локальной области действия функции.

Переместите функцию за пределы функции или (если вы действительно действительно хотите использовать такое решение) используйте global, чтобы определить его в глобальном пространстве имен:

def hi():
    global hello
    def hello():
        print("Hello")
    hello()
    print("Hi")
hello()  # <- No error, after hi()

Обратите внимание, что функция (hi()), которая определяет внутреннюю функцию (hello()) необходимо сначала вызвать в этом случае для выполнения global <name>, чтобы функция сохранялась в пространстве имен global вместо local.

1 голос
/ 18 июня 2020

Проблема с отступом (интервалы и табуляция) . Допустим, вы скопировали функцию function2. Что вы сделали:

def function1():
    print('hello 1')

    def function2():
        print('hello 2')

def function3():
    print('hello 3')

Но правильный способ:

def function1():
    print('hello 1')

def function2():
    print('hello 2')

def function3():
    print('hello 3')
...