2015-05-04 6 views
0

Я делаю игру Truth Or Dare с Tkinter. Я получаю эту ошибку:Python Tkinter Text Output

UnboundLocalError: local variable 'text' referenced before assignment 

При выполнении этого кода:

from tkinter import * 
import random 

tk = Tk() 
tk.title("Truth or Dare") 
tk.resizable(0, 0) 
canvas = Canvas(tk, width=500,height=350) 
canvas.create_text(250, 20, text="Truth Or Dare", fill='red', font=('Helvetica', 20)) 
text = canvas.create_text(250, 200, text='Test!') 

def spm(): 
    canvas.delete(text) 
    spillere = ['Niels','Astrid'] 
    p1 = random.choice(spillere) 
    p2 = random.choice(spillere) 
    x1 = random.randint(0,3) 
    s1 = ['skal spise kage','sig huj ud af vinduet'] # En udfordring til en spiller 
    s2 = ['kan du lide kage?','har du nogensinde danset step?'] # Et spørgsmål til en spiller 
    s3 = ['skal sige hej til','skal sige huj til','skal spise kage med'] # Noget med en anden spiller 
    s4 = ['vil du spise kage med','vil du spise kage med'] # Et spørgsmål om en anden spiller 
    while True: 
     if p1 == p2: 
      p2 = random.choice(spillere) 
     else: 
      break 
    if x1 == 0: 
     text = canvas.create_text(250, 200, text='%s %s' % (p1, random.choice(s1)), font=('Helvetica', 15)) 
    elif x1 == 1: 
     text = canvas.create_text(250, 200, text='%s %s' % (p1, random.choice(s2)), font=('Helvetica', 15)) 
    elif x1 == 2: 
     text = canvas.create_text(250, 200, text='%s %s %s' % (p1, random.choice(s3), p2), font=('Helvetica', 15)) 
    elif x1 == 3: 
     text = canvas.create_text(250, 200, text='%s %s %s?' % (p1, random.choice(s4), p2), font=('Helvetica', 15)) 


btn = Button(tk, text="Klik!", command=spm, width=50,height=5,font=('Helvetica' , 15)) 
btn.pack() 
canvas.pack() 

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

спасибо.

ответ

-1

Не используйте текст в качестве имени переменной:

text = canvas.create_text(250, 200, text='Test!') 

должен стать (к примеру):

mytext = canvas.create_text(250, 200, text='Test!') 
+0

Но это меняет логику программы - теперь, когда вы нажимаете кнопку во второй раз, она не стирает текст на холсте, прежде чем писать больше текста. – Kevin

0

text Объявить как глобальное значение. В противном случае интерпретатор считает, что text является локальным, и запутывается, когда вы ссылаетесь на него в canvas.delete(text), прежде чем назначать его в своем наборе if.

def spm(): 
    global text 
    #...etc 
0

текст внутри функции СЗМ локальную область действия и не то же самое, как глобальный текст переменной, объявленной перед функцией

Я всегда считаю, что лучше сделать графический интерфейс окружающих сред отрабатывают класса, я изменил атрибуты текстовой переменной на id, так как canvas.create_text возвращает идентификатор холста, на котором было произведено действие, а не какое-либо фактическое текстовое значение. Вы найдете, используя класс, он будет работать.

from Tkinter import * 
import random 

tk = Tk() 
tk.title("Truth or Dare") 
tk.resizable(0, 0) 
canvas = Canvas(tk, width=500,height=350) 
canvas.create_text(250, 20, text="Truth Or Dare", fill='red', font= ('Helvetica', 20)) 
class Window(object): 
    def __init__(self): 
     self.id = canvas.create_text(250, 200, text='Test!') 

    def spm(self): 
     canvas.delete(self.id) 
     spillere = ['Niels','Astrid'] 
     p1 = random.choice(spillere) 
     p2 = random.choice(spillere) 
     x1 = random.randint(0,3) 
     s1 = ['skal spise kage','sig huj ud af vinduet'] # En udfordring til en spiller 
     s2 = ['kan du lide kage?','har du nogensinde danset step?'] 
     s3 = ['skal sige hej til','skal sige huj til','skal spise kage me d'] # Noget med en anden spiller 
     s4 = ['vil du spise kage med','vil du spise kage med'] 
     while True: 
      if p1 == p2: 
       p2 = random.choice(spillere) 
      else: 
       break 
     if x1 == 0: 
      self.id = canvas.create_text(250, 200, text='%s %s' % (p1, random.choice(s1)), font=('Helvetica', 15)) 
     elif x1 == 1: 
      self.id = canvas.create_text(250, 200, text='%s %s' % (p1,random.choice(s2)), font=('Helvetica', 15)) 
     elif x1 == 2: 
      self.id = canvas.create_text(250, 200, text='%s %s %s' % (p1, random.choice(s3), p2), font=('Helvetica', 15)) 
     elif x1 == 3: 
      self.id = canvas.create_text(250, 200, text='%s %s %s?' % (p1, random.choice(s4), p2), font=('Helvetica', 15)) 

window = Window() 
btn = Button(tk, text="Klik!", command=window.spm,  width=50,height=5,font=('Helvetica' , 15)) 
btn.pack() 
canvas.pack() 
tk.mainloop() 
Смежные вопросы