У меня есть основной код, который содержит несколько функций, и я проверил его, и он прекрасно работает. Затем я создаю класс для окна tkinter и тестирую его отдельно, и он также работает нормально. Когда я объединяю их обоих вместе, создавая объект класса внутри функции, я получаю это сообщение об ошибке:

"TclError: can't invoke "frame" command: application has been destroyed"

import tkinter

class InputFromForm():
    def __init__(self, root, values):
        self.field = []
        self.fieldStrings = values
        self.temp = self.makeform(self.fieldStrings)

    def makeform(self, fields):
        entries = []
        for i in fields:
            row = tkinter.Frame(root)
            lab = tkinter.Label(row, width=15, text=i, anchor='w')
            ent = tkinter.Entry(row)
            ent.insert(tkinter.END, fields[i])
            ent.bind("<FocusIn>", lambda event, e=ent: e.selection_range(0, tkinter.END))
            row.pack(side=tkinter.TOP, fill=tkinter.X, padx=5, pady=10)
            lab.pack(side=tkinter.LEFT)
            ent.pack(side=tkinter.RIGHT, expand=tkinter.YES, fill=tkinter.X)
            entries.append((i, ent))

        return entries


    def fetch(self, entries):
        for entry in entries:
            string = entry[0]
            text  = entry[1].get()
            self.field.append(text)
        return self.field

    def close(self, root):
        root.destroy()


def extractData(dOfValues):
    root = tkinter.Tk()
    root.title('Test')
    userInput = InputFromForm(root, dOfValues)
    root.bind('<Return>', (lambda event, e=userInput.temp: userInput.fetch(e)))
    b1 = tkinter.Button(root, text='OK',command=(lambda e=userInput.temp: [userInput.fetch(e), userInput.close(root)]))
    b1.config(width=25)
    b1.pack(anchor=tkinter.CENTER, padx=5, pady=20)


    root.mainloop()



if __name__ == '__main__':


    dOfValues = {'Customer No.': '',
            'PO #':'020202',
            'Order Date': '2/3/2012',
            'Zip to code':'92182'}

    #root = tkinter.Tk()
    #root.title('Test')

    #userInput = InputFromForm(root, dOfValues)

    #root.bind('<Return>', (lambda event, e=userInput.temp: userInput.fetch(e)))
    #b1 = tkinter.Button(root, text='OK',command=(lambda e=userInput.temp: [userInput.fetch(e), userInput.close(root)]))
    #b1.config(width=25)
    #b1.pack(anchor=tkinter.CENTER, padx=5, pady=20)


    #root.mainloop()
    extractData(dOfValues)  # Adding this, creates the error. If I put the code 
                            # from this function into main, it works. 

Может кто-нибудь объяснить, что происходит?

-1
paul 28 Май 2019 в 19:46

2 ответа

Лучший ответ

@paul "Печать и возврат абсолютно не связаны"

Вы уверены? попробуйте этот код. Я думаю, вы можете изменить его, чтобы получить то, что

Вы хотите, значения на ваших полях, если я понимаю, что вы хотите.

import tkinter as tk
from tkinter import messagebox

class InputFromForm(tk.Tk):
    def __init__(self, root, values):
        self.field = []
        self.entries = []
        self.fieldStrings = values
        self.temp = self.makeform(self.fieldStrings)

    def makeform(self, fields):

        entries = []

        for i in fields:
            row = tk.Frame()
            lab = tk.Label(row, width=15, text=i, anchor='w')
            ent = tk.Entry(row)
            ent.insert(tk.END, fields[i])
            ent.bind("<FocusIn>", lambda event, e=ent: e.selection_range(0, tk.END))
            row.pack(side=tk.TOP, fill=tk.X, padx=5, pady=10)
            lab.pack(side=tk.LEFT)
            ent.pack(side=tk.RIGHT, expand=tk.YES, fill=tk.X)
            entries.append((i, ent))

        return entries 


    def fetch(self, entries):
        for entry in entries:
            string = entry[0]
            text  = entry[1].get()
            self.field.append(text)
        return self.field

    def close(self, root):

        msg = "Do you want to quit?\nI've this data for you\n {0}".format(self.field)

        if messagebox.askokcancel("Simple App", msg):
            root.destroy()



def extractData(dOfValues):
    root = tk.Tk()
    root.title('Test')
    userInput = InputFromForm(root, dOfValues)
    root.bind('<Return>', (lambda event, e=userInput.temp: userInput.fetch(e)))
    b1 = tk.Button(root, text='OK',command=(lambda e=userInput.temp: [userInput.fetch(e), userInput.close(root)]))
    b1.config(width=25)
    b1.pack(anchor=tk.CENTER, padx=5, pady=20)


    root.mainloop()

if __name__ == '__main__':


    dOfValues = {'Customer No.': '',
            'PO #':'020202',
            'Order Date': '2/3/2012',
            'Zip to code':'92182'}

    #root = tk.Tk()
    #root.title('Test')

    #userInput = InputFromForm(root, dOfValues)

    #root.bind('<Return>', (lambda event, e=userInput.temp: userInput.fetch(e)))
    #b1 = tk.Button(root, text='OK',command=(lambda e=userInput.temp: [userInput.fetch(e), userInput.close(root)]))
    #b1.config(width=25)
    #b1.pack(anchor=tk.CENTER, padx=5, pady=20)


    #root.mainloop()
    extractData(dOfValues)  # Adding this, creates the error. If I put the code 
                            # from this function into main, it works. 
1
1966bc 28 Май 2019 в 18:48

Я не совсем уверен, в чем проблема, однако я внес некоторые изменения

По вашему сценарию. Сначала я импортирую tkinter как tk, затем я наследую ваш

Класс от до, см. ниже.

import tkinter as tk

class InputFromForm(tk.Tk):
    def __init__(self, root, values):
        self.field = []
        self.fieldStrings = values
        self.temp = self.makeform(self.fieldStrings)

    def makeform(self, fields):
        entries = []
        for i in fields:
            row = tk.Frame()
            lab = tk.Label(row, width=15, text=i, anchor='w')
            ent = tk.Entry(row)
            ent.insert(tk.END, fields[i])
            ent.bind("<FocusIn>", lambda event, e=ent: e.selection_range(0, tk.END))
            row.pack(side=tk.TOP, fill=tk.X, padx=5, pady=10)
            lab.pack(side=tk.LEFT)
            ent.pack(side=tk.RIGHT, expand=tk.YES, fill=tk.X)
            entries.append((i, ent))

        return entries


    def fetch(self, entries):
        for entry in entries:
            string = entry[0]
            text  = entry[1].get()
            self.field.append(text)
        return self.field

    def close(self, root):
        root.destroy()


def extractData(dOfValues):
    root = tk.Tk()
    root.title('Test')
    userInput = InputFromForm(root, dOfValues)
    root.bind('<Return>', (lambda event, e=userInput.temp: userInput.fetch(e)))
    b1 = tk.Button(root, text='OK',command=(lambda e=userInput.temp: [userInput.fetch(e), userInput.close(root)]))
    b1.config(width=25)
    b1.pack(anchor=tk.CENTER, padx=5, pady=20)


    root.mainloop()

if __name__ == '__main__':


    dOfValues = {'Customer No.': '',
            'PO #':'020202',
            'Order Date': '2/3/2012',
            'Zip to code':'92182'}

    #root = tk.Tk()
    #root.title('Test')

    #userInput = InputFromForm(root, dOfValues)

    #root.bind('<Return>', (lambda event, e=userInput.temp: userInput.fetch(e)))
    #b1 = tk.Button(root, text='OK',command=(lambda e=userInput.temp: [userInput.fetch(e), userInput.close(root)]))
    #b1.config(width=25)
    #b1.pack(anchor=tk.CENTER, padx=5, pady=20)


    #root.mainloop()
    extractData(dOfValues)  # Adding this, creates the error. If I put the code 
                            # from this function into main, it works. 

Я получил это

enter image description here

0
1966bc 28 Май 2019 в 17:47
56346792