tkinter - как получить значения из строк / столбцов таблицы ввода Dynami c? - PullRequest
0 голосов
/ 04 августа 2020

Я изучаю tkinter, ценю ваш опыт и терпение! Я создаю GUI, где вы нажимаете кнопку, чтобы добавить строки или столбцы. См. здесь . Когда я нажимаю «Добавить Mov ie», я получаю окно, которое выглядит как это . Когда я нажимаю «Добавить критерии оценки», я получаю это. И так далее, бесконечно.

Это работает как задумано. Однако Я не знаю, как получить эту таблицу записей в массив, который будет использоваться для 'get ()' входных значений . Я пробовал numpy hstack, vstack, concatenate, append и т.д. c. но это не сработает, если они не одного размера.

Как лучше всего это сделать ? См. Мой фрагмент кода ниже. Заранее спасибо!

import tkinter as tk
from functools import partial
import numpy as np
import pandas as pd

#%% CREATE CLASS
class movieRatings:
    
    numberOfMovies = 1
    numberOfRateCriteria = 1
    
    masterEntryArray = [['Movie'],['Rating']]

    def __init__(self,root):
        
        self.root=root

        #create frame
        self.optionsFrame = tk.Frame(root)
        self.optionsFrame.pack(fill=tk.X,side=tk.TOP)
        self.optionsFrame.config(bg='blue',
                                 height = self.windowHeight/10)
               
        #%% CONTENT FOR OPTIONS FRAME       
                        
        self.addMovieButton = tk.Button(self.optionsFrame)
        self.addMovieButton.pack(expand=tk.TRUE,fill=tk.BOTH,side=tk.LEFT)
        self.addMovieButton.config(text='Add Movie', command=self.addMovieFunction)
        
        self.addRatingButton = tk.Button(self.optionsFrame)
        self.addRatingButton.pack(expand=tk.TRUE,fill=tk.BOTH,side=tk.LEFT)
        self.addRatingButton.config(text='Add Rating Criteria', command=self.addRatingFunction)
     
        #%% CONTENT FOR CONTENT FRAME
        
        self.movieNameLabel = tk.Label(self.contentFrame)
        self.movieNameLabel.grid(row=0,column=0)
        self.movieNameLabel.config(text='Movie Name')
        
        self.movieRateCriteriaLabel = tk.Label(self.contentFrame)
        self.movieRateCriteriaLabel.grid(row=0,column=1)
        self.movieRateCriteriaLabel.config(text='Rating')
        
        self.initialMovieEntry = tk.Entry(self.contentFrame,width=5,fg='blue',font=('Arial',16,))
        self.initialMovieEntry.grid(row=1,column=0)
        
        self.initialRatingEntry = tk.Entry(self.contentFrame,width=5,fg='blue',font=('Arial',16,))
        self.initialRatingEntry.grid(row=1,column=1)
        
        # np.concatenate((self.masterEntryArray,[self.initialMovieEntry,self.initialRatingEntry]))

    #%% FUNCTIONS FOR OPTIONS FRAME
    
    def addMovieFunction(self):
        #add new entry row
        _newRow = []
        
        for eachCol in range(self.numberOfRateCriteria+1):
            _newEntry = tk.Entry(self.contentFrame)
            _newEntry.grid(row=self.numberOfMovies+1,column=eachCol)
            _newEntry.config(width=5,fg='blue',font=('Arial',16,))
            _newRow.append(_newEntry)
        self.numberOfMovies += 1
        # np.vstack(self.masterEntryArray, _newRow)
        # print(self.masterEntryArray)
        
    def addRatingFunction(self):
        #add new entry cols
        for eachRow in range(self.numberOfMovies+1):
            _newEntry = tk.Entry(self.contentFrame)
            _newEntry.grid(row=eachRow,column=self.numberOfRateCriteria+1)
            _newEntry.config(width=5,fg='blue',font=('Arial',16,))
        self.numberOfRateCriteria += 1
        
#%% MAIN FUNCTION

def main():
    #create parent window
    root = tk.Tk()
    app = movieRatings(root)
    root.mainloop()
  
#%% CALL MAIN

if __name__ == "__main__": main()

Боковое примечание: я также пытаюсь найти способ, чтобы, когда я нажимаю 'tab', чтобы l oop через ячейки, он работал так, как вы ожидаете. Прямо сейчас, когда добавляются новые строки / столбцы, он будет l oop через каждую из добавленных строк / столбцов, как свою собственную таблицу.

...