2015-04-26 8 views
1

Я пытался создать простой движущийся блок, используя tkinter в Python 3, и все работало до тех пор, пока я не импортировал время. Окно теперь не открывается. Я попытался удалить импорт, и это не поможет. Это мой код:Окно Tkinter не открывается

from tkinter import * 
import time 

canvas_height = 400 
canvas_width = 600 
canvas_colour = "grey50" 
moveBoolean = "True" 

def move(): 
    global moveBoolean 
    while moveBoolean == "True": 
     time.sleep(0.005) 
     canvas.move(square, 90, 90) 
     time.sleep(0.005) 
     canvas.move(square, 180, 180) 
     time.sleep(0.005) 
     canvas.move(square, 50, 100) 

window = Tk() 

canvas = Canvas(bg=canvas_colour, height=canvas_height, width=canvas_width, highlightthickness=0) 
canvas.pack() 

square = canvas.create_rectangle(50, 50, 50, 50, width=50, fill="black") 

move() 

window.mainloop() 

ответ

0

Эти проблемы, как правило, решаются с использованием классов, которые вы должны изучить и использовать до кодирования GUIs ИМХО. Вы не должны использовать time(), поскольку он может прерывать бесконечный цикл Tkinter. Вместо этого используйте Tkinter's after(). Кроме того, вы никогда не устанавливаете moveBoolean в False, поэтому оператор while запускается до тех пор, пока программа не будет отменена, а второй раз через квадрат будет зависеть от холста, поэтому вы ничего не видите. Следующее решает ваши проблемы, но снова было бы лучше, если бы использовалась структура классов.

from tkinter import * 
from functools import partial 

canvas_height = 400 
canvas_width = 600 
canvas_colour = "grey50" 
moveBoolean = "True" 

def move_it(ctr=0): 
    if ctr < len(coords): 
     x, y = coords[ctr] 
     ctr += 1 
     print ctr, x, y 
     canvas.move(square, x, y) 
     window.after(1000, partial(move_it, ctr)) 

window = Tk() 

canvas = Canvas(bg=canvas_colour, height=canvas_height, 
     width=canvas_width, highlightthickness=0) 
canvas.pack() 

square = canvas.create_rectangle(50, 50, 50, 50, width=50, fill="black") 

coords = ((90, 90), 
      (180, 180), 
      (50, 50)) 
move_it() 

window.mainloop() 
+0

Сценарий, кажется, не нравится "window.after (1000, частичный (ход, ИЕ)), бросание ошибки: AttributeError: 'functools.partial' объект не имеет атрибута '__name__' – Tree

+0

Переименуйте функцию «move()» на что-то менее распространенное, так как программа может найти какое-то другое «движение» перед тем, как найти функцию (код выше отредактирован). Какую версию ОС и Python вы используете? –

+0

Я использую последнюю версию 3.4 – Tree

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