Попытка вызвать диапазон экземпляров из класса, использующего циклы for - PullRequest
0 голосов
/ 08 января 2019

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

Таким образом, в основном вся цель состоит в том, чтобы сделать рабочую версию линкора. Я достигну этого, сделав большую сетку кнопок для игровой площадки обоих игроков (где размещены их корабли). В настоящее время я просто пытаюсь настроить способ отключения одной сетки во время хода одного игрока (чтобы они не могли атаковать свои собственные корабли), а другой - для другого игрока. Однако я изо всех сил пытаюсь вызвать кнопки по их названию, используя функцию цикла, которая у меня есть ниже (с именем enableAndDisableFunc)

Это все просто настроено для пользовательского интерфейса

from tkinter import *
from tkinter import messagebox

base = Tk()

# **********************************
# UI SETUP *************************
# **********************************

# Base ****************************

baseTitle = Frame(base)
baseTitle.config(background="orange", height=20)
baseTitle.pack(side=TOP, fill=X)

baseTop = Frame(base)
baseTop.config(background="blue")
baseTop.pack(side=TOP, fill="both")

baseBottom = Frame(base)
baseBottom.config(background="black", height=40)
baseBottom.pack(side=BOTTOM, fill="both")

# root ********************************

rootPL1 = Frame(baseTop)
rootPL1.config(background="red")
rootPL1.pack(side=LEFT)

emptySpace = Frame(baseTop)
emptySpace.config(background="grey", width=30)
emptySpace.pack(side=LEFT)

rootPL2 = Frame(baseTop)
rootPL2.config(background="red")
rootPL2.pack(side=LEFT)

# Sect(ion) *******************************************

SectPL1 = Frame(rootPL1)
SectPL1.config(background="green", height=30)
SectPL1.pack(side=TOP, fill=X)

SectGridPL1 = Frame(rootPL1)
SectGridPL1.config(background="blue", height=400, width=150)
SectGridPL1.pack(side=BOTTOM)

SectPL2 = Frame(rootPL2)
SectPL2.config(background="green", height=30)
SectPL2.pack(side=TOP, fill=X)

SectGridPL2 = Frame(rootPL2)
SectGridPL2.config(background="blue", height=400, width=150)
SectGridPL2.pack(side=BOTTOM)

# Pl(ayer) ***********************************

PL1ButGrid = Frame(SectGridPL1)
PL1ButGrid.grid(row=8, column=8)

PL1ShipHitCountTagLabel = Label(SectPL1, text="Ship Hit Count", anchor=E, padx=3)
PL1ShipHitCountTagLabel.pack(side=LEFT)

PL1ShipHitCount = 0
PL1ShipHitCountLabel = Label(SectPL1, text=str(PL1ShipHitCount), anchor=E, padx=3)
PL1ShipHitCountLabel.pack(side=LEFT)

# *********************************************

PL2ButGrid = Frame(SectGridPL2)
PL2ButGrid.grid(row=8, column=8)

PL2ShipHitCountTagLabel = Label(SectPL2, text="Ship Hit Count", anchor=E, padx=3)
PL2ShipHitCountTagLabel.pack(side=LEFT)

PL2ShipHitCount = 0
PL2ShipHitCountLabel = Label(SectPL2, text=str(PL2ShipHitCount), anchor=E, padx=3)
PL2ShipHitCountLabel.pack(side=LEFT)

# Switch Turn Button ********************************

SwitchButton = Button(baseBottom, width=20, height=2, text="Switch Turn to Other Player",
                      command=lambda: enableAndDisableFunc())
SwitchButton.pack(side=TOP)

# Title *********************************************
titleLabel = Label(baseTitle, text="Battleship!", font="Arial", fg="black", bg="orange", padx=10, pady=10)
titleLabel.pack(side=TOP)

Эта часть загружает класс, который создает все кнопки, из которых сделаны сетки игрока

# classes and methods
def colourChanger(self):
    self.button.config(bg="red")

    global PL2ShipHitCount
    global PL1ShipHitCount

    PL1ShipHitCount += 1
    PL2ShipHitCount += 1

    PL1ShipHitCountLabel.config(text=PL1ShipHitCount)
    PL2ShipHitCountLabel.config(text=PL2ShipHitCount)

    print("Working for cell " + str(self) + "!")

И, наконец, в этом разделе генерируются значения каждой кнопки (с использованием нескольких циклов для получения всех деталей о каждой строке, столбце, идентификаторе и метке)

grid1namelist = []
grid2namelist = []

class GameBoardButtons:

    def __init__(self, name, buttonText, buttonRow, buttonColumn, buttonState, frame):
        self.name = name
        self.button = Button(frame, text=buttonText, fg="grey", state=buttonState, command=lambda: colourChanger(self))
        self.button.grid(row=buttonRow, column=buttonColumn)

    def enable(self):
        self.button.config(state=NORMAL)

    def disable(self):
        self.button.config(state=DISABLED)

def buttonGen(givenFrame, iState):
    for i in range(1, 65):
        if 1 <= int(i) <= 8:
            iText = "A" + str(i)
            rowNum = 1
            colNum = i
        if 9 <= int(i) <= 16:
            iText = "B" + str((i % 8) + 1)
            rowNum = 2
            colNum = (i % 8) + 1
        if 17 <= int(i) <= 24:
            iText = "C" + str((i % 8) + 1)
            rowNum = 3
            colNum = (i % 8) + 1
        if 25 <= int(i) <= 32:
            iText = "D" + str((i % 8) + 1)
            rowNum = 4
            colNum = ((i % 8) + 1)
        if 33 <= int(i) <= 40:
            iText = "E" + str((i % 8) + 1)
            rowNum = 5
            colNum = ((i % 8) + 1)
        if 41 <= int(i) <= 48:
            iText = "F" + str((i % 8) + 1)
            rowNum = 6
            colNum = ((i % 8) + 1)
        if 49 <= int(i) <= 56:
            iText = "G" + str((i % 8) + 1)
            rowNum = 7
            colNum = ((i % 8) + 1)
        if 57 <= int(i) <= 64:
            iText = "H" + str((i % 8) + 1)
            rowNum = 8
            colNum = ((i % 8) + 1)
        if str(givenFrame) == ".!frame2.!frame.!frame2":
            iFrameValue = str(1)
            iName = "grid" + iFrameValue + "but" + iText
            grid1namelist.append(iName)
        else:
            iFrameValue = str(2)
            iName = "grid" + iFrameValue + "but" + iText
            grid2namelist.append(iName)

        iName = GameBoardButtons(iName, iText, rowNum, colNum, iState, givenFrame)
        print(iName)

# Main setup for grids
buttonGen(SectGridPL1, iState=NORMAL)
buttonGen(SectGridPL2, iState=DISABLED)

def enableAndDisableFunc():
    switchTurnPopUp(1)
    switchTurnPopUp(2)
    messagebox.showinfo("Turn Switcher", "It is now player " + str(2) + "'s turn")

def switchTurnPopUp(gridNum):
    if gridNum == 1:
        for i in grid1namelist:
            i.button.enable()
    if gridNum == 2:
        for i in grid2namelist:
            i.button.disable()

base.mainloop()

Как отключить (установить state=DISABLED) один полный набор кнопок на одной сетке (всю сетку 1 или, другими словами, все возможности "grid1" + От "A" до "H" + (от "1" до "8" ). Это позволит игроку только выбирать координаты сетки на сетке своих оппонентов, используя функцию отключения tkinter.

Большое спасибо, извините за большой дамп кода и грязный порядок кода, всем и любой помощи очень признателен!

1 Ответ

0 голосов
/ 08 января 2019

Вопрос : Попытка вызвать диапазон экземпляров

Если вы используете gridxnamelist только для целей toogle, его устаревание.

Изменить следующее:

  • Передать Решетку Frame на switchTurnPopUp

    def enableAndDisableFunc():
        switchTurnPopUp(SectGridPL1)
        switchTurnPopUp(SectGridPL2)
    
  • Замените ваш switchTurnPopUp следующим:

    def switchTurnPopUp(grid):
        # Unkown 'state' for this 'grid'
        state = None
    
        # Get all children 'id' from this 'grid'
        children = grid.children
    
        # Loop the children 'id'
        for c in children:
    
            # Get the 'widget' of this 'id'
            widget = children[c]
    
            # Process only 'Button' widgets
            if isinstance(widget, (Button)):
    
                # Check the 'state' only once
                if state is None:
    
                    # Get the current 'state' of the first 'Button'
                    state = widget.cget('state')
    
                    # Toogle the state
                    if state == 'normal':
                        state = 'disabled'
                    elif state == 'disabled':
                        state = 'normal'
    
                # Set the toogled 'state'
                widget.configure(state=state)
    

Протестировано с Python: 3,5 - TkVersion: 8,6

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