Zwei Befehle für Button

Fragen zu Tkinter.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hier die Variante mit normalen Buttons von Redundanzen bereinigt:

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, **kwargs):
        tk.Canvas.__init__(self, master, **kwargs)
        
        self.angle = 0 

        self.x_center = (APP_WIDTH / 2)
        self.y_center = (APP_HEIGHT / 2)

        self.button_states = [False]*LEDS
        
        for led_nr in range(LEDS):
            xpos, ypos = self.place_coords()
            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 place_coords(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:
            self.button_states[led_nr] = False
            widget['bg'] = LED_OFF
            widget['activebackground'] = LED_OFF
        else:
            self.button_states[led_nr] = True
            widget['bg'] = LED_ON
            widget['activebackground'] = LED_ON
        print(self.button_states)    
           
 
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, width=APP_WIDTH, height=APP_HEIGHT).pack()
    app_win.mainloop()


if __name__ == '__main__':
    main()  
Gruss wuf :wink:
Take it easy Mates!
Antworten