Кнопка создания проблемы Tkinter для сбора текста от пользователя - PullRequest
0 голосов
/ 07 октября 2018

Я новичок в Tkinter и пытаюсь создать приложение для палача.Я уже создал версию для командной строки, поэтому я подумал, что это будет хороший начальный проект.При обучении мне сказали использовать window.mainloop () для создания / обновления, но моя программа содержит цикл while, поэтому он не работает.Я не могу ввести текстовое поле, которое я создал, и когда я нажимаю кнопку, он выдает мне NameError, говоря, что textEntry в моем методе click () не определен.Любая помощь или руководство, где еще искать, будет высоко ценится.Спасибо!Мой код размещен ниже

from tkinter import *
from random import choice

def click():
        guess = textEntry.get()
        return guess
def main():
        input_file = open('hangman_word_list.txt','r')
        word_list = input_file.read().split()
        window = Tk()
        window.title("Play Hangman!")
        window.configure(background="black")
        p1 = PhotoImage(file='h1.gif')
        p2 = PhotoImage(file='h2.gif')
        p3 = PhotoImage(file='h3.gif')
        p4 = PhotoImage(file='h4.gif')
        p5 = PhotoImage(file='h5.gif')
        p6 = PhotoImage(file='h6.gif')
        Label(window,image=p1,bg="purple").grid(row=0,column=0,columnspan=4)
        word = choice(word_list)
        correctList = list(word)
        lettersLeft = len(word)
        hiddenWord = ('*' * lettersLeft)
        wrongGuessList = []
        lives = 6
        again = True
        nowPhoto = p1
        guess = 'empty'
        while lettersLeft > 0 and again == True:
                Label(window,text="Your word is "+hiddenWord ,bg="gray",fg="purple",font="none 12 bold").grid(row=1,column=0,sticky=W)
                Label(window,text="Enter a letter: " ,bg="gray",fg="purple",font="none 12 bold").grid(row=2,column=0,sticky=W)
                textEntry = Entry(window,width=5,bg="white")
                textEntry.grid(row=2,column=1,sticky=W)
                guess = Button(window,text="Guess",width=5,command=click).grid(row=3,column=2,sticky=W)
                window.update()
main()

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

mainloop() постоянно прислушивается к любому определенному вами хуку, что означает, что вам не нужно об этом беспокоиться.Просто определите правильные хуки, как команда кнопки.

Я представил более удобный способ обработки изображений, помещая их в список, а затем сокращая список для каждого запрошенного изображения.Это облегчает обновление изображения.

Затем поместите всю обработку, например, проверьте, есть ли в слове и т. Д. Введенная буква, в функции click().

from tkinter import *

window = Tk()

# Make a list of all the pictures
pic_list = ['h6.gif','h5.gif','h4.gif','h3.gif','h2.gif','h1.gif']

img = PhotoImage(file=pic_list.pop())       # Get image from list of images
hangman = Label(window, image=img)          # Save reference to the Label as 
hangman.grid(row=0,column=0,columnspan=4)   #       you will update it later

# I simplified the word selection a bit
word = 'Wensleydale'

correctList = list(word)
lettersLeft = len(word)
hiddenWord = ('*' * lettersLeft)
wrongGuessList = []
guess = 'empty'

# Build the rest of the GUI
Label(window,text="Your word is " + hiddenWord, bg="gray", fg="purple",
      font="none 12 bold").grid(row=1, column=0, sticky=W, columnspan=4)
Label(window,text="Enter a letter: ", bg="gray", fg="purple",
      font="none 12 bold").grid(row=2, column=0, sticky=W)
textEntry = Entry(window, width=10, bg="white")
textEntry.grid(row=2, column=1, sticky=W, columnspan=3)

def click():    # Callback function
    guess = textEntry.get()

    # Put all other processing here. 

    # Updating the image
    img = PhotoImage(file=pic_list.pop())   # Get next image from list
    hangman.configure(image=img)            # Replace image in label
    hangman.image = img             # Keep reference to the new image

# Create button and associate it with the command callback function
guess_button = Button(window, text="Guess", width=5,
                      command=click).grid(row=3, column=2, sticky=W)

window.mainloop()   # Will loop continously listening for buttonpress
0 голосов
/ 07 октября 2018

Во-первых, цикл while не рекомендуется для использования, когда речь идет об использовании модуля tkinter, так как окно будет работать в главном потоке.Логически, когда вы используете кнопки, вы можете использовать операторы if, чтобы он не вызывал определенную часть кода до lettersLeft > 0 and again == True.И использование переменной textEntry в функции, очевидно, недоступно для Python, потому что нет ее объявления.Таким образом, вы либо передаете переменную в качестве аргумента, либо объявляете глобальную переменную.

Вот что я бы подумал:

    from tkinter import *
    from random import choice


    def get_wordlist():
        return open("Hangman word list.txt", 'r').read().split("split by something here.")


    class Hangman(Frame):
        def __init__(self, master=None):
            Frame.__init__(self, master)

            self.master.title("Hangman")
            self.master.configure(bg="black")

            self.wordlist = get_wordlist()

            self.p1 = PhotoImage(file="h1.gif")

            self.word = choice(self.wordlist)
            self.hidden_word = list("".join("_" for x in word))
            self.wrong_guess = []
            self.lives = 6

            self.word_display = Label(window, text=str(*(hidden for hidden in hidden_word)), image=p1, bg="purple", fg="white")
            self.word_display.grid(row=0, column=0, columnspan=4)

            Label(window, text="Enter a letter: ", bg="gray", fg="purple", font="none 12 bold").grid(row=2, column=0, sticky=W)

            self.entry = Entry(window, width=5, bg="white")
            self.entry.grid(row=2, column=1, sticky="W")

            self.guess = Button(window, text="Guess", command=lambda: button_action(self))
            self.guess.grid()

            self.again = False

        def button_action(self):
            user_input = self.entry.get()

            if len(user_input) == len(word):
                for i in range(len(word)):
                    if word[i] == user_input[i]:
                        self.hidden_word[i] = word[i]

                if "_" not in self.hidden_word:
                    self.word_display.config(text="You won! The correct word was: " + self.word)
                    self.after(3000, self.quit())
                else:
                    self.word_display.config(text="Guess not correct! " + str(*(hidden for hidden in hidden_word)))
                    self.lives -= 1
            else:
                self.word_display.config(text="Guess not correct! " + str(*(hidden for hidden in hidden_word)))
                self.lives -= 1

            if self.lives <= 0:
                self.word_display.config(text="You lost! The correct word was: " + self.word)
                self.master.after(3000, self.quit())

Обратите внимание на 2 вещи:

  • Старайтесь не создавать избыточные переменные
  • Прежде чем задавать вопрос, пожалуйста, посмотрите python tkinter docs .
...