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

Diferenças para "SorteadorDeElemento"

Diferenças entre as versões de 1 e 2
Revisão 1e 2004-08-16 18:27:02
Tamanho: 4182
Comentário:
Revisão 2e 2005-07-16 15:47:33
Tamanho: 5059
Editor: PedroWerneck
Comentário:
Deleções são marcadas assim. Adições são marcadas assim.
Linha 13: Linha 13:
Linha 22: Linha 23:
        
Linha 28: Linha 29:
        
Linha 46: Linha 47:
        
Linha 59: Linha 60:
        
Linha 72: Linha 73:
        self.nomeSorteadoT = nomeSorteadoT
Linha 77: Linha 80:

        if not listaSorteia:
            return

        t = 0

        while len(listaSorteia) > 1:
            random.shuffle(listaSorteia)
            for nome in listaSorteia:
                self.after(t, self.text.set, nome)
                t += 1000 / len(listaSorteia)
            listaSorteia.pop()

        sorteado = listaSorteia.pop()
        self.after(t + 1000, self.fimSorteio, sorteado)

    def fimSorteio(self, sorteado):
        self.text.set(sorteado)
        self.nomeSorteadoT['fg'] = 'red'
        self.bell()
Linha 78: Linha 101:
        if not len(listaSorteia):
            return
        
        random.shuffle(listaSorteia)
        sorteado = random.randint(0, \
                         len(listaSorteia) - 1)
        self.text.set(listaSorteia[sorteado])
    def _getLista(self):
        listbox = self.listbox
Linha 86: Linha 104:
    def _getLista(self):
        lista = []
        for element in range(self.listbox.size()):
            lista.append(self.listbox.get(element))
        lista = [listbox.get(i) for i in range(listbox.size())]
Linha 91: Linha 106:
    
Linha 115: Linha 130:
        
Linha 122: Linha 137:
        
Linha 136: Linha 151:
''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''

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

Volta para CookBook.


OsvaldoSantanaNeto