Как вызвать две функции отдельно при условии использования кнопок tkinter? - PullRequest
0 голосов
/ 28 апреля 2018

Я пытаюсь создать базовую игру в tkinter, чтобы познакомиться с программированием GUI на Python. Я не пытаюсь сделать это эффективным, поэтому много раз копирую и вставляю одно и то же утверждение. Я пытаюсь сделать так, чтобы, когда пользователь нажимает кнопку, текст кнопки меняется на «X» или «O», в зависимости от того, у кого он получился. В моей кнопке у меня есть command =, за которой следует моя функция, чтобы изменить текст на любой из двух вариантов. Однако, когда я нажимаю на одну кнопку, вся сетка кнопок меняется на этот текст. Поэтому я пытаюсь выяснить, могу ли я использовать что-то подобное:

command =  lambda:[placeX() or placeO()] 

Мой код ниже:

import tkinter as tk, sys as s

Startwindow = tk.Tk()
Startwindow.title("Tic-Tac-Toe")
Startwindow.resizable(0,0)
Startwindow.geometry("1200x600")
image = tk.PhotoImage(file="C:\\Users\\Joshua Brown\\Desktop\\tic tac toe\\download.gif")
renderImage = tk.Label(image=image)
renderImage.grid()

def exe():
    print("Game has exited.")
    Startwindow.destroy()
    s.exit("Requested to close.")

def start():
    print("Game window opening...")
    gameWindow = tk.Tk()
    gameWindow.title("Tic-Tac-Toe: Game Window")
    gameWindow.geometry("450x483")
    gameWindow.resizable(0,0)
    Startwindow.iconbitmap(r'C:\Users\Joshua Brown\Desktop\tic tac toe\tictactoe_H4a_icon.ico')

    board1 = tk.Button(gameWindow, text = "1", command = lambda:[placeX(), placeO()], height = 10, width = 20)
    board1.grid(row=0, column=0)
    board2 = tk.Button(gameWindow, text = "2", command = lambda:[placeX(),placeO()], height = 10, width = 20)
    board2.grid(row=1, column=0)
    board3 = tk.Button(gameWindow, text = "3", command = lambda:[placeX(),placeO()], height = 10, width = 20)
    board3.grid(row=2, column=0)
    board4 = tk.Button(gameWindow, text = "4", command = lambda:[placeX(),placeO()], height = 10, width = 20)
    board4.grid(row=0, column=1)
    board5 = tk.Button(gameWindow, text = "5", command = lambda:[placeX(),placeO()], height = 10, width = 20)
    board5.grid(row=1, column=1)
    board6 = tk.Button(gameWindow, text = "6", command = lambda:[placeX(),placeO()], height = 10, width = 20)
    board6.grid(row=2, column=1)
    board7 = tk.Button(gameWindow, text = "7", command = lambda:[placeX(),placeO()], height = 10, width = 20)
    board7.grid(row=0, column=2)
    board8 = tk.Button(gameWindow, text = "8", command = lambda:[placeX(),placeO()], height = 10, width = 20)
    board8.grid(row=1, column=2)
    board9 = tk.Button(gameWindow, text = "9", command = lambda:[placeX(),placeO()], height = 10, width = 20)
    board9.grid(row=2, column=2)

    def placeX():
        board1.config(text='X')
        board2.config(text='X')
        board3.config(text='X')
        board4.config(text='X')
        board5.config(text='X')
        board6.config(text='X')
        board7.config(text='X')
        board8.config(text='X')
        board9.config(text='X')


    def placeO():
        board1.config(text='O')
        board2.config(text='O')
        board3.config(text='O')
        board4.config(text='O')
        board5.config(text='O')
        board6.config(text='O')
        board7.config(text='O')
        board8.config(text='O')
        board9.config(text='O')
    gameWindow.mainloop()

    if board1 and board2 and board3 == 'X':
        print("YEAH")


Startwindow.iconbitmap(r'C:\Users\Joshua Brown\Desktop\tic tac toe\tictactoe_H4a_icon.ico')
startButton = tk.Button(Startwindow, text = "Start Game", command = start, height = 1, width = 20, bg = '#ff3333')
startButton.config(font =("helvectia", 20))
startButton.grid()
exitButton = tk.Button(Startwindow, text = "Exit Game", command = exe, height = 1, width = 20, bg = '#ff3333')
exitButton.config(font =("helvectia", 20))
exitButton.grid()
Startwindow.configure(background = "white")

Startwindow.mainloop()

1 Ответ

0 голосов
/ 28 апреля 2018

Проблема с функциями placeX и placeO. Видите ли, все ваши кнопки относятся к одной функции (changeX / changeY), которая меняет все кнопки на X или Y.

def placeX():
    board1.config(text='X') #changes 1st button to x
    board2.config(text='X')
    board3.config(text='X')
    board4.config(text='X')
    board5.config(text='X')
    board6.config(text='X')
    board7.config(text='X')
    board8.config(text='X')
    board9.config(text='X') #and all the rest above it non-selectively, one click = change all

Вместо этого у вас должны быть отдельные функции для каждой кнопки

board1_placeX():
    board1.config(text='X') #changes only one of them

board2_placeX():
    board2.config(text='Y')

...and so on, define 9 of these, and another nine for placeO(), like board1_placeO() and so on

и когда вы определяете кнопку платы, используйте определенную функцию, например, если я определяю плату один, я буду использовать board1_placeX () / board1_placeO ()

board1 = tk.Button(gameWindow, text = "1", command = lambda:[board1_placeX(), board1_placeO()], height = 10, width = 20)
board1.grid(row=0, column=0)

и для доски 2 ...

board2 = tk.Button(gameWindow, text = "1", command = lambda:[board2_placeX(), board2_placeO()], height = 10, width = 20)
board2.grid(row=0, column=0)

... и так далее. Надеюсь, это поможет.

...