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

Diferenças para "SorteadorDeElemento"

Diferenças entre as versões de 3 e 4
Revisão 3e 2006-01-18 00:00:31
Tamanho: 5030
Editor: FabioCorrea
Comentário: Refactoring Wiki - eliminando pragma
Revisão 4e 2006-06-05 02:55:17
Tamanho: 5340
Editor: EricoAndrei
Comentário:
Deleções são marcadas assim. Adições são marcadas assim.
Linha 12: Linha 12:

inscritos = ['',]
Linha 34: Linha 36:
            textvariable=self.nome, width=30)             textvariable=self.nome, width=50)
Linha 76: Linha 78:
 for nome in inscritos:
  self.listbox.insert(END, nome)
Linha 79: Linha 84:
        self.nomeSorteadoT['fg'] = 'black'
Linha 86: Linha 91:
            random.shuffle(listaSorteia)
            for nome in listaSorteia:
            
self.after(t, self.text.set, nome)
     t += 1000 / len(listaSorteia)
            listaSorteia.pop()
  nome = random.choice(listaSorteia)
  self.after(t, self.text.set, nome)
            t += 1000 / len(listaSorteia)
            listaSorteia.remove(nome)
Linha 99: Linha 103:
        
Linha 152: Linha 156:

''Página atualizada para representar as modificações feitas para o sorteio da II PyConBrasil. Retiramos o shuffle (que tornava a aplicação muito lenta) e utilizamos o choice para sortear cada um dos nomes da lista. -- EricoAndrei''

Receita: Sorteador de Elementos

Na empresa onde trabalho temos o hábito de promover sorteios para a distribuição de brindes que ganhamos em feiras, congressos e coisas do tipo. Recentemente ganhei um convite do Gmail e resolvi sortear entre o pessoal aqui da empresa. Para isso fiz o programinha abaixo... Sintam-se à vontade para melhorar ele :)

Código

   1 #!/usr/bin/env python
   2 # -*- coding: ISO-8859-1 -*-
   3 
   4 
   5 inscritos = ['',]
   6 
   7 from Tkinter import *
   8 from Dialog import Dialog
   9 import time
  10 import random
  11 
  12 class MainFrame(Frame):
  13     def __init__(self, parent=None):
  14         Frame.__init__(self, parent)
  15         self.master.title("Sorteia")
  16 
  17         self.text = StringVar()
  18         self.nome = StringVar()
  19         self.createWidgets()
  20         self.pack(padx=10, pady=10)
  21 
  22 
  23     def createWidgets(self):
  24         panel1 = Frame(self)
  25         nomeL = Label(panel1, text="Nome:")
  26         nomeL.pack(side=LEFT)
  27         self.nomeE = Entry(panel1, \
  28             textvariable=self.nome, width=50)
  29         self.nomeE.pack(side=LEFT)
  30         self.nomeE.bind("<Return>", self.addEnter)
  31         addB = Button(panel1, text="  +  ", \
  32                       command=self.adicionar)
  33         addB.pack(side=LEFT)
  34         subB = Button(panel1, text="  -  ", \
  35                       command=self.remover)
  36         subB.pack(side=LEFT)
  37         panel1.pack(side=TOP)
  38 
  39         panel2 = Frame(self)
  40 
  41         scrollbar = Scrollbar(panel2, orient=VERTICAL)
  42         self.listbox = Listbox(panel2, \
  43                        yscrollcommand=scrollbar.set, \
  44                        font=("System", 10, "bold"))
  45         self.listbox.pack(side=LEFT, fill=BOTH, expand=1)
  46         scrollbar.config(command=self.listbox.yview)
  47         scrollbar.pack(side=RIGHT, fill=Y)
  48 
  49         panel2.pack(side=TOP, fill=BOTH, \
  50                               expand=Y, pady=10)
  51 
  52         panel3 = Frame(self)
  53 
  54         sorteiaB = Button(panel3, text="Sorteia",\
  55                           font=("Arial", 10, "bold"), \
  56                           command=self.sorteia)
  57 
  58         sorteiaB.pack(side=TOP, fill=BOTH, expand=Y)
  59 
  60         nomeSorteadoT = Label(panel3, \
  61                              textvariable=self.text, \
  62                              font=("Arial", 18, "bold"))
  63         nomeSorteadoT.pack(side=TOP, fill=BOTH, \
  64                              expand=Y, pady=20)
  65 
  66         self.nomeSorteadoT = nomeSorteadoT
  67 
  68         panel3.pack(side=TOP, fill=BOTH, expand=Y)
  69 
  70         for nome in inscritos:
  71                 self.listbox.insert(END, nome)
  72 
  73 
  74     def sorteia(self):
  75         listaSorteia = self._getLista()
  76         self.nomeSorteadoT['fg'] = 'black'
  77         if not listaSorteia:
  78             return
  79 
  80         t = 0
  81 
  82         while len(listaSorteia) > 1:
  83             nome = random.choice(listaSorteia)
  84             self.after(t, self.text.set, nome)
  85             t += 1000 / len(listaSorteia)
  86             listaSorteia.remove(nome)
  87 
  88         sorteado = listaSorteia.pop()
  89         self.after(t + 1000, self.fimSorteio, sorteado)
  90 
  91     def fimSorteio(self, sorteado):
  92         self.text.set(sorteado)
  93         self.nomeSorteadoT['fg'] = 'red'
  94         self.bell()
  95 
  96     def _getLista(self):
  97         listbox = self.listbox
  98 
  99         lista = [listbox.get(i) for i in range(listbox.size())]
 100         return lista
 101 
 102     def adicionar(self):
 103         nome = self.nome.get()
 104         if not len(nome):
 105             Dialog(self, title="Erro!", \
 106                          text="Nome inválido", \
 107                          bitmap='error', \
 108                          default=0, \
 109                          strings=('OK',))
 110             return
 111 
 112         if nome in self._getLista():
 113             Dialog(self, title="Erro!", \
 114                          text="Já cadastrado", \
 115                          bitmap='error', \
 116                          default=0, \
 117                          strings=('OK',))
 118             return
 119 
 120         self.listbox.insert(END, nome)
 121         self.limpaCampos()
 122 
 123     def addEnter(self, ev):
 124         self.adicionar()
 125 
 126     def remover(self):
 127         self.listbox.delete(ANCHOR)
 128 
 129     def limpaCampos(self):
 130         self.nome.set("")
 131         self.nomeE.focus()
 132 
 133 
 134 
 135 def main():
 136     frm = MainFrame()
 137     frm.mainloop()
 138 
 139 if __name__ == '__main__':
 140     main()

Uma das coisas que tentei fazer e não consegui é um 'efeito visual' que faça com que os nomes fiquem passando antes de parar no nome realmente sorteado. Eu fiz mudar mas a tela não atualizava. Alguém sabe como fazer isso? -- OsvaldoSantanaNeto

Bom... passatempo pra manhã de domingo. :) Ele embaralha a lista de nomes, expõe eles na Label por um tempo igual a 1s / comprimento da lista (assim dá um efeito de "desaceleração" quando o sorteio ocorre). A cada vez que faz isso, retira um dos nomes da lista, embaralha e começa tudo de novo. Quando restar só um nome (o sorteado) ele exibe o nome na Label, muda a cor pra vermelho e emite um sinal (só pra ter certeza). -- PedroWerneck

Página atualizada para representar as modificações feitas para o sorteio da II PyConBrasil. Retiramos o shuffle (que tornava a aplicação muito lenta) e utilizamos o choice para sortear cada um dos nomes da lista. -- EricoAndrei

Volta para CookBook.


OsvaldoSantanaNeto