Hier etwas zum herumspielen:Philipp68 hat geschrieben:Hallo,
ich habe einen Button, der die Aktivität einer LED darstellen soll.
Anfangs ist die Farbe des Buttons grün (LED an), nachdem ich einmal den Button geklickt habe, soll er rot werden (LED rot). Beim zweiten Mal, soll dieser wieder grün werden (um wieder LED anzuschalten)
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from functools import partial
from math import sin, cos, radians
try:
# Tkinter for Python 2.xx
import Tkinter as tk
except ImportError:
# Tkinter for Python 3.xx
import tkinter as tk
APP_TITLE = "LED-Rosette"
APP_XPOS = 100
APP_YPOS = 100
APP_WIDTH = 500
APP_HEIGHT = 500
LEDS = 24
LED_GEOMETRY = 20
LED_ON = 'red'
LED_OFF = 'green'
LED_ANGLE_GAP = 360 / LEDS
RADIUS = 200
class LedRosette(tk.Canvas):
def __init__(self, master=None):
tk.Canvas.__init__(self, master)
self.angle = 0
self.x_center = (APP_WIDTH / 2)
self.y_center = (APP_HEIGHT / 2)
self.leinwand = tk.Canvas(self, width=APP_WIDTH, height=APP_HEIGHT)
self.leinwand.pack()
for led_nr in range(LEDS):
xpos, ypos = self.zeigerBewegung()
button = tk.Button(self, bg=LED_OFF, activebackground=LED_OFF)
button.place(x=0, y=0, width=LED_GEOMETRY, height=LED_GEOMETRY)
button.bind('<Button-1>', partial(self.callback, led_nr))
self.create_window(xpos, ypos, window=button)
def zeigerBewegung(self):
x = RADIUS * sin(radians(self.angle)) + self.x_center
y = RADIUS * cos(radians(180 + self.angle)) + self.y_center
self.angle += LED_ANGLE_GAP
return x, y
def callback(self, led_nr, event):
print('LED-{}'.format(led_nr))
widget = event.widget
if widget['bg'] == LED_ON:
widget['bg'] = LED_OFF
widget['activebackground'] = LED_OFF
else:
widget['bg'] = LED_ON
widget['activebackground'] = LED_ON
def main():
app_win = tk.Tk()
app_win.title(APP_TITLE)
app_win.geometry("+{}+{}".format(APP_XPOS, APP_YPOS))
app_win.option_add('*highlightThickness', 0)
LedRosette(app_win).pack()
app_win.mainloop()
if __name__ == '__main__':
main()