Как я могу использовать кнопку в Tkinter, чтобы остановить выполнение другой строки кода? - PullRequest
0 голосов
/ 07 января 2019

Я создаю личный проект, чтобы попытаться стать лучше на python. Игра, которую я делаю, - Яхтзе. Он настроен так, чтобы вы могли бросить все кубики, и он скажет вам, что у вас есть. У меня также есть настройки окна с использованием Tkinter. То, что я пытаюсь сделать, это иметь кнопку с надписью «HOLD» под каждым номером. Если вы знаете, как работает yahtzee, вы знаете, почему. Я просто хочу, чтобы эта кнопка не давала этой кости снова катиться после вашего первого броска.

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

# Window
def hold():


window = Tk()
window.title("Sam's Yahtzee")
window.configure(background="black")
Button(window, text="HOLD", width=6, command=hold) .grid(row=3, column=0, 
sticky=W)
window.mainloop()

# Dice Roll
roll1 = random.randint(1, 6)
roll2 = random.randint(1, 6)
roll3 = random.randint(1, 6)
roll4 = random.randint(1, 6)
roll5 = random.randint(1, 6)
print(roll1, roll2, roll3, roll4, roll5)

# Choosing What Num to Hold


# Roll Num Storing
userRollHold = {'roll1': roll1,
            'roll2': roll2,
            'roll3': roll3,
            'roll4': roll4,
            'roll5': roll5}

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

Ответы [ 2 ]

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

Вы можете использовать Checkbutton для кнопок удержания и проверить их состояние, чтобы определить, следует ли удерживать соответствующие кости на следующем броске. Ниже приведен пример кода (используйте Checkbutton в качестве самой кости):

from tkinter import *
from random import randint

root = Tk()
root.title("Sam's Yahtzee")

def roll(dice, times):
    if times > 0:
        dice['text'] = randint(1, 6)
        root.after(10, roll, dice, times-1)

def roll_dices():
    for i in range(5):
        if dices[i][1].get() == 0:
            # dice is not held, so roll it
            roll(dices[i][0], 10)

dices = []
for i in range(5):
    ivar = IntVar()
    dice = Checkbutton(root, text=randint(1, 6), variable=ivar, bg='silver', bd=1, font=('Arial', 24), indicatoron=False, height=3, width=5)
    dice.grid(row=0, column=i)
    dices.append([dice, ivar])

Button(text='Dice', command=roll_dices, height=2, font=(None, 16, 'bold')).grid(row=1, column=0, columnspan=5, sticky='ew')

root.mainloop()
0 голосов
/ 07 января 2019

Не уверен, что это то, что вы ищете, но вы можете создать класс с атрибутом hold и установить и сбросить его в соответствии с вашими требованиями:

Например:

class Dice:
    def __init__(self):
        self.held = False
        self.val = None

    def roll(self):
        self.val = random.randint(1, 6) if not self.held else self.val
        return self.val

    def hold(self):
        self.held = True

    def unhold(self):
        self.held = False

Вот проверочный код для проверки концепции:

dice_1, dice_2, dice_3 = Dice(), Dice(), Dice()
print dice_1.roll(), dice_2.roll(), dice_3.roll()
dice_1.hold()
dice_3.hold()
print dice_1.roll(), dice_2.roll(), dice_3.roll()
print dice_1.roll(), dice_2.roll(), dice_3.roll()
dice_1.unhold()
print dice_1.roll(), dice_2.roll(), dice_3.roll()

Выход:

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