Tkinter:从函数返回数组

时间:2019-01-11 13:19:13

标签: python numpy tkinter

我正在尝试创建一个窗口,可以在其中输入不同的值。 该窗口应动态适应数据框。 到目前为止,效果很好。 现在我想将输入输出为数组。 数组也可以在函数中打印。

肯定是一个愚蠢的问题...但是我如何才能访问函数外部的数组?

通常,我可以按如下方式访问返回值:

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 :(得分:2)

GUI编程的工作方式不同于过程式编程,因为它是“事件驱动的”,这意味着它一直在无限循环中运行,处理用户输入直到结束。 simpledialog.Dialog的构造函数中有这样的循环,仅在关闭或结束对话框窗口时返回。当用户单击 OK 按钮时,它就是调用apply()方法的地方,因此您必须在此处进行一些操作,以便在用户事件之后稍后可以检索该值,处理循环结束。

要解决此问题并允许您以所需的方式使用它,我定义了一个名为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)

答案 1 :(得分:0)

您的代码

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

不正确-您正在混合numpy和普通数组。

只需将Array = np.append(Array, value)替换为Array.append(value)