Состояние массива в ткинтер - PullRequest
0 голосов
/ 07 ноября 2018

Я написал фрагмент кода, который я хочу улучшить при вводе элементов. Он позволяет мне сначала вставлять данные только в первый индекс, а затем позволяет второму блоку вставлять данные и т. Д. как отключить состояния других элементов массива?

import tkinter as tk

root=tk.Tk()
root.title("Looping of entry box")
root.geometry("1200x600")



def ApplytoLabel():
    xx=size.get()
    for i in range(xx):
        element = box_list[i].get() # Get value from corresponding Entry
        ArrayLabel=tk.Label(ArrayR,text="Array Element: " + element,font="Arial 12 bold",bg="red",fg="white",bd="5")
        ArrayLabel.pack()

box_list = []   # Create list of Entrys
def Boxes():
    xx=size.get()
    for i in range(xx):        
        box=tk.Entry(ArrayR,font="Arial 10 bold",bd="5",width="5")
        box.pack(side="left")
        box_list.append(box)    # Append current Entry to list
    ApplytoLabel1=tk.Button(ArrayR,text="Submit To Array",command=ApplytoLabel)
    ApplytoLabel1.pack()




Array = tk.Frame(root)
Array.pack()

text1=tk.Label(Array,text="Enter the Size of Array:",
               font="Arial 10 bold",fg="blue")
text1.grid(row=0,column=0,sticky="w")

size=tk.IntVar()

ArraySize=tk.Entry(Array,textvariable=size)
ArraySize.grid(row=0,column=1,sticky="w")

SizeofArray=tk.Button(Array,text="Submit",command=Boxes)
SizeofArray.grid(row=0,column=2,sticky="w")

ArrayR = tk.Frame(root)
ArrayR.pack()



root.mainloop()

1 Ответ

0 голосов
/ 07 ноября 2018

Это один из способов:

import tkinter as tk

root=tk.Tk()
root.title("Looping of entry box")
root.geometry("1200x600")

def ApplytoLabel():
    xx=size.get()
    for i in range(xx):
        if box_list[i].cget('state') == 'normal':
            element = box_list[i].get() # Get value from corresponding Entry
            ArrayLabel=tk.Label(ArrayR,text="Array Element: " + element,font="Arial 12 bold",bg="red",fg="white",bd="5")
            ArrayLabel.pack()
            box_list[i].configure(state='disabled')
            try:
                box_list[i+1].configure(state='normal')
            except IndexError: pass
            break

box_list = []   # Create list of Entrys
def Boxes():
    xx=size.get()
    for i in range(xx):
        box=tk.Entry(ArrayR,font="Arial 10 bold",bd="5",width="5",state='disabled' if i else 'normal')
        box.pack(side="left")
        box_list.append(box)    # Append current Entry to list
    ApplytoLabel1=tk.Button(ArrayR,text="Submit To Array",command=ApplytoLabel)
    ApplytoLabel1.pack()

Array = tk.Frame(root)
Array.pack()

text1=tk.Label(Array,text="Enter the Size of Array:",
               font="Arial 10 bold",fg="blue")
text1.grid(row=0,column=0,sticky="w")

size=tk.IntVar()

ArraySize=tk.Entry(Array,textvariable=size)
ArraySize.grid(row=0,column=1,sticky="w")

SizeofArray=tk.Button(Array,text="Submit",command=Boxes)
SizeofArray.grid(row=0,column=2,sticky="w")

ArrayR = tk.Frame(root)
ArrayR.pack()

root.mainloop()

В общем, вы, вероятно, захотите, чтобы каждая кнопка была на обратном вызове lambda с ApplytoLabel, получающим один параметр, чтобы вам не приходилось зацикливаться (и прерываться) каждый раз. Я также завернул бы все в классе.

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