问题
I have have been working on a simple piece of python 3.4 code using tkinter. It is a dice roller for D&D. It has buttons for all the basic dice, and one that allows you to input a number of sides.
The way I laid it out reminded me of a keypad, so i thought I should add in something that allows you to click the buttons by pushing the buttons. I figured out the system for clicking the buttons to get the function to call, but I can't figure out how to make the button animation go.
Is there a way to do this? Please help. Thanks!
from tkinter import *
import tkinter.simpledialog as simpledialog
from random import randint
import os
root = Tk()
root.title("Die Roller")
root.geometry("200x215")
app = Frame(root)
app.grid()
v = StringVar()
w = Label(root, textvariable= v)
w.grid()
print("Results:")
def ad4():
x = randint(1,4)
v.set(x)
print(x)
def ad6():
x = randint(1,6)
v.set(x)
print(x)
def ad8():
x = randint(1,8)
v.set(x)
print(x)
def ad10():
x = randint(1,10)
v.set(x)
print(x)
def ad12():
x = randint(1,12)
v.set(x)
print(x)
def ad20():
x = randint(1,20)
v.set(x)
print(x)
def ad100():
x = randint(1,100)
v.set(x)
print(x)
def other():
try:
x = simpledialog.askinteger("Sides", "How many sides are there?")
y = randint(1, x)
print(y)
v.set(y)
except TypeError:
cls()
def cls():
os.system(['clear','cls'][os.name == 'nt'])
d4 = Button(app, text = "d4", command=ad4, height = 2, width = 5, fg="white", bg="blue")
d4.grid(row=0, column=0, padx=10, pady=10)
d6 = Button(app, text = "d6", command=ad6, height = 2, width = 5, fg="white", bg="blue")
d6.grid(row=0, column=1, padx=10, pady=10)
d8 = Button(app, text = "d8", command=ad8, height = 2, width = 5, fg="white", bg="blue")
d8.grid(row=0, column=2, padx=10, pady=10)
d10 = Button(app, text = "d10", command=ad10, height = 2, width = 5, fg="white", bg="blue")
d10.grid(row=1, column=0, padx=10, pady=10)
d12 = Button(app, text = "d12", command=ad12, height = 2, width = 5, fg="white", bg="blue")
d12.grid(row=1, column=1, padx=10, pady=10)
d20 = Button(app, text = "d20", command=ad20, height = 2, width = 5, fg="white", bg="blue")
d20.grid(row=1, column=2, padx=10, pady=10)
d100 = Button(app, text = "d100", command=ad100, height = 2, width = 5, fg="white", bg="blue")
d100.grid(row=2, column=0, padx=10, pady=10)
otherbutton = Button(app, text = "Other", command=other, height = 2, width = 5, fg="white", bg="blue")
otherbutton.grid(row=2, column=1, padx=10, pady=10)
clearButton = Button(app, text = "Clear", command=cls, height =2, width = 5, fg="white", bg="blue")
clearButton.grid(row=2, column=2, padx=10, pady=10)
def onKeyPress(event):
if event.char == '7':
ad4()
if event.char == '8':
ad6()
if event.char == '9':
ad8()
if event.char == '4':
ad10()
if event.char == '5':
ad12()
if event.char == '6':
ad20()
if event.char == '1':
ad100()
if event.char == '2':
other()
if event.char == '3':
cls()
root.bind('<KeyPress>', onKeyPress)
root.mainloop()
回答1:
Here's a short demo of how to make the button look like you've pressed it when you hit its key. The trick is to change its relief
parameter to SUNKEN, wait a moment, and then change the relief
back to RAISED.
#!/usr/bin/env python
""" "Animate" a Tkinter button
Make the button look like it's been pressed when the user
hits the key associated with the button.
See http://stackoverflow.com/q/31900552/4014959
Written by PM 2Ring 2015.08.09
"""
import tkinter as tk
maxbutton = 5
maxkey = str(maxbutton)
def button_cb(ch):
print('Button ' + ch + ' pressed')
def onKeyPress(event):
ch = event.char
if '1' <= ch <= maxkey:
#Retrieve this button from the dict
b = buttons[ch]
#Simulate pushing the button
b.config(relief=tk.SUNKEN)
button_cb(ch)
#Let it pop back up after 200 milliseconds
b.after(200, lambda: b.config(relief=tk.RAISED))
root = tk.Tk()
root.title("Key / Button Demo")
#A dict to save the buttons in. The dict keys are the button texts.
buttons = {}
#Make some buttons
for i in range(1, maxbutton + 1):
s = str(i)
b = tk.Button(root, text=s, command=lambda ch=s: button_cb(ch))
b.pack(side=tk.LEFT)
#Save this button in the dict
buttons[s] = b
root.bind('<KeyPress>', onKeyPress)
root.mainloop()
If you like, you can also make the button light up temporarily (like it does when you hover the mouse over it) when you press its key. To do that, you need to toggle the button's state
between ACTIVE and NORMAL.
Eg, changeb.config(relief=tk.SUNKEN)
tob.config(relief=tk.SUNKEN, state=tk.ACTIVE)
and changeb.after(200, lambda: b.config(relief=tk.RAISED))
tob.after(200, lambda: b.config(relief=tk.RAISED, state=tk.NORMAL))
来源:https://stackoverflow.com/questions/31900552/tkinter-button-animation