⇤ ← Revisão 1e 2004-08-16 18:27:02
4182
Comentário:
|
5059
|
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.