Самый эффективный способ сделать входную сетку 9x9 в Python, используя Tkinter? - PullRequest
0 голосов
/ 23 сентября 2018

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

from tkinter import *

main = Tk()



a1 = Entry(main)
a2 = Entry(main)
a3 = Entry(main)


a1.place(x=0, y=0, width=40)
a2.place(x=40, y=0, width = 40)
a3.place(x=80, y=0, width = 40)


main.mainloop()

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

Вы можете сделать это с помощью пользовательского класса и словаря для хранения данных ваших ящиков;сохранил это как test.py, см. изображение результатов sample image

import tkinter as tk
root = tk.Tk()


class Entry(tk.Entry):
    def __init__(self, master, x, y):
        tk.Entry.__init__(self, master)

        self.data = tk.IntVar()
        self.textvariable = self.data
        self.grid(column=x, row=y)
        self.config(width=2)
        self.data.trace('w', self.edit_entry)

    def edit_entry(self, *args):
        self.data.set(self.get())

boxes = {}

box_name = 1
for x in range(9):
    for y in range(9):
        boxes[box_name] = Entry(root, y, x)
        box_name += 1

def print_grid():
    box_name = 1
    for x in range(9):
        for y in range(9):
            print(boxes[box_name].get(), end=',')
            box_name += 1
        print('')
0 голосов
/ 23 сентября 2018

Используйте 2 вложенных для циклов, сохраняя виджеты Entry в списке, чтобы вы могли получить к ним доступ позже.

from tkinter import *

main = Tk()

entries = []
for a in range(0, 120, 40):
    for b in range(0, 120, 40):
        temp = Entry(main)
        temp.place(x=a, y=b, width=40, height=40)
        entries.append(temp)

main.mainloop()
...