Escolar Documentos
Profissional Documentos
Cultura Documentos
Capítulo 4 Objetos e
Gráficos
Objetivos
• Para entender o conceito de objetos e como eles podem ser usados para simplificar
•
programação.
• Ser capaz de criar objetos em programas e chamar métodos apropriados para realizar
cálculos gráficos.
Até agora, escrevemos programas que usam os tipos de dados internos do Python para
números e strings. Vimos que cada tipo de dado pode representar um determinado conjunto
de valores e cada um possui um conjunto de operações associadas. Basicamente, vimos os
dados como entidades passivas que foram manipuladas e combinadas por meio de operações
ativas. Esta é uma maneira tradicional de ver a computação. Para construir sistemas complexos,
83
Machine Translated by Google
no entanto, ajuda a ter uma visão mais rica do relacionamento entre dados e operações.
combina dados e operações. Para simplificar, os objetos sabem coisas (contêm dados) e podem
fazer coisas (têm operações). Os objetos interagem enviando mensagens uns aos outros. Uma
mensagem é simplesmente uma solicitação para que um objeto execute uma de suas operações.
Como programador iniciante, você provavelmente ainda não está pronto para lidar com um
sistema de informação universitário. Por enquanto, estudaremos objetos no contexto de uma
programação gráfica simples.
Para executar os programas gráficos e exemplos deste capítulo (e do restante do livro), você
precisará de uma cópia do arquivo graphics . py que é fornecido com os materiais suplementares.
Usar a biblioteca de gráficos é tão fácil quanto colocar uma cópia dos gráficos. py na mesma pasta
que seu(s) programa(s) gráfico(s).
Alternativamente, você pode colocá-lo em um diretório do sistema onde outras bibliotecas Python
são armazenadas para que ele possa ser usado em qualquer pasta do sistema.
A biblioteca de gráficos facilita a experimentação de gráficos de forma interativa
Machine Translated by Google
e escrever programas gráficos simples. Ao fazer isso, você aprenderá princípios de programação
orientada a objetos e computação gráfica que podem ser aplicados em ambientes de programação
gráfica mais sofisticados. Os detalhes do módulo gráfico serão explorados em seções posteriores.
Aqui vamos nos concentrar em uma introdução prática básica para abrir seu apetite.
Se essa importação falhar, significa que o Python não conseguiu encontrar o módulo gráfico.
Verifique se o arquivo está na pasta correta e tente novamente.
Em seguida, precisamos criar um local na tela onde os gráficos aparecerão.
Esse local é uma janela gráfica ou GraphWin, que é fornecida por graphics :
Observe o uso da notação de ponto para invocar a função GraphWin que "vive" na biblioteca de
gráficos. Isso é análogo a quando usamos math. sqrt (x) para invocar a função raiz quadrada do
módulo da biblioteca matemática. A função Graph Win () cria uma nova janela na tela. A janela
terá o título "Janela de Gráficos". O GraphWin pode se sobrepor à janela do shell do Python,
portanto, talvez seja necessário redimensionar ou mover o shell para tornar as duas janelas
totalmente visíveis. A Figura 4.1 mostra um exemplo de exibição de tela.
Python 3.4.3 (v3.4.3:9b73flc3e601, 24 de fevereiro de 2015, 22:44:40) (HSC v.1600 64 bit (AI1D64) ) no win32 Digite
"copyright", "credits" ou "license()" para mais informações. >>> da importação de gráficos ÿ >>> win = GraphWin()
»> eu
Observe que estamos novamente usando a notação de ponto, mas agora a estamos
usando com um nome de variável, não um nome de módulo, no lado esquerdo do ponto.
Lembre-se de que win foi atribuído anteriormente como um objeto do tipo GraphWin. Uma
das coisas que um objeto GraphWin pode fazer é se fechar. Você pode pensar nesse
comando como invocando a operação de fechamento associada a essa janela específica. O
resultado é que a janela desaparece da tela.
A propósito, devo mencionar aqui que experimentar comandos gráficos de forma
interativa como este pode ser complicado em alguns ambientes. Se você estiver usando um
shell em um IDE como o IDLE, é possível que em sua plataforma específica uma janela
gráfica pareça não responder. Por exemplo, você pode ver um cursor "ocupado" ao passar o
mouse sobre a janela e pode não conseguir arrastar a janela para posicioná-la. Em alguns
casos, sua janela gráfica pode estar completamente oculta sob o IDE e você para procurá-lo.
Essas falhas
Machine Translated by Google
são devidos ao IDE e à janela gráfica, ambos se esforçando para controlar suas
interações. Independentemente de quaisquer dificuldades que você possa ter ao jogar
com os gráficos de forma interativa, tenha certeza de que seus programas que usam a
biblioteca de gráficos devem funcionar bem na maioria dos ambientes padrão. Eles
definitivamente funcionarão no Windows, macOS e Linux.
Estaremos usando alguns comandos da biblioteca de gráficos, e fica tedioso ter
que digitar os "gráficos". notação cada vez que usamos um. Python tem uma forma
alternativa de importação que pode ajudar:
da importação de gráficos *
vitória = GraphWin()
Todos os demais exemplos gráficos assumirão que todo o módulo gráfico foi importado
usando from.
Vamos tentar nossa mão em algum desenho. Uma janela gráfica é, na verdade,
uma coleção de pequenos pontos chamados pixels (abreviação de "elementos de
imagem"). Ao controlar a cor de cada pixel, controlamos o que é exibido na janela. Por
padrão, um GraphWin tem 200 pixels de altura e 200 pixels de largura. Isso significa
que existem 40.000 pixels no GraphWin. Desenhar uma imagem atribuindo uma cor a
cada pixel individual seria um desafio assustador. Em vez disso, contaremos com uma
biblioteca de objetos gráficos. Cada tipo de objeto faz sua própria contabilidade e sabe
como se desenhar em um GraphWin.
O objeto mais simples no módulo gráfico é um Point. Na geometria, um ponto é
uma localização no espaço. Um ponto é localizado por referência a um sistema de
coordenadas. Nosso objeto gráfico Point é semelhante; ele pode representar um local
em um GraphWin. Definimos um ponto fornecendo as coordenadas x e y (x, y). O valor
x representa a localização horizontal do ponto e o valor y representa a vertical.
Tradicionalmente, os programadores gráficos localizam o ponto (0, 0) no canto
superior esquerdo da janela. Assim , os valores de x aumentam da esquerda para a
direita e os valores de y aumentam de cima para baixo. No GraphWin padrão de 200 x
200 , o canto inferior direito tem as coordenadas (199, 199). Drawing a Point define a
cor do pixel correspondente no GraphWin. A cor padrão para desenho é preto.
Aqui está um exemplo de interação com Python ilustrando o uso de Pontos:
Machine Translated by Google
A primeira linha cria um Point localizado em (100, 120). Após a criação do Ponto ,
seus valores de coordenadas podem ser acessados pelas operações getX e getY.
Como em todas as chamadas de função, certifique-se de colocar os parênteses no final
quando estiver tentando usar as operações. Um Point é desenhado em uma janela usando
a operação draw . Neste exemplo, dois objetos Point diferentes (p e p2) são criados e
desenhados no GraphWin chamado win. A Figura 4.2 mostra a saída gráfica resultante.
Tente descobrir o que cada uma dessas declarações faz. Se você digitá-los como mostrado,
o resultado final será semelhante à Figura 4.3.
Formas
Para dar um exemplo concreto, vejamos o que acontece quando criamos um ponto
gráfico. Aqui está uma declaração do construtor do exemplo interativo acima:
Machine Translated by Google
O construtor da classe Point requer dois parâmetros fornecendo as coordenadas xey para o
novo ponto. Esses valores são armazenados como variáveis de instância dentro do objeto.
Nesse caso, o Python cria uma instância de Point com um valor x de 50 e um valor y de 60.
O ponto resultante é então atribuído à variável p.
p: Ponto '
x: I 50 I y: I
60 I
O número e o tipo dos parâmetros são determinados pelo método que está sendo usado.
Alguns métodos não requerem nenhum parâmetro. Você pode encontrar vários exemplos de
invocação de método nos exemplos interativos acima.
Como exemplos de métodos sem parâmetros, considere estas duas expressões:
p.getX()
p.getY()
Outros métodos alteram os valores das variáveis de instância de um objeto, alterando assim o
estado do objeto. Todos os objetos gráficos têm um método de movimento .
Aqui está uma especificação:
dx . , dy): Move o objeto dx unidades na direção x e dy unidades em que eles se movem (direção
Para mover o ponto p para as 10 unidades à direita, poderíamos usar esta declaração:
p.mover ( 10 , 0)
Lembre-se, o método draw fica dentro do objeto eire . Usando informações sobre o centro e o raio
do círculo das variáveis de instância, o método draw emite uma sequência apropriada de comandos de
desenho de baixo nível (uma sequência de invocações de métodos) para o GraphWin. Uma imagem
conceitual das interações entre os objetos Point, Circle e GraphWin é mostrada na Figura 4.5.
Felizmente, geralmente não precisamos nos preocupar com esses tipos de detalhes; eles são todos
cuidados pelos objetos gráficos. Nós apenas criamos objetos, chamamos os métodos apropriados e
deixamos que eles façam o trabalho. Esse é o poder da programação orientada a objetos.
Machine Translated by Google
.
c1rc: - Círculo
Ponto
centro: EU
EU
.
I raio: I 30 I
x: I 100 I
y: I 100 I
desenhar ( 1)
. EU
EU
.
EU
EU
.
w1n: ... - Gráfico de vitória
.
•
Há uma "pegadinha" sutil que você precisa ter em mente ao usar objetos. É possível que duas
variáveis diferentes se refiram exatamente ao mesmo objeto; as alterações feitas no objeto por meio
de uma variável também serão visíveis para a outra. Suponha, por exemplo, que estamos tentando
escrever uma sequência de código que desenha uma carinha sorridente. Queremos criar dois olhos
separados por 20 unidades. Aqui está uma sequência de código destinada a desenhar os olhos:
, 0)
A ideia básica é criar o olho esquerdo e depois copiá-lo para um olho direito, que é então movido por
20 unidades.
Isso não funciona. O problema aqui é que apenas um objeto Circle é criado. A atribuição
simplesmente faz rightEye se referir ao mesmo círculo que leftEye. A Figura 4.6
mostra a situação. Quando o círculo é movido na última linha de código, tanto
rightEye quanto leftEye se referem a ele em seu novo local no lado direito. Essa
situação em que duas variáveis se referem ao mesmo objeto é chamada de aliasing
e, às vezes, pode produzir resultados bastante inesperados.
---
Ponto ""
centro: I
EU
EU
raio: I 10 I
x: eu I 80
anos: I 50 I
olho direito:
./
Uma solução para este problema seria criar um círculo separado para cada olho:
Agora que você tem alguma idéia de como usar objetos de gráficos, estamos prontos para
experimentar uma programação gráfica real. Um dos usos mais importantes dos gráficos
é fornecer uma representação visual dos dados. Dizem que uma imagem vale mais que
mil palavras; é quase certamente melhor do que mil números. Praticamente qualquer
programa que manipula dados numéricos pode ser melhorado com um pouco de saída
gráfica. Você se lembra do programa do Capítulo 2 que calculava o valor futuro de um
investimento de dez anos? Vamos tentar criar um resumo gráfico.
Vamos usar um exemplo concreto para ilustração. Suponha que investimos $ 2.000 a
10% de juros. A Tabela 4.1 mostra o crescimento do investimento em um período de dez
anos. Nosso programa exibirá essas informações em um gráfico de barras. A Figura 4. 7
mostra os mesmos dados em forma gráfica. O gráfico contém onze barras. A primeira
barra mostra o valor original do principal. Para referência, vamos numerar essas barras de
acordo com o número de anos de juros acumulados, de 0 a 10.
Aqui está um esboço para o programa:
I anos valorizo I 0 $
2.000,00 1 $
2.200,00 2 $
2.420,00 3 $
2.662,00 4 $
2.928,20 5 $
3.221,02 6 $
3.542. 12 7 $
3.897,43 8 $
4.287,18 9 $
4.715,90 10 $
5.187,49
A pausa criada pelo último passo é necessária para manter a janela gráfica exibida para que
possamos interpretar os resultados. Sem essa pausa, o programa terminaria e o GraphWin
desapareceria com ele.
Embora esse design nos dê as pinceladas amplas para nosso algoritmo, existem alguns
detalhes muito importantes que foram encobertos. Devemos decidir exatamente qual será o
tamanho da janela gráfica e como posicionaremos os objetos que aparecem nesta janela. Por
exemplo, o que significa desenhar, digamos, uma barra para o ano cinco com altura correspondente
a $ 3.221,02?
Vamos começar com o tamanho do GraphWin. Lembre-se de que o tamanho de uma janela é
dado em termos do número de pixels em cada dimensão. As telas de computador também são
medidas em termos de pixels. O número de pixels ou resolução da tela é determinado pelo monitor
e placa gráfica do computador que você usa. A tela de resolução mais baixa que você provavelmente
encontrará em um computador pessoal hoje em dia é a chamada tela VGA estendida , com
1024x768 pixels.
A maioria das telas são consideravelmente maiores. Nossa janela padrão de 200 x 200 pixels
provavelmente parecerá um pouco pequena. Vamos fazer o GraphWin 320x240; que o tornará
cerca de 1/8 do tamanho de uma tela pequena.
Machine Translated by Google
Figura 4. 7: Gráfico de barras mostrando crescimento de US$ 2.000 com juros de 1 Oo/o
Dada essa análise, podemos detalhar um pouco do nosso design. A terceira linha do
design agora deve ler:
Você pode estar se perguntando como isso se traduzirá em código Python. Você já viu que o construtor
GraphWin permite que um parâmetro opcional especifique o título da janela. Você também pode fornecer
parâmetros de largura e altura para controlar o tamanho da janela. Assim, o comando para criar a janela de
saída será:
Em seguida, voltamos ao problema de imprimir etiquetas ao longo da borda esquerda de nossa janela.
Para simplificar o problema, vamos supor que o gráfico é sempre dimensionado para um máximo de $ 10.000
com os cinco rótulos "O.OK" a "10.0K", conforme mostrado na janela de exemplo. A questão é como os rótulos
devem ser desenhados? Vamos precisar de alguns objetos Text . Ao criar Texto, especificamos o ponto de
ancoragem (o ponto em que o texto está centralizado) e a string a ser usada como rótulo.
As sequências de rótulos são fáceis. Nosso rótulo mais longo tem cinco caracteres, e todos os rótulos
devem estar alinhados no lado direito de uma coluna, para que as strings mais curtas sejam preenchidas à
esquerda com espaços. A colocação das etiquetas é escolhida com um pouco
Machine Translated by Google
de cálculo e algumas tentativas e erros. Brincando com alguns exemplos interativos, parece que
uma string de comprimento cinco parece bem posicionada na direção horizontal, colocando o
centro a 20 pixels da borda esquerda. Isso deixa apenas um pouco de espaço em branco na
margem.
Na direção vertical, temos pouco mais de 200 pixels para trabalhar. Uma escala simples
seria ter 100 pixels representando $ 5.000. Isso significa que nossos cinco rótulos devem ser
espaçados em 50 pixels. Usar 200 pixels para o intervalo de 0 a 10.000 deixa 240 - 200 = 40
pixels para dividir entre as margens superior e inferior. Podemos querer deixar um pouco mais
de margem no topo para acomodar valores que cresçam além de US$ 10.000. Uma pequena
experimentação sugere que colocar o rótulo "O.OK" a 10 pixels da parte inferior (posição 230)
parece bom.
Elaborando nosso algoritmo para incluir esses detalhes, o único passo
O próximo passo no projeto original é desenhar a barra que corresponde ao valor inicial do
principal. É fácil ver onde o canto inferior esquerdo dessa barra deve estar. O valor de $ 0,0 está
localizado verticalmente no pixel 230 e os rótulos são centralizados a 20 pixels da borda esquerda.
Adicionar mais 20 pixels nos leva à borda direita dos rótulos. Assim, o canto inferior esquerdo da
barra Oth deve estar no local ( 40, 230).
Agora só precisamos descobrir onde o canto oposto (superior direito) da barra deve estar
para que possamos desenhar um retângulo apropriado. Na direção vertical, a altura da barra é
determinada pelo valor do principal.
Ao desenhar a escala, determinamos que 100 pixels equivalem a US$ 5.000. Isso significa que
temos 100/5000 = 0,02 pixels por dólar. Isso nos diz, por exemplo, que um principal de $ 2.000
deve produzir uma barra de altura 2.000(.02) = 40 pixels. Em geral, a posição y do canto superior
direito será dada por 230- (principal)(0,02). (Lembre-se que 230 é o ponto 0, e as coordenadas y
diminuem subindo.)
Qual deve ser a largura da barra? A janela tem 320 pixels de largura, mas 40 pixels são
consumidos pelos rótulos à esquerda. Isso nos deixa com 280 pixels para 11 barras:
Machine Translated by Google
280/11 = 25,4545. Vamos apenas fazer com que cada barra tenha 25 pixels; isso nos dará um
pouco de margem no lado direito. Portanto, a borda direita da nossa primeira barra estará na
posição 40 + 25 = 65.
Agora podemos preencher os detalhes para desenhar a primeira barra em nosso algoritmo:
Neste ponto, tomamos todas as principais decisões e cálculos necessários para resolver o
problema. Tudo o que resta é infiltrar esses detalhes no restante do algoritmo. A Figura 4.8 mostra
o layout geral da janela com algumas das dimensões que escolhemos.
olhar
7.Slt
240 s.ox
2,5X
50
O.OK -.
{315.230)
10 {40.230)
ÿ
{319.239)
0 eu 25
1 ..
320 ÿ
Vamos descobrir onde o canto inferior esquerdo de cada barra será localizado. Escolhemos
uma largura de barra de 25, então a barra para cada ano sucessivo começará 25 pixels mais à
direita do que no ano anterior. Podemos usar uma variável ano para representar o número do ano
e calcular a coordenada x do canto inferior esquerdo como (ano)(25) + 40. (O +40 deixa espaço na
borda esquerda para os rótulos.) Claro , a coordenada deste ponto ainda é 230 (a parte inferior do
gráfico).
Para encontrar o canto superior direito de uma barra, adicionamos 25 (a largura da barra) ao
valor x do canto inferior esquerdo. O valor do canto superior direito é determinado a partir do valor
(atualizado) do principal exatamente como determinamos para a primeira barra. Aqui está o
algoritmo refinado:
A variável xll representa x inferior esquerdo - o valor x do canto inferior esquerdo da barra.
Uau! Isso deu muito trabalho, mas finalmente estamos prontos para traduzir esse
algoritmo em código Python real. A tradução é direta usando objetos da biblioteca de
gráficos. Aqui está o programa:
# futval_graph . py
da importação de gráficos *
def main() :
# Introdução
print( "Este programa traça o crescimento de um investimento de 10 anos . ")
a Principal()
Se você estudar este programa com cuidado, verá que adicionei vários recursos
para enfeitá-lo um pouco. Todos os objetos gráficos suportam métodos para
mudança de cor. Eu configurei a cor de fundo da janela para branco:
ganhar . setBackground("branco")
Machine Translated by Google
Eu também mudei a cor do objeto bar . A linha a seguir pede que a barra pinte seu
interior de verde (porque é dinheiro, você sabe):
Você também pode alterar a cor do contorno de uma forma usando o método setOutline .
Nesse caso, optei por deixar o contorno no preto padrão para que as barras se destaquem
umas das outras. Para melhorar esse efeito, este código torna o contorno mais largo (dois
pixels em vez do padrão):
bar . setWidth(2)
A expressão range (! dex , 11) produz uma sequência de ints 1-10. O laço em
variável ano percorre esta sequência em sucessivas iterações do loop. Assim, a primeira
vez no ano é 1, depois 2, depois 3, etc., até 10. O valor de ano é então usado para calcular
a posição adequada do canto inferior esquerdo de cada barra:
xll = ano * 25 + 40
Espero que você esteja começando a pegar o jeito da programação gráfica. É um pouco
cansativo, mas muito viciante.
Outro benefício dessa abordagem é que o tamanho da janela pode ser alterado
simplesmente alterando as dimensões usadas quando a janela é criada (por exemplo , win
, 300) a).setCoords)
GraphWin( "Tic-Tac-Toe", 300 a janela (devido Como as mesmas coordenadas
os objetos span =
serão dimensionados
adequadamente para o novo
Machine Translated by Google
tamanho da janela. O uso de coordenadas de janela "brutas" exigiria alterações nas definições
das linhas.
Podemos aplicar essa ideia para simplificar nosso programa gráfico de valor futuro.
Basicamente, queremos que nossa janela gráfica vá de 0 a 10 (representando anos) na
dimensão x e de 0 a 10.000 (representando dólares) em sua dimensão. Poderíamos criar
apenas uma janela como esta:
Então, criar uma barra para quaisquer valores de ano e principal seria simples.
Cada barra começa em um determinado ano e uma linha de base de 0, e cresce para o
próximo ano e uma altura igual ao principal.
Há um pequeno problema com este esquema. Você pode ver o que eu tenho para
começar? As onze barras preencherão toda a janela; não deixamos espaço para rótulos ou
margens nas bordas. Isso é facilmente corrigido expandindo ligeiramente as coordenadas da
janela. Como nossas barras começam em 0, podemos localizar os rótulos do lado esquerdo
em -1. Podemos adicionar um pouco de espaço em branco ao redor do gráfico expandindo as
coordenadas um pouco além daquelas necessárias para nosso gráfico. Um pouco de
experimentação leva a esta definição de janela:
# futval_graph2 . py
da importação de gráficos *
def main() : #
Introdução
print( "Este programa traça o crescimento de um investimento de 10 anos . ")
a Principal()
#clique. py
da importação de gráficos *
a Principal()
qualquer outro ponto usando acessores como obter X e obter Y ou outros métodos como
desenhar e mover.
Aqui está um exemplo de um programa interativo que permite ao usuário desenhar
um triângulo clicando em três pontos em uma janela gráfica. Este exemplo é totalmente
gráfico, fazendo uso de objetos Text como prompts. Nenhuma interação com uma
janela de texto Python é necessária. Se você estiver programando em um ambiente
Microsoft Windows, poderá nomear esse programa usando uma extensão . extensão
pyw . Então, quando o programa for executado, ele nem exibirá a janela do shell do Python.
#triângulo. pyw da
importação de gráficos *
def main() :
win = GraphWin("Desenha um Triângulo")
win . setCoords (O .O, 0.0 10 .0,
, mensagem
10 . 0) =
Texto (Ponto (5 0.5) , , "Clique em três pontos")
mensagem . empatar (ganhar)
a Principal()
O triângulo de três cliques ilustra alguns novos recursos do módulo gráfico. Não há
classe de triângulo; no entanto, existe uma classe geral Polygon
Machine Translated by Google
que pode ser usado para qualquer forma fechada de vários lados. O construtor de Polygon
aceita qualquer número de pontos e cria um polígono usando segmentos de linha para
conectar os pontos na ordem fornecida e conectar o último ponto de volta ao primeiro. Um
triângulo é apenas um polígono de três lados. Uma vez que temos três pontos-pi, p2 e p3
--- criar o triângulo é um piscar de olhos:
Você também deve estudar como o objeto Text é usado para fornecer prompts. UMA
um único objeto de texto é criado e desenhado próximo ao início do programa:
Para alterar o prompt, não precisamos criar um novo objeto Text ; podemos apenas alterar
o texto que é exibido. Isso é feito perto do final do programa com o método setText :
Como você pode ver, o método getMouse do Graph Win fornece uma maneira simples
de interagir com o usuário em um programa orientado a gráficos.
No exemplo do triângulo, toda a entrada foi fornecida por meio de cliques do mouse.
Frequentemente, queremos permitir que o usuário interaja com uma janela gráfica por
meio do teclado. O objeto Graph Win fornece um método getKey () que funciona de
maneira muito semelhante ao método getMouse . Aqui está uma extensão do programa de
clique simples que permite ao usuário rotular posições em uma janela digitando uma única
tecla após cada clique do mouse:
#clickntype . py
da importação de gráficos *
def main() :
win = GraphWin("Clique e digite ", 400 para i in , 400)
range(10): . getMouse() pt = win . getKey() key
= win
Machine Translated by Google
a Principal()
Observe o que acontece no corpo do loop. Primeiro ele espera por um clique do
mouse, e o Point resultante é salvo como a variável p. Em seguida, o programa espera
que o usuário digite uma tecla no teclado. A tecla pressionada é retornada como uma
string e salva como a chave variável. Por exemplo, se o usuário pressionar g no teclado,
a tecla será a string 'g'. O Point e a string são então usados para criar um objeto de texto
(chamado label) que é desenhado na janela.
Você deve experimentar este programa para ter uma ideia do que o método getKey
faz. Em particular, veja quais strings são retornadas quando você digita algumas das
teclas mais estranhas, como <Shift>, <Ctrl> ou as teclas de movimento do cursor.
Embora o método getKey seja certamente útil, não é uma maneira muito prática
de obter uma string arbitrária de caracteres do usuário (por exemplo, um número ou
um nome). Felizmente, a biblioteca de gráficos fornece um objeto Entry que permite
ao usuário digitar a entrada diretamente em um GraphWin.
Um objeto Entry desenha uma caixa na tela que pode conter texto. Ele entende os
métodos setText e getText da mesma forma que o objeto Text . A diferença é que o
conteúdo de uma Entrada pode ser editado pelo usuário. Aqui está uma versão do
programa de conversão de temperatura do Capítulo 2 com uma interface gráfica do
usuário:
# convert_gui . pyw #
Programa para converter Celsius para Fahrenheit usando uma # interface
gráfica simples .
da importação de gráficos *
def main() :
win = GraphWin( "Celsius Converter" win . , 400 , 300)
setCoords (O .O, 0.0 , 3.0, 4.0)
Entrada de texto .
draw(win) outputText = Text (Point (2.25,1) ", ")
outputText . botão draw(win) = Text (Point ( 1 .
5 ,2.0) , "Convert It ") . botão desenhar (ganhar)
# convert input
celsius = float (inputText . getText() ) fahrenheit
= 9.0/5 .0 * celsius + 32
a Principal()
Quando executado, isso produz uma janela com uma caixa de entrada para digitar uma
temperatura Celsius e um "botão" para fazer a conversão. O botão é apenas para mostrar.
Na verdade, o programa apenas pausa para um clique do mouse em qualquer lugar da janela.
A Figura 4.9 mostra a aparência da janela quando o programa é iniciado.
Inicialmente, a caixa de entrada de entrada é definida para conter o valor 0,0. O usuário
pode deletar este valor e digitar outra temperatura. O programa pausa até que o usuário clique
no mouse. Observe que o ponto em que o usuário clica nem é salvo; o método getMouse é
usado apenas para pausar o programa até que o usuário tenha a chance de inserir um valor
na caixa de entrada.
O programa então processa a entrada em quatro etapas. Primeiro, o texto na caixa de
entrada é convertido em um número (via float). Este número é então convertido em graus
Fahrenheit. Finalmente, o número resultante é exibido na área de texto de saída . Embora
fahrenheit seja um valor flutuante, o método setText o converte automaticamente em uma
string para que possa ser exibido na caixa de texto de saída.
Machine Translated by Google
A Figura 4.10 mostra a aparência da janela depois que o usuário digitou uma entrada
e clicou com o mouse. Observe que a temperatura convertida aparece na área de saída e
o rótulo do botão mudou para "Sair" para mostrar que clicar novamente sairá do programa.
Este exemplo poderia ser muito mais bonito usando algumas das opções na biblioteca de
gráficos para alterar as cores, tamanhos e larguras de linha dos vários widgets. O código
do programa é deliberadamente espartano para ilustrar apenas os elementos essenciais
do design da GUI.
Embora as ferramentas básicas getMouse, getKey e Entry não forneçam um ambiente
GUI completo, veremos em capítulos posteriores como esses mecanismos simples podem
suportar interações surpreendentemente ricas.
Depois disso, você provavelmente desejará consultar esta seção com frequência quando
estiver escrevendo seus próprios programas gráficos.
Um dos maiores obstáculos no aprendizado de uma API é se familiarizar com os vários
tipos de dados usados. Ao ler a referência, preste muita atenção aos tipos de parâmetros e
valores de retorno dos vários métodos. Por exemplo, ao criar um círculo, é essencial que o
primeiro parâmetro fornecido seja um objeto Point (para o centro) e o segundo parâmetro seja
um número (o raio). O uso de tipos incorretos às vezes gera uma mensagem de erro imediata,
mas outras vezes os problemas podem não surgir até mais tarde, por exemplo, quando um
objeto é desenhado. Os exemplos no final de cada descrição de método incorporam literais
Python para ilustrar os tipos de dados apropriados para parâmetros.
GraphWin(title , width, height) Constrói uma nova janela gráfica para desenhar na tela. Os
parâmetros são opcionais; o título padrão é "Gráfico-
Machine Translated by Google
quaisquer transformações
, y, color) Desenha
de coordenadas
o pixel na
configuradas
posição "raw"
por (x,
setCoords.
y), ignorando plotPixel (x
setBackground (color) Define o plano de fundo da janela para a cor fornecida. A cor de fundo
padrão depende do seu sistema. Consulte a Seção 4.8.5 para obter informações sobre
como especificar cores.
Exemplo: vitória. setBackground ("branco")
getKey() Pausa para o usuário digitar uma tecla no teclado e retorna uma string
representando a tecla que foi pressionada.
2None é um objeto especial do Python frequentemente usado para indicar que uma variável não tem valor. Isso é
discutido no Capítulo 6.
Machine Translated by Google
undraw () Desenha o objeto de uma janela de desenho. Se o objeto não estiver desenhado no
momento, nenhuma ação será tomada.
Exemplo: algumObjeto. abrir()
clone () Retorna uma duplicata do objeto. Os clones são sempre criados em um estado
não desenhado. Fora isso, eles são idênticos ao objeto clonado.
Exemplo: objectCopy = someObject . clone ()
Métodos de ponto
Métodos de linha
Linha (ponto! , ponto2) Constrói um segmento de linha a partir do ponto! para ponto2.
Exemplo: aLinha = Linha (Point(1,3) , Ponto (7,4))
setArrow ( endString) Define o status da ponta de seta de uma linha. As setas podem ser
desenhadas no primeiro ponto, no último ponto ou em ambos. Os valores possíveis
de endString são "primeiro", "último",
é "nenhuma"
"ambos" e "nenhum". A configuração padrão
.
Exemplo: aLinha . setArrow("ambos")
Métodos de círculo
getP1 () do
, getP2
círculo(). Retorna
Estes são
umpontos
clone do
de canto correspondente
opostos de um quadrado
da caixa delimitadora
que circunscreve
o círculo.
Métodos Retângulos
estruturar ,ogetP2
retângulo.
() Retorna um clone do ponto correspondente usado para con getP1 ()
Métodos ovais
Oval (ponto 1, ponto2) Constrói uma oval na caixa delimitadora determinada pelo ponto
1 e ponto2.
Exemplo: anOval = Oval (Point(1,2) , Point (3,4))
estrutura oval
, getP2
getP1
0 Retorna
0. um clone do ponto correspondente usado para construir a
Métodos de polígono
getPoints () Retorna uma lista contendo clones dos pontos usados para construir o
polígono.
Exemplo: pointList = aPolygon . Ganhe pontos ()
Métodos de texto
Texto (anchorPoint , text String) Constrói um objeto de texto que exibe o texto String
centralizado em anchorPoint. O texto é exibido horizontalmente.
, 4) ,
Exemplo: mensagem = Texto (Ponto (3 "Olá!")
setFace (família) Altera a face da fonte para a família especificada. Os valores possíveis
são "helvetica", "courier", "times roman" e "arial".
Exemplo: mensagem. setFace(" arial")
set Size (ponto) Altera o tamanho da fonte para o tamanho de ponto fornecido . Tamanhos de 5
a 36 pontos são legais.
Exemplo: mensagem. definirTamanho ( 18)
setStyle (estilo) Altera a fonte para o estilo fornecido. Os valores possíveis são: "normal",
"negrito", " itálico ", e "negrito itálico".
Exemplo: mensagem. setStyle ("negrito")
Machine Translated by Google
setTextColor (color) Define a cor do texto para colorir. Nota: setFill tem
o mesmo efeito.
Objetos do tipo Entry são exibidos como caixas de entrada de texto que podem ser
editadas pelo usuário do programa. Os objetos de entrada suportam os métodos gráficos
genéricos move 0, draw (graphwin), undraw 0, setFill (color) e clone 0 . Os
Entry (centerPoint width), Constrói uma entrada com o ponto central e a largura fornecidos.
A largura é especificada em número de caracteres de texto que podem ser exibidos.
get Text() Retorna a string de texto que está atualmente na caixa de entrada.
Exemplo: inputStr = inputBox . getText()
set Text (string) Define o texto na caixa de entrada para a string fornecida.
Exemplo: caixa de entrada. setText ("32. 0")
setFace (família) Altera a face da fonte para a família especificada. Os valores possíveis
são "helvetica", "courier", "times roman" e "arial".
Exemplo: caixa de entrada. setFace( "correio")
set Size (ponto) Altera o tamanho da fonte para o tamanho de ponto fornecido . Tamanhos de 5
a 36 pontos são legais.
Exemplo: caixa de entrada. definir Tamanho (12)
setStyle (estilo) Altera a fonte para o estilo fornecido. Os valores possíveis são: "normal",
"negrito", "itálico" e "negrito itálico".
Exemplo: caixa de entrada. setStyle ("itálico")
.gif"), "flor
Exemplo: flowerimage = Image (Point ( 100, 100)
Exemplo: imagem em branco = Imagem (320 , 240)
save (nome do arquivo) Salva a imagem em um arquivo. O tipo do arquivo resultante (por
exemplo, GIF ou PPM) é determinado pela extensão do nome do arquivo.
Exemplo: imagem de flor . save("mypic.ppm")
Machine Translated by Google
update () Faz com que quaisquer operações gráficas pendentes sejam executadas e os resultados
exibidos.
que o loop irá "girar" no máximo 30 vezes por segundo. O comando de atualização inserirá uma pausa
apropriada a cada vez para manter uma taxa relativamente constante. Obviamente, a limitação de taxa
só funcionará quando o próprio corpo do loop for executado em menos de 1/30 de segundo.
Este capítulo introduziu computação gráfica e programação baseada em objetos. Aqui está um resumo
de alguns dos conceitos importantes:
• Todo objeto é uma instância de alguma classe. É a classe que determina quais métodos um
objeto terá. Uma instância é criada chamando um método construtor.
• O módulo gráfico fornecido com este livro fornece várias classes úteis para programação gráfica.
Um GraphWin é um objeto que representa uma janela na tela para exibir gráficos. Vários objetos
gráficos como Ponto, Linha, Círculo, Retângulo, Oval, Polígono e Texto podem ser desenhados
em um GraphWin. Os usuários podem interagir com um GraphWin clicando com o mouse ou
digitando em uma caixa de entrada .
• A situação em que duas variáveis se referem ao mesmo objeto é chamada de alias. Às vezes,
o alias pode causar resultados inesperados. O uso do método clone na biblioteca de gráficos
pode ajudar a evitar essas situações.
14.10 I Exercícios
Perguntas de revisão
Verdadeiro falso
1. Usando gráficos. py permite que gráficos sejam desenhados em uma janela de shell do Python.
4. Uma função que cria uma nova instância de uma classe é chamada de acessador.
10. O método na biblioteca de gráficos usado para obter um clique do mouse é read.Mouse.
Múltipla escolha
,
, 10) , Ponto(O,O))
6. Qual comando seria usado para desenhar a forma do objeto gráfico na janela de
gráficos ? a) vencer. desenhar (forma) b) ganhar c) forma . empate ()
. mostrar (forma)
d) forma . empatar (ganhar)
8. Que tipo de objeto pode ser usado para obter entrada de texto em uma janela gráfica?
a) Texto b) Entrada c) Entrada d) Teclado
Discussão
2. Descreva com suas próprias palavras o objeto produzido por cada uma das
seguintes operações do módulo gráfico. Seja o mais preciso possível. Certifique-
se de mencionar coisas como tamanho, posição e aparência dos vários objetos.
Você pode incluir um esboço se isso ajudar.
da importação de gráficos *
def main() :
win = GraphWin()
shape = Circle (Point (50 , 50) , 20)
shape . setOutline ("red")
shape . setFill ("red")
shape . draw(win) for i in
range ( 10): p = win .
getMouse() c = forma .
getCenter() dx = p.getX()
- c.getX()
Machine Translated by Google
dy = p.getY() - c.getY()
perto ()move (dx,dy) forma .
win .
principal()
Exercícios de programação
(b) Faça com que cada clique sucessivo desenhe um quadrado adicional na tela
(em vez de mover o existente).
(c) Imprima uma mensagem na janela "Clique novamente para sair" após o loop e aguarde um
clique final antes de fechar a janela.
2. Um alvo de tiro com arco consiste em um círculo central de amarelo cercado por anéis concêntricos
de vermelho, azul, preto e branco. Cada anel tem a mesma largura, que é igual ao raio do círculo
amarelo. Escreva um programa que desenhe tal alvo. Dica: Objetos desenhados posteriormente
aparecerão em cima de objetos desenhados anteriormente.
4. Escreva um programa que desenhe uma cena de inverno com uma árvore de Natal e um
boneco de neve.
5. Escreva um programa que tire 5 dados na tela representando uma sequência (1, 2, 3, 4, 5 ou 2, 3,
4, 5, 6).
6. Modifique o programa gráfico de valor futuro para que a entrada (principal e APR) também seja feita
de forma gráfica usando objetos Entry .
Machine Translated by Google
7. Intersecção do Círculo.
Saída: Desenhe um círculo centrado em (0, 0) com o raio dado em uma janela com coordenadas
que vão de -10,-10 a 10,10.
Desenhe uma linha horizontal na janela com a interseção y fornecida.
Desenhe os dois pontos de interseção em vermelho.
Imprima os valores de x dos pontos de interseção.
Fórmula: x = ±y'r 2 2e
Fórmulas: dx = x2 - x1 dy
= Y2 - Yl
inclinação = dy /
dx comprimento = J dx2 + dy2
9. Informações do retângulo.
Igual ao problema anterior, mas com três cliques para os vértices de um triângulo.
Você deve escrever um programa que permita ao usuário desenhar uma casa
simples usando cinco cliques do mouse. Os dois primeiros cliques serão os cantos
opostos da estrutura retangular da casa. O terceiro clique indicará o centro da borda
superior de uma porta retangular. A porta deve ter uma largura total que seja ÿ da largura
da estrutura da casa. As laterais da porta devem se estender dos cantos da parte superior
até a parte inferior da moldura. O quarto clique indicará o centro de uma janela quadrada.
A janela tem metade da largura da porta. O último clique indicará o pico do telhado.
3 [±]