Доступ к кнопкам Tkinter, найденным в словаре - PullRequest
0 голосов
/ 31 мая 2018

Я работаю над созданием «шашек», таких как сетка, используя кнопки tkinter.Я успешно создал каждую кнопку с правильными цветами, используя класс и цикл for.Я назначил, по крайней мере, попробовал имя каждой кнопке и сохранил его в словаре.Мой вопрос сейчас - как мне изменить конкретную кнопку, найденную в этом словаре?скажем, например, используя функции .configure () для изменения текста кнопок или чего-то еще.Есть ли способ или мне нужно переписать мой код по-другому?

Вот код:

from tkinter import *
import sys

class Checkers:

    def __init__(self, master):
        self.master = master
        master.title("A simple GUI")
        master.geometry("752x689")
        master.configure(bg="grey90")
        master.resizable(0, 0)

    def create_button(self, msg, setBg, x, y):
        self.bttn1 = Button(self, text=msg, width=12, height=5, bg=setBg)
        self.bttn1.grid(row=x, column=y)


def draw():

    root = Tk()
    app = Checkers(root)
    y = -1
    d ={}

    for z in range(8):
        y += 1
        for x in range(8):
            if  (y % 2) == 1 and (x % 2) == 1:
                d["button{}{}".format(x,y)] = Checkers.create_button(root, '', 'grey90', x, y)
                print(y,x)
            if  (y % 2) == 1 and (x % 2) == 0:
                d["button{}{}".format(x,y)] = Checkers.create_button(root, '', 'grey60', x, y)
                print(y,x)
            if  (y % 2) == 0 and (x % 2) == 1:
                d["button{}{}".format(x,y)] = Checkers.create_button(root, '', 'grey60', x, y)
                print(y,x)
            if (y % 2) == 0 and (x % 2) == 0:
                print(y,x)
                d["button{}{}".format(x,y)] = Checkers.create_button(root, '', 'grey90', x, y)


    root.mainloop()

draw()

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Используйте кортежи вместо вычисляемых строк

Я рекомендую использовать кортеж вместо строки в качестве индекса.Например:

...
d[(x,y)] = Checkers.create_button(...)
...

Позже, чтобы изменить что-то, вам просто нужно дать ему столбец и строку.Например, чтобы изменить кнопку на 4,6, просто:

d[(4,6)].configure(...)

Другая проблема

У вас также есть проблема, что create_button не возвращает кнопку.Нужно вернуть кнопку, чтобы вы могли ее настроить.

def create_button(self, msg, setBg, x, y):
    ...
    return self.bttn1

Лучшее решение

Еще лучше, если бы ваш класс Checkers поддерживал список кнопок и имелэто обеспечивает метод для обновления кнопки.Тогда вашему приложению не нужно «знать», что класс шашек использует кнопку.

Например:

class Checkers():
    def __init__(self, master):
        self.buttons = {}
        ...
    def create_button(self, msg, setBg, x, y):
        button = Button(self, text=msg, width=12, height=5, bg=setBg)
        button.grid(row=x, column=y)
        self.buttons[(x,y)] = button

    def update_button(self, x, y, text):
        self.buttons[(x,y)].configure(text=text)

Затем в любом месте вашего кода, который требуется обновить для кнопки, вы вызываете метод update_button в экземпляре Checkers:

app = Checkers(root)
...
app.update_button(4,6, "hello, world")
0 голосов
/ 31 мая 2018

Раньше я динамически создавал кнопки, но вместо этого использовал список.Если вы хотите использовать .configure() со словарем, используйте координаты сетки, которые вы использовали для указания кнопки (x, y).

def modify(x, y):
    d['button%s%s' % (x, y)].configure(...) 

Пример динамического создания кнопок со списками: (В классе)

def initialize(self, index):
    self.indexNum = index
    self.questions[self.indexNum] = tk.Button(...)
    self.questions[self.indexNum].place(x = widgetPositions[0], y = widgetPositions[1]) #This is just a tuple of grid positions

self.questions создан в разделе __init__ класса и содержит список объектов кнопок.Индекс просто указывает, какая кнопка должна быть назначена.Таким же способом вы можете получить доступ к кнопке для ваших целей, для ее настройки.

Пожалуйста, прокомментируйте, если у вас есть какие-либо вопросы.

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