Как я могу присвоить результат ввода текста переменной, чтобы затем передать в функцию в бэкэнд? - PullRequest
0 голосов
/ 11 ноября 2018

У меня возникли некоторые проблемы при программировании игры в палач с использованием tkinter, с отделенным внешним интерфейсом и внутренним интерфейсом, а также с использованием ООП (я понимаю, что использование ООП в бэкэнде не было действительно необходимым, и, вероятно, это было бы лучше как библиотека, но я делаю это как учебное упражнение). Я новичок в tkinter, и мне было интересно, как я могу присвоить результат ввода текста переменной, чтобы затем передать функцию в бэкэнд. Мне также было интересно, будут ли обновляться мои метки self.letter_row и self.guesses_left по мере их обновления в бэкэнде, и хотя я назначил их спереди при запуске game_gui (), я не уверен, что они Я сделаю это автоматически. Вот весь код внешнего интерфейса ...

from tkinter import *
from tkinter.ttk import *
import hangmanSkeleton as hm

class game_gui():

    def __init__(self,master):
        self.master = master
        master.title("Hangman")

        this_game = hm.Hangman()

        self.word = this_game.word
        self.letter_row = this_game.letter_row
        self.letters_guessed = this_game.letters_guessed
        self.guesses_left = this_game.guesses_left
        self.letter = StringVar()

        self.lbl_word = Label(master, text = "Welcome to Hangman!")
        self.lbl_word.grid(row = 0,padx = 10 , pady = 15, columnspan = 2)

        self.lbl_row = Label(master, text = self.letter_row)
        self.lbl_row.grid(row = 1, column = 0, padx = 15, pady = 10)

        self.lbl_guesses = Label(master, text = "Guesses Left: " + str(self.guesses_left))
        self.lbl_guesses.grid(row = 1, column = 1, padx = 15, pady = 10)

        self.entry_letter= Entry(master, textvariable = self.letter)
        self.entry_letter.grid(row = 2, padx = 10, pady = 20, columnspan = 2)

        self.guess_button = Button(master, text = "Guess Letter", command=lambda: this_game.guess_letter(self.letter))
        self.guess_button.grid(row = 3, padx = 10, pady = 10, columnspan = 2) 


root = Tk()
gui = game_gui(root)
root.mainloop()

И вот только функция из бэкэнда, которую я пытаюсь заставить работать в self.guess_button () выше ..

def guess_letter(self, letter): 
    try: 
        if type(letter) != str or len(letter) != 1 or letter not in ascii_lowercase:
            raise TypeError
        if letter in self.letters_guessed:
            raise ValueError
        elif letter in self.word:
            for count in range (len(self.word)):
                if letter==self.word[count]:
                    self.letter_row = self.letter_row[0:count] + letter + self.letter_row[count+1:]
        else:
            pass
        self.guesses_left = self.guesses_left-1 #take one away from guesses
    except TypeError:
        print("Value given is not a letter")
    except ValueError:
        print("Letter has already been guessed")

спасибо!

1 Ответ

0 голосов
/ 11 ноября 2018

Комментарий : я все еще не могу обновить свои ярлыки self.letter_row и self.guesses_left, хотя

Да, эти переменные не связаны с Label, я рекомендую использовать Label.configure(text=....
Примечание : я показываю только .this_game.letter_row!

Добавление функции update_labels(... и .configure(... Текст метки:

def update_labels(self):
    self.lbl_row.configure(text=self.this_game.letter_row)
    # and so on

Вызовите эту функцию в последний в .__init__(... и .guess_letter(....
Переменная self.letter_row вообще не нужна.


Вопрос : как я могу присвоить результат ввода текста переменной, чтобы затем передать ее в функцию в бэкэнде.

Изменить следующее:

  • Сделайте вашу переменную this_game членом class game_gui

    self.this_game = hm.Hangman()
    
  • Добавить вспомогательный метод guess_letter(... к class game_gui.
    Передайте письмо .this_game.guess_letter(....
    Очистить письмо от .letter.

    def guess_letter(self, letter):
        self.this_game.guess_letter(letter.get())
        letter.set('')
    
  • Измените command, указывая на вспомогательный метод:

    ..., command=lambda: self.guess_letter(self.letter)
    
...