Tkinter: вернуть массив из функции - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь создать окно, в которое я могу ввести разные значения. Окно должно динамически адаптироваться к фрейму данных. Это работает довольно хорошо до сих пор. Теперь я хочу вывести входные данные в виде массива. Массив также может быть напечатан в функции.

Конечно, глупый вопрос ... но как мне получить доступ к массиву вне функции?

Обычно я получаю доступ к возвращаемому значению следующим образом:

def x(y):
    y+1
    return y

y2 = x(2)
print(y2)
--> 3

Я впервые работаю с tkinter. Обычно я получаю Array примерно так:

ar = d.apply(self)

Но потом я получил это: invalid command name ".!mydialog.!frame.!entry"

from tkinter import *
from tkinter import messagebox
from tkinter import simpledialog

class MyDialog(simpledialog.Dialog):
    def body(self, master):
        d2={}
        f={}
        self.entries=[]
        for i in range(len(df_data_1.columns) -1 ):
            Label(master, text=df_data_1.columns[i]).grid(row=i)
            entry = Entry(master)
            entry.grid(row=i, column=1)
            self.entries.append(entry)

    def apply(self):
        Array=[]
        i=0
        for entry in self.entries:
            value = entry.get()
            print(df_data_1.columns[i], value)
            Array = np.append(Array, value)
            i=i+1
        return Array

root = Tk()
d = MyDialog(root)

Может кто-нибудь помочь мне получить Array из функции?

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Программирование GUI работает иначе, чем процедурное программирование, потому что оно «управляемое событиями», что означает, что оно продолжает работать в бесконечном цикле, обрабатывая пользовательский ввод, пока не закончится. В конструкторе simpledialog.Dialog есть такой цикл, который возвращается только тогда, когда диалоговое окно закрывается или заканчивается. Это то, что вызывает метод apply(), когда пользователь нажимает кнопку OK , поэтому вам нужно что-то сделать, чтобы получить значение позже после завершения цикла обработки пользовательских событий. .

Чтобы обойти это и позволить вам использовать его так, как вы хотите, я определил функцию с именем get_array(), которая создает окно tkinter root, скрывает его, а затем вызывает диалоговое окно и ожидает его конец. Чтобы сделать возможным возврат Array, я сделал его атрибутом экземпляра класса MyDialog, чтобы к нему можно было получить доступ после завершения самого диалога. Так что get_array() возвращает это как результат.

import numpy as np
from tkinter import *
from tkinter import messagebox
from tkinter import simpledialog

class MyDialog(simpledialog.Dialog):
    def body(self, master):
        d2={}
        f={}
        self.entries=[]
        for i in range(len(df_data_1.columns)-1):
            Label(master, text=df_data_1.columns[i]).grid(row=i)
            entry = Entry(master)
            entry.grid(row=i, column=1)
            self.entries.append(entry)

    def apply(self):
        """ Copy Entry values into an np.array attribute. """

        self.Array = np.array([])  # Create empty attribute array.
        for i, entry in enumerate(self.entries):
            value = entry.get()
            print(df_data_1.columns[i], value)
            self.Array = np.append(self.Array, value)  # Update attribute.


def get_array():
    root = Tk()
    root.withdraw()
    d = MyDialog(root)
    # Return dialog "Array" attribute if it has one.
    return getattr(d, "Array", None)

if __name__ == '__main__':
    result = get_array()
    print(result)
0 голосов
/ 11 января 2019

Ваш код

Array=[]
...
Array = np.append(Array, value)

неверно - вы смешиваете пустые и нормальные массивы.

Просто замените Array = np.append(Array, value) на Array.append(value).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...