Программирование 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)