Пытаясь найти символ в строке, Python использует Tkinter

В настоящее время я делаю игру палач для своего школьного проекта и попал в ловушку. Я пытаюсь проверить мой код и посмотреть, смогу ли я заставить его выводить yay в консоли, если символ, который вы нажимаете в графическом интерфейсе, правильный, и выводить boo, если нет. Я попытался попробовать, кроме и если еще, и если еще говорит, что "текст" не определен. (Извините за блок с кнопками, я скоро его уберу!!!) Вот код:

#Hangman

from tkinter import *
import random

root = Tk()


word_list = ["APPLE", "PEAR", "BANNANA"]

word = word_list [random.randrange(0,2)]

#Functions
def click_1 ():
    if text in word == true:
        print ("yay")
    else:
        print ("Boo")



#Frames
hangman_frame = Frame(root).grid(row=0, column=0)
letter_frame = Frame(root).grid(row=1, column=0)

#Buttons
A = Button(letter_frame, text="A", command=click_1).grid(row=0, column=0, sticky=W)
B = Button(letter_frame, text="B", command=click_1).grid(row=0, column=1, sticky=W)
C = Button(letter_frame, text="C", command=click_1).grid(row=0, column=2, sticky=W)
D = Button(letter_frame, text="D", command=click_1).grid(row=0, column=3, sticky=W)
E = Button(letter_frame, text="E", command=click_1).grid(row=0, column=4, sticky=W)
F = Button(letter_frame, text="F", command=click_1).grid(row=0, column=5, sticky=W)
G = Button(letter_frame, text="G", command=click_1).grid(row=0, column=6, sticky=W)
H = Button(letter_frame, text="H", command=click_1).grid(row=0, column=7, sticky=W)
I = Button(letter_frame, text="I", command=click_1).grid(row=0, column=8, sticky=W)
J = Button(letter_frame, text="J", command=click_1).grid(row=0, column=9, sticky=W)
K = Button(letter_frame, text="K", command=click_1).grid(row=0, column=10, sticky=W)
L = Button(letter_frame, text="L", command=click_1).grid(row=0, column=11, sticky=W)
M = Button(letter_frame, text="M", command=click_1).grid(row=0, column=12, sticky=W)
N = Button(letter_frame, text="N", command=click_1).grid(row=1, column=0, sticky=W)
O = Button(letter_frame, text="O", command=click_1).grid(row=1, column=1, sticky=W)
P = Button(letter_frame, text="P", command=click_1).grid(row=1, column=2, sticky=W)
Q = Button(letter_frame, text="Q", command=click_1).grid(row=1, column=3, sticky=W)
R = Button(letter_frame, text="R", command=click_1).grid(row=1, column=4, sticky=W)
S = Button(letter_frame, text="S", command=click_1).grid(row=1, column=5, sticky=W)
T = Button(letter_frame, text="T", command=click_1).grid(row=1, column=6, sticky=W)
U = Button(letter_frame, text="U", command=click_1).grid(row=1, column=7, sticky=W)
V = Button(letter_frame, text="V", command=click_1).grid(row=1, column=8, sticky=W)
W = Button(letter_frame, text="W", command=click_1).grid(row=1, column=9, sticky=W)
X = Button(letter_frame, text="X", command=click_1).grid(row=1, column=10, sticky=W)
Y = Button(letter_frame, text="Y", command=click_1).grid(row=1, column=11, sticky=W)
Z = Button(letter_frame, text="Z", command=click_1).grid(row=1, column=12, sticky=W)

4 ответа

Решение

Я исправил несколько синтаксических проблем, и кнопки были сгенерированы в цикле. Дайте мне знать, если это работает для вас.

#Hangman

from tkinter import *
import random, functools, string

root = Tk()

word_list = ["APPLE", "PEAR", "BANNANA"]

word = word_list [random.randrange(0,2)]

#Functions
def click_1 (text):
    if text in word:
        print ("yay")
    else:
        print ("Boo")

#Frames
hangman_frame = Frame(root).grid(row=0, column=0)
letter_frame = Frame(root).grid(row=1, column=0)

#Buttons
r = c = 0
for letter in string.ascii_uppercase:
    Button(letter_frame, text=letter, command=functools.partial(click_1, letter)).grid(row=r, column=c, sticky=W)
    c += 1
    if c > 12:
        c = 0
        r += 1

Проблема, которую вы имеете, может быть решена с помощью этой темы:

Как передать аргументы команде Button в Tkinter?

Решение состоит в том, чтобы передать текстовый аргумент, когда вы вызываете функцию "click_1", используя поле "command" кнопки, например:

  button = Tk.Button(master=frame, text='A', command= lambda: click_1("A"))

Я знаю, что вы получили свой ответ, но просто подумали, что я поставлю его там. Я позаимствовал код @Fred S'и написал это:

#Hangman
from tkinter import *
import random, functools, string


class HangmanGameFrame(Frame):
    def __init__(self,
                 parent=None,
                 word_list=("APPLE", "PEAR", "BANNANA")):
        super(HangmanGameFrame, self).__init__()
        self.word_list = word_list
        self.word = self.word_list[random.randrange(0,len(word_list))]
        self.create_ui()

    def create_ui(self):
        #Frames
        self.hangman_frame = Frame(root).grid(row=0, column=0)
        self.letter_frame = Frame(root).grid(row=1, column=0)

        def create_buttons():
            #Buttons
            r = c = 0
            for letter in string.ascii_uppercase:
                Button(self.letter_frame, text=letter, command=functools.partial(self.letter_click_handler, letter)).grid(row=r, column=c, sticky=W)
                c += 1
                if c > 12:
                    c = 0
                    r += 1
        create_buttons()            

    def configure(self, *args, **kwargs):
        if kwargs['word_list']:
            self.set_word_list(kwargs['word_list'])
            kwargs.pop('word_list', None)
        super().configure(*args, **kwargs)

    def set_word_list(self, word_list):
        self.word_list = word_list
        self.word = self.word_list[random.randrange(0,len(word_list))]

    def letter_click_handler(self, text):
        if text in self.word:
            print ("yay")
        else:
            print ("Boo")


if __name__ == "__main__":
    root = Tk()
    hangman_frame = HangmanGameFrame(parent=root)
    hangman_frame.configure(word_list=["ZEBRA"]) 
    root.mainloop()

Все, что я сделал, это просто реорганизовал код, чтобы сделать его чище. Программирование GUI всегда лучше, когда оно выполняется с использованием объектно-ориентированного подхода IMO. Это делает ваш код легче расширять и поддерживать. Это всего лишь несколько вещей, которые я отредактировал из вашего исходного кода. Пожалуйста, пройдите его и посмотрите, сможете ли вы сравнить и получить несколько указателей. Я уверен, что ваш учитель будет признателен за лучшую структуру. Надеюсь, это поможет.

Ps. Если вы уже знали эти понятия, то хорошо для вас, и просто немного попрактиковаться для меня. Приветствия.

Это плохая практика - проверять логическое значение таким образом ( == true) (также вы должны использовать заглавную букву "True":)

Вы хотите попробовать что-то более похожее

if (text in word):
Другие вопросы по тегам