ткинтер работает только через функции? - PullRequest
1 голос
/ 10 мая 2019

Я сделал игру в крестики-нолики, используя PyCharm IDE. Я пытался заставить его работать с tkinter, но у меня возникли некоторые проблемы.

Моя программа просит пользователя выбрать между X и O, также если X играет первым или вторым. Также, если вы введете неправильный ответ, программа скажет пользователю, чтобы он напечатал свой ответ (с помощью оператора while). На tkinter я не могу этого сделать, например, когда программа спрашивает «Вы хотите X или O» и пользователь вводит X, а затем ok_button, эта информация нигде не хранится. И если я попытаюсь вставить цикл while, он перейдет в бесконечный цикл (поскольку он проходит по первому ответу, который пользователь нажал ok)

У меня вопрос, как я могу создать последовательность, поскольку tkinter работает с классами и функциями (по крайней мере, я не знаю что-то еще). Например: Программа спрашивает «Хотите ли вы быть Х или О?» , после ввода правильного ввода в программу, программа должна спросить «Хотите идти первым или вторым?» .

from tkinter import *

def name_choose(x):
     # "print" message to Label
     message["text"] = player_decide(x)[2]
     # how do i store that info below ? so i can use it later
     player_1 =player_decide(x)[0]    
     player_2 =player_decide(x)[1]


window = Tk()
....
message = Label(window_frame1)
message.place(relwidth=0.5, relheight=1)

entry = Entry(window_frame1)
entry.place(relx=0.55, relwidth=0.2, relheight=1)

button_Ok = Button(window_frame1, text="Ok", command = lambda: name_choose(entry.get()) )
button_Ok.place(relx=0.8, relwidth=0.2, relheight=1)

....
window.mainloop()

def player_decide(player_1):
    player_2 = ""
    if player_1.upper() == "X":
        message = "Player 1 : X , Player 2 : O"
        player_2 = "O"
        game_status = 1
    elif player_1.upper() == "O":
        player_2 = "X"
        message = "Player 1 : O , Player 2 : X"
        game_status = 1
    else:
        message = "Retry Input"
        game_status = 0
    return player_1, player_2, message , game_status

1 Ответ

0 голосов
/ 10 мая 2019

Вот фиксированный код:

from tkinter import *

def name_choose(x):
     # "print" message to Label
     message["text"] = player_decide(x)[2]
     # how do i store that info below ? so i can use it later
     player_1 =player_decide(x)[0]    
     player_2 =player_decide(x)[1]


window = Tk()
....
message = Label(window_frame1)
message.place(relwidth=0.5, relheight=1)

entry = Entry(window_frame1)
entry.place(relx=0.55, relwidth=0.2, relheight=1)

button_Ok = Button(window_frame1, text="Ok", command = lambda: name_choose(entry.get()) )
button_Ok.place(relx=0.8, relwidth=0.2, relheight=1)

....
def player_decide(player_1):
    player_2 = ""
    if player_1.upper() == "X":
        message = "Player 1 : X , Player 2 : O"
        player_2 = "O"
        game_status = 1
    elif player_1.upper() == "O":
        player_2 = "X"
        message = "Player 1 : O , Player 2 : X"
        game_status = 1
    else:
        message = "Retry Input"
        game_status = 0
    return player_1, player_2, message , game_status

window.mainloop()

Проблема заключалась в том, что у вас была определена функция после основного цикла.Убедитесь, что весь код запущен до запуска mainloop.

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