associação pythonbrasil[11] django zope/plone planet Início Logado como (Entrar)

AdivinhacaoTkinter

Receita: Jogo de adivinhação

Baixe aqui o código completo

A lógica desse jogo é que o usuário pensa em um número de 1 à 60, e selecionando as tabelas em que o número aparece, o jogo adivinha o número que o usuário pensou.

Este exemplo mostra como trabalhar com o Tkinter para carregar imagens, criar frames, trabalhar com botões e caixas de checagem, messagebox.

Esse jogo foi criado com o intuito de utilizar Python para gerar programas em modo gráfico, sem ter que recorrer a instalação de novos recursos como PyGame, PyGtk.

Código

   1 # -*- coding: cp1252 -*-
   2 import Tkinter; Tk = Tkinter
   3 import tkMessageBox
   4 
   5 class App(Tk.Frame):
   6 #cria o Frame e seta as variáveis do jogo
   7     def __init__(self, master = None):
   8         Tk.Frame.__init__ (self, master)
   9 
  10         self.varA = Tk.IntVar()
  11         self.varB = Tk.IntVar()
  12         self.varC = Tk.IntVar()
  13         self.varD = Tk.IntVar()
  14         self.varE = Tk.IntVar()
  15         self.varF = Tk.IntVar()
  16 
  17 # carrega as imagens 
  18 
  19     def criaImagens(self):
  20         self.__image_runner1__ = Tk.PhotoImage('runner1',file="1.gif")
  21         self.__image_runner2__ = Tk.PhotoImage('runner2',file="2.gif")
  22         self.__image_runner3__ = Tk.PhotoImage('runner3',file="3.gif")
  23         self.__image_runner4__ = Tk.PhotoImage('runner4',file="4.gif")
  24         self.__image_runner5__ = Tk.PhotoImage('runner5',file="5.gif")
  25         self.__image_runner6__ = Tk.PhotoImage('runner6',file="6.gif")
  26 
  27 # seta onde as imagens devem ser carregadas
  28 
  29         self.img_1 = Tk.Label (self,  {'image' : 'runner1'})
  30         self.img_2 = Tk.Label (self,  {'image' : 'runner2'})
  31         self.img_3 = Tk.Label (self,  {'image' : 'runner3'})
  32         self.img_4 = Tk.Label (self,  {'image' : 'runner4'})
  33         self.img_5 = Tk.Label (self,  {'image' : 'runner5'})
  34         self.img_6 = Tk.Label (self,  {'image' : 'runner6'})
  35 
  36 #cria as caixas de checagem atribuindo a variável usada
  37 
  38     def criaCheck(self):
  39         self.a = Tk.Checkbutton(self, variable=self.varA)
  40         self.b = Tk.Checkbutton(self, variable=self.varB)
  41         self.c = Tk.Checkbutton(self, variable=self.varC)
  42         self.d = Tk.Checkbutton(self, variable=self.varD)
  43         self.e = Tk.Checkbutton(self, variable=self.varE)
  44         self.f = Tk.Checkbutton(self, variable=self.varF)
  45 
  46 #cria os botões  
  47 
  48     def criaBot(self):
  49         self.btOK=Tk.Button(self, text = "Resultado", command=self.btOK)
  50         self.btSAIR=Tk.Button(self, text = "Sair", command=self.btSAIR)
  51 
  52 #configura as linhas e colunas do frame, que serão usadas para carregar as imagens, botões e caixas de checagem
  53 
  54     def configuraFrame(self):
  55         self.rowconfigure (1, {'weight' : 1, 'minsize' : 30})
  56         self.rowconfigure (2, {'weight' : 0, 'minsize' : 30})
  57         self.rowconfigure (3, {'weight' : 0, 'minsize' : 30})
  58         self.rowconfigure (4, {'weight' : 0, 'minsize' : 30})
  59         self.columnconfigure (1, {'weight' : 0, 'minsize' : 30})
  60         self.columnconfigure (2, {'weight' : 0, 'minsize' : 30})
  61         self.columnconfigure (3, {'weight' : 0, 'minsize' : 30})
  62         self.columnconfigure (4, {'weight' : 0, 'minsize' : 30})
  63         self.columnconfigure (5, {'weight' : 0, 'minsize' : 30})
  64 
  65 #coloca o objeto(caixas, botões e imagens) em suas posições na tela (coluna x linha)
  66 
  67     def posicionaObjetos(self):
  68         self.img_1.grid({
  69               'in' : self,
  70               'column' : '1',
  71               'row' : '1',
  72               'sticky' : ''
  73               })
  74 
  75         self.img_2.grid({
  76               'in' : self,
  77               'column' : '2',
  78               'row' : '1',
  79               'sticky' : ''
  80               })
  81 
  82         self.img_3.grid({
  83               'in' : self,
  84               'column' : '3',
  85               'row' : '1',
  86               'sticky' : ''
  87               })
  88 
  89         self.img_4.grid({
  90               'in' : self,
  91               'column' : '1',
  92               'row' : '3',
  93               'sticky' : ''
  94               })
  95 
  96         self.img_5.grid({
  97               'in' : self,
  98               'column' : '2',
  99               'row' : '3',
 100               'sticky' : ''
 101               })
 102 
 103         self.img_6.grid({
 104               'in' : self,
 105               'column' : '3',
 106               'row' : '3',
 107               'sticky' : ''
 108               })
 109 
 110         self.a.grid({
 111               'in' : self,
 112               'column' : '1',
 113               'row' : '2',
 114               'sticky' : ''
 115               })
 116 
 117         self.b.grid({
 118               'in' : self,
 119               'column' : '2',
 120               'row' : '2',
 121               'sticky' : ''
 122               })
 123 
 124         self.c.grid({
 125               'in' : self,
 126               'column' : '3',
 127               'row' : '2',
 128               'sticky' : ''
 129               })
 130 
 131         self.d.grid({
 132               'in' : self,
 133               'column' : '1',
 134               'row' : '4',
 135               'sticky' : ''
 136               })
 137 
 138         self.e.grid({
 139               'in' : self,
 140               'column' : '2',
 141               'row' : '4',
 142               'sticky' : ''
 143               })
 144 
 145         self.f.grid({
 146               'in' : self,
 147               'column' : '3',
 148               'row' : '4',
 149               'sticky' : ''
 150               })
 151 
 152         self.btOK.grid({
 153               'in' : self,
 154               'column' : '2',
 155               'row' : '5',
 156               'sticky' : ''
 157               })
 158         self.btSAIR.grid({
 159               'in' : self,
 160               'column' : '3',
 161               'row' : '5',
 162               'sticky' : ''
 163               })
 164 #cria a função de retorno das variáveis das checkbox
 165 
 166     def pegarA(self):
 167         return self.varA.get()
 168 
 169     def pegarB(self):
 170         return self.varB.get()
 171 
 172     def pegarC(self):
 173         return self.varC.get()
 174 
 175     def pegarD(self):
 176         return self.varD.get()
 177 
 178     def pegarE(self):
 179         return self.varE.get()
 180 
 181     def pegarF(self):
 182         return self.varF.get()
 183 
 184 #desenha a tela    
 185 
 186     def mostraFrame(self, **packOptions):
 187         self.pack(packOptions)
 188 
 189     
 190     def setres(self,res):
 191         self.res = res
 192     
 193 #define as funções do botão sair (fechar o jogo)
 194 
 195     def btSAIR(self):
 196         self.master.destroy()
 197         self.destroy()
 198 
 199 #define as funções do botão OK (pegar o valor das variáveis)
 200 
 201     def btOK(self):
 202         self.res.calcula(self)
 203         self.varA.set(0)
 204         self.varB.set(0)
 205         self.varC.set(0)
 206         self.varD.set(0)
 207         self.varE.set(0)
 208         self.varF.set(0)
 209 
 210         
 211 #faz o calculo do número pensado, seguindo a lógica que se a primeira checkbox for selecionada o valor será 1, a segunda será 2, a terceira será 4, a quarta será 8, a quinta 16 e sexta 32. Pois a soma dos variáveis onde o número pensado aparece utiliza-se desta regra para dar a resposta ao usuário
 212 
 213 class Resultado(Tk.Frame):
 214     def calcula(self,app):
 215         self.x = 0
 216         if app.pegarA() == 1:
 217             self.x+= 1
 218         if app.pegarB() == 1:
 219             self.x+= 2
 220         if app.pegarC() == 1:
 221             self.x+= 4
 222         if app.pegarD() == 1:
 223             self.x+= 8
 224         if app.pegarE() == 1:
 225             self.x+= 16
 226         if app.pegarF() == 1:
 227             self.x+= 32
 228 
 229         res = self.montaTela()
 230         return res
 231 #cria a tela do resultado
 232         
 233     def montaTela(self, master2=None):
 234 
 235         if self.x <= 0:
 236             res = tkMessageBox.showinfo("RESULTADO ", "Você não pensou em nenhum número")
 237         elif self.x > 60:
 238             res = tkMessageBox.showinfo("RESULTADO ", "Por favor pense em números de 1 a 60")
 239         else:
 240             res = tkMessageBox.showinfo("RESULTADO ", "Você pensou no número: "+str(self.x)) 
 241 
 242         return res
 243    
 244     def btSAIR(self):
 245         self.master2.destroy()
 246 #cria o aplicativo propriamente dito        
 247 def inicia():
 248     app = App()
 249     res = Resultado()
 250 
 251     app.setres(res)
 252     app.criaImagens()
 253     app.criaCheck()
 254     app.criaBot()
 255     app.configuraFrame()
 256     app.posicionaObjetos()
 257     app.mostraFrame(fill = 'both', expand = 1)
 258  
 259     app.mainloop ()
 260 
 261 
 262 if __name__ == '__main__':
 263     inicia()

Volta para CookBook.


Fabio Meincheim <fabio.jgs@gmail.com> Graduando em Sistemas de Informação no IST - Instituto Superior Tupy - Joinville - SC

Eduardo da Silva <eduardo.silva@gmail.com> Professor de programação do IST.