5059
Comentário:
|
5333
|
Deleções são marcadas assim. | Adições são marcadas assim. |
Linha 1: | Linha 1: |
#pragma section-numbers off | |
Linha 13: | Linha 12: |
inscritos = ['',] |
|
Linha 35: | Linha 36: |
textvariable=self.nome, width=30) | textvariable=self.nome, width=50) |
Linha 77: | Linha 78: |
for nome in inscritos: self.listbox.insert(END, nome) |
|
Linha 80: | Linha 84: |
self.nomeSorteadoT['fg'] = 'black' | |
Linha 87: | 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 94: | Linha 97: |
self.after(t + 1000, self.fimSorteio, sorteado) | self.after(t, self.fimSorteio, sorteado) |
Linha 100: | Linha 103: |
Linha 153: | 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, 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.