Пытаясь найти символ в строке, 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):