Представление меню в Ткинтере - PullRequest
1 голос
/ 19 февраля 2020

Я пишу игру connect-4 с Tkinter, и я хотел бы представить пользователю несколько вариантов меню в ходе игры.

Проблема состоит в том, что меню, как правило, представляются вместе. , как в фрагменте кода ниже. Например, в present_player_choice () я хотел бы представить меню для playerA, получить ответ, а затем представить меню для playerB. Здесь это не так важно, но я постоянно сталкиваюсь с этой проблемой.

after (), по-видимому, не является ответом, поскольку я не хочу, чтобы меню исчезало через определенный промежуток времени, а скорее исчезает после того, как пользователь отправил ответ.

Также: при написании кнопки «ОК» для меню я использовал «выйти». Но выход закрывает весь виджет! Я хочу, чтобы gui продолжался, и просто закрывалось меню, а не весь GUI!

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

from tkinter import *
class GUI:

def __init__(self, root):
    self.__root = root
    self.__player_A = None
    self.__player_B = None

def assign_player(self, player, identity):
    if player == "player A":
        self.__player_A = identity
    elif player == "player B":
        self.__player_B = identity
    print("Player A is:  " + str(self.__player_A))
    print("Player B is:  " + str(self.__player_B))

def present_player_choice(self):
    self.ask_choose_player("player A")
    self.ask_choose_player("player B")
    Button(self.__root, text="OK", command=quit).pack(anchor=W)

def ask_choose_player(self, player):

    Label(self.__root, text="Who would you like to play " + player + "?").pack(anchor=W)
    var = IntVar()
    Radiobutton(self.__root, text="human", variable=var,
                command=lambda:self.assign_player(player, HUMAN), value=1).pack(anchor=W)
    Radiobutton(self.__root, text="computer", variable=var,
                command=lambda:self.assign_player(player, COMPUTER), value=2).pack(anchor=W)


if __name__ == '__main__':

root = Tk()
gui = GUI(root)
gui.present_player_choice()
mainloop()

1 Ответ

1 голос
/ 19 февраля 2020

Самый быстрый способ сделать это - добавить Frame в ваш класс, который мы можем использовать для сброса содержимого, а затем перевести вызов для игрока B в состояние в методе assign_player, чтобы обновить кадр для игрока. B, когда выбран выбор.

Вы также можете добавить tristatevalue=0 к своим переключателям, чтобы не было выбора по умолчанию.

Пример:

import tkinter as tk


class GUI:
    def __init__(self, root):
        self.__root = root
        self.__player_A = None
        self.__player_B = None
        self.frame = None

    def assign_player(self, player, identity):
        if player == "player A":
            self.__player_A = identity
            print("Player A is:  " + str(self.__player_A))
            self.ask_choose_player("player B")
            tk.Button(self.__root, text="OK", command=quit).pack(anchor=tk.W)
        elif player == "player B":
            self.__player_B = identity
            print("Player B is:  " + str(self.__player_B))
            self.frame.destroy()

    def present_player_choice(self):
        self.ask_choose_player("player A")

    def ask_choose_player(self, player):
        if self.frame is None:
            self.frame = tk.Frame(self.__root)
        else:
            self.frame.destroy()
            self.frame = tk.Frame(self.__root)

        self.frame.pack(fill='both', expand=1)
        tk.Label(self.frame, text="Who would you like to play " + player + "?").pack(anchor=tk.W)
        var = tk.IntVar()

        tk.Radiobutton(self.frame, text="human", variable=var, tristatevalue=0,
                       command=lambda: self.assign_player(player, 'human'), value=1).pack(anchor=tk.W)
        tk.Radiobutton(self.frame, text="computer", variable=var, tristatevalue=0,
                       command=lambda: self.assign_player(player, 'pc'), value=2).pack(anchor=tk.W)


if __name__ == '__main__':
    root = tk.Tk()
    gui = GUI(root)
    gui.present_player_choice()
    root.mainloop()

До / после выбора:

enter image description here

enter image description here

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