Zusätzlich solltest Du Dir objektorientierte Programmierung (OOP) an- und diese komischen angehängten Zahlen an den Namen abgewöhnen.
Was ist die Ausrede für `place()`?

Code: Alles auswählen
def aendere_farbe(event):
weite = event.width
hoehe = event.height
position_x = event.x
position_y = event.y
Meinst Du so?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). Mir geht es erstmal um die visuelle Darstellung
Code: Alles auswählen
import tkinter as tk
class ToggleButton(tk.Button):
def __init__(self,master,is_on = True, on_color = 'lightgreen', off_color = 'red', height = 1, width = 1,**kwargs):
tk.Button.__init__(self,master,bg = on_color if is_on else off_color, activebackground = on_color if is_on else off_color,height = height, width = width,**kwargs)
self.is_on = is_on
self.on_color = on_color
self.off_color = off_color
self['command'] = self.toggle
def toggle(self):
self.is_on = not self.is_on
self['bg'] = self.on_color if self.is_on else self.off_color
self['activebackground'] = self.on_color if self.is_on else self.off_color
class Application(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
LED1 = ToggleButton(self)
LED1.place(x=50,y=50)
Application().mainloop()
Code: Alles auswählen
# -*- coding: utf-8 -*-
try:
import tkinter as tk
except ImportError:
import Tkinter as tk
# Application definition ============================
class Application(tk.Tk):
def __init__(self,**kwargs):
tk.Tk.__init__(self,**kwargs)
self.minsize(50, 50)
self.geometry("500x500")
# widget definitions ===================================
self.switch = Switch(self,name='#0_switch')
self.switch.pack(fill='both', expand=1)
class Switch(tk.Frame):
def __init__(self,master,**kwargs):
tk.Frame.__init__(self,master,**kwargs)
self.myclass = 'Switch'
# widget definitions ===================================
self.canvas = Canvas(self,name='#1_canvas')
self.canvas.place(x=0,y=0)
def width_height(event):
frame_height = event.height
bd = frame_height/14
canvas_height = frame_height-4*bd
scale_factor = canvas_height/self.canvas_height_before
self.canvas_height_before = canvas_height
self.canvas.config(width = canvas_height,height = canvas_height,bd = bd,highlightthickness=bd)
self.canvas.scale('led',0,0,scale_factor,scale_factor)
def switch(event):
self.on = not self.on
self.canvas.itemconfig('led',fill = 'lightgreen' if self.on else '#ff7431')
self.canvas['relief'] = 'sunken' if self.on else'raised'
self.canvas_height_before = 100
self.bind('<Configure>',width_height,'+')
self.on = False
self.canvas.bind('<Button-1>',switch)
class Canvas(tk.Canvas):
def __init__(self,master,**kwargs):
tk.Canvas.__init__(self,master,**kwargs)
self.config(height='100', relief='raised', highlightbackground='#e8e9ee', insertwidth='0', bg='#615e58', bd='10', selectborderwidth='0', highlightthickness='10', width='100', highlightcolor='lightgray')
self.start_width = 100
# widget definitions ===================================
coords = (30,30,110,110)
item = self.create_oval(*coords)
self.itemconfig(item,width = '0.0',fill = '#ff7431',tags = 'led')
if __name__ == '__main__':
Application().mainloop()
Was ist beim Checkbutton anders? Der hat genauso wenig eine off color und on color wie sonstige Wdgets. Nichts ist da also anders.BlackJack hat geschrieben:Wenn es doch nur so einen Button schon fertig gäbe… Aber hey, es *gibt* ihn ja: `Checkbutton`! Aber klar, man kann den natürlich auch in mehreren Varianten selber programmieren.
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()
Ja, wo hat der die denn?BlackJack hat geschrieben:@Alfons Mittelmeyer: Doch der hat verschiedene Farben für an und aus.
Ja stimmt, mit indicatoron auf 0 läßt sich das machen.BlackJack hat geschrieben:@Alfons Mittelmeyer: `selectcolor` ist es. Und ein Häkchen gibt es nicht mehr wenn man sich das als Schaltfläche anzeigen lässt.
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 CbLedRosette(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.canvas = tk.Canvas(self, width=APP_WIDTH, height=APP_HEIGHT)
self.canvas.pack()
self.dummy_img = tk.PhotoImage(width=1, height=1)
self.button_states = [False]*LEDS
for led_nr in range(LEDS):
xpos, ypos = self.place_coords()
button = tk.Checkbutton(self, bg=LED_OFF, #activebackground=LED_OFF,
selectcolor='red', indicatoron=0, image=self.dummy_img,
width=LED_GEOMETRY, height=LED_GEOMETRY, onvalue=1, offvalue=0)
button.place(x=0, y=0)
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
else:
self.button_states[led_nr] = True
widget['bg'] = 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)
CbLedRosette(app_win).pack()
app_win.mainloop()
if __name__ == '__main__':
main()
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.canvas = tk.Canvas(self, width=APP_WIDTH, height=APP_HEIGHT)
self.canvas.pack()
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).pack()
app_win.mainloop()
if __name__ == '__main__':
main()
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()