2015-11-10 3 views
0

Я новичок, и у меня настоящая проблема с включением «GUESS my number game» в GUI. Это вызов из «программирования на Python для абсолютный новичок », и нет никаких решений, содержащихся в книге ?!Угадайте мою игру номер и GUI = stumped :(

Я могу получить единственную догадку и запустить ее через цикл while, но после этого я в недоумении. Я потратил много времени на различные вещи и прибыли на ничего, что работает. Я, наверное, далеко трек.

Я хочу, чтобы иметь возможность получить дополнительные предположения от пользователя, но как в GUI?

Спасибо , Дэйв (усталым и деморализованы)

My code: 

# Guess my number game 
# User must attempt to guess randomly selected number within a range in fewest possible attempts 

from Tkinter import * 
import random 

class Application(Frame): 
    """A GUI application which which generates random number and gets user input""" 

    def __init__(self, master): #initialize newly created Application object 
     """Initialize the frame""" 
     Frame.__init__(self, master) # super(Application, self).__init__(master) in python 3 
     self.grid() 
     self.create_widgets() 


    def create_widgets(self): 
     """Get user inputs""" 
     # create instruction label 
     Label(self, text = "I'm thinking of a number between 1 and 100.").grid(row = 0, column = 0, sticky = W) 
     Label(self, text = "Try and guess it in as few attempts as possible!").grid(row = 1, column = 0, sticky = W) 

     # create guess input prompt label and entry 
     Label(self, text = "Take a guess:").grid(row = 2, column = 0, sticky = W) 
     self.guess_ent = Entry(self) 
     self.guess_ent.grid(row = 2, column = 1, sticky = W) 

     # create start game prompt label and submit button 
     Label(self, text = "Press submit to start the game!").grid(row = 3, column = 0, sticky = W) 
     Button(self, text = "Submit", command = self.run_game).grid(row = 3, column = 1, sticky = W) 


     # create submit button 
     #Button(self, text = "Submit", command =) 

     # create computer feedback text box 
     self.text = Text(self, width = 75, height = 10, wrap = WORD) 
     self.text.grid(row = 4, column = 0, columnspan = 4) 





    def run_game(self): 
     """Generate number and get user input""" 
     guess = int(self.guess_ent.get()) 
     number = random.randint(1, 101) 

     while guess and guess != number: 
      print_text = "" 
      print_text += "You guessed " 
      print_text += str(guess) 
      print_text += "." 

      if guess > number: 
       print_text += " That's too high. Guess lower..." 
      elif guess < number: 
       print_text += " That's too low. Guess higher..." 

      self.text.delete(0.0, END) 
      self.text.insert(0.0, print_text) 

      self.guess_ent.delete(0, END) 



     #print_text = ""  
     #print_text += "That's the right number! Well done!" 
     #self.text.delete(0.0, END) 
     #self.text.insert(0.0, print_text) 


# main 
root = Tk() 
root.title("Guess my number game!") 
app = Application(root) 
root.mainloop() 
+0

Вообще говоря, TkInter приложения не должны иметь 'while' петли, которые ждут виджет для изменения состояния, потому что окно не будет перерисовывать или отвечать на ввод данных пользователем, если вы часто не возвращает управление основной цикл, позволяя вашей функции конец. Здесь нет реального «быстрого исправления»; вам нужно разработать свою программу, используя парадигму stateful/responsive, а не стиль «падающего камня» консольных программ. – Kevin

+0

Хорошо. Спасибо, это хорошо знать. Я задержу цикл while и посмотрю, что я могу придумать. –

ответ

1

Легко исправить это. Переместите number = random.randint(1, 101) в функцию __init__ и сделайте ее переменной. Затем замените while на if и сделайте это. Полный код выглядит следующим образом. Я внес небольшие изменения в print_text, так как не требуется 4 строки кода для построения строки. Это и изменение number до self.number.

# Guess my number game 
# User must attempt to guess randomly selected number within a range in fewest possible attempts 

from tkinter import * 
import random 

class Application(Frame): 
    """A GUI application which which generates random number and gets user input""" 

    def __init__(self, master): #initialize newly created Application object 
     """Initialize the frame""" 
     Frame.__init__(self, master) # super(Application, self).__init__(master) in python 3 
     self.grid() 
     self.create_widgets() 
     self.number = random.randint(1, 101) 

    def create_widgets(self): 
     """Get user inputs""" 
     # create instruction label 
     Label(self, text = "I'm thinking of a number between 1 and 100.").grid(row = 0, column = 0, sticky = W) 
     Label(self, text = "Try and guess it in as few attempts as possible!").grid(row = 1, column = 0, sticky = W) 

     # create guess input prompt label and entry 
     Label(self, text = "Take a guess:").grid(row = 2, column = 0, sticky = W) 
     self.guess_ent = Entry(self) 
     self.guess_ent.grid(row = 2, column = 1, sticky = W) 

     # create start game prompt label and submit button 
     Label(self, text = "Press submit to start the game!").grid(row = 3, column = 0, sticky = W) 
     Button(self, text = "Submit", command = self.run_game).grid(row = 3, column = 1, sticky = W) 


     # create submit button 
     #Button(self, text = "Submit", command =) 

     # create computer feedback text box 
     self.text = Text(self, width = 75, height = 10, wrap = WORD) 
     self.text.grid(row = 4, column = 0, columnspan = 4) 

    def run_game(self): 
     """Generate number and get user input""" 
     guess = int(self.guess_ent.get()) 

     if guess != self.number: 
      print_text = "You guessed {0}.".format(guess) 

      if guess > self.number: 
       print_text += " That's too high. Guess lower..." 
      elif guess < self.number: 
       print_text += " That's too low. Guess higher..." 

      self.text.delete(0.0, END) 
      self.text.insert(0.0, print_text) 

      self.guess_ent.delete(0, END) 
     else: 
      print_text = "That's the right number! Well done!" 
      self.text.delete(0.0, END) 
      self.text.insert(0.0, print_text) 

# main 
root = Tk() 
root.title("Guess my number game!") 
app = Application(root) 
root.mainloop() 
+0

Ха-ха! В какой-то момент я использовал self.number в конструкторе, но с циклом while все еще там. Большое спасибо! –

Смежные вопросы