Команда Python Tkinter Сброс переменных - PullRequest
0 голосов
/ 02 мая 2019

Итак, я пытаюсь написать игру Tic-Tac-Toe. Я пытаюсь обновить значения после нажатия кнопки. Обновления не залипают и сбрасываются после каждого нажатия кнопки. Я абсолютно озадачен и я новичок, поэтому, пожалуйста, объясните мне, почему мне нужно объявить turn как глобальный в методе main (), так и в методе on_click.

Также краткое объяснение того, почему лямбда: inx = count: on_click (inx) работает, но лямбда: on_click (count) не будет работать.

Любые советы, которые помогут улучшить работу этого кода или сделать его более понятным, будут фантастическими. Я тоже не привык использовать классы, поэтому это все функции. Еще не знаю, где и когда использовать классы.

Я попробовал почти все, что мог придумать, чтобы решить эту проблему, но я не могу понять это.

    import tkinter


    def on_click(inx):
        buttonfont = ('helvetica', 100, 'bold')
        global turn
        turn += 1
        spot = {}

        if turn % 2 == 0:
            buttons[inx].configure(text='O', width=200, height=200, compound='center', state='disabled', font=buttonfont, disabledforeground='blue')
            spot.update({inx: 'O'})
        else:
            buttons[inx].configure(text='X', width=200, height=200, compound='center', state='disabled', font=buttonfont, disabledforeground='red')
            spot.update({inx: 'X'})


    def create_window_and_buttons():
        game_window = tkinter.Tk()
        game_window.title('Tic-Tac-Toe')
        for i in range(0, 3):
            game_window.rowconfigure(i, weight=1)
            game_window.columnconfigure(i, weight=1)
        game_window.geometry('600x600')
        global pixel
        pixel = tkinter.PhotoImage(width=1, height=1)
        count = 0
        for i in range(3):
            for j in range(3):
                buttons.append(tkinter.Button(game_window, image=pixel, width=200, height=200, command=lambda inx=count:
                                              on_click(inx)))
                buttons[count].grid(row=i, column=j, sticky='NSEW')
                count += 1

        return game_window


    def main():
        global turn
        turn = 0
        global buttons
        buttons = []
        game_window = create_window_and_buttons()
        game_window.mainloop()


    if __name__ == '__main__':
        main()

Я ожидал, что он обновит словарь, а затем продолжит добавлять значения, но вместо этого он сбрасывается каждый раз. Также имелась та же проблема с переменной поворота перед установкой ее как глобальной в main () и on_click ().

1 Ответ

1 голос
/ 02 мая 2019

Вы сбрасываете spot диктовку каждый раз, когда выполняете on_click.Просто переместите его наружу к основной функции:

import tkinter

spot = {}

def on_click(inx):
   buttonfont = ('helvetica', 100, 'bold')
   global turn
   turn += 1
   #spot = {}
   ...

И почему lambda: on_click(count) не работает так, как вы предполагаете, это связано с поздним связыванием закрытия Python, и вы можете прочитать его здесь .

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