Tkinter threading probleme
Verfasst: Montag 27. Januar 2020, 20:52
Hallo,
Ich bin dabei mir ein kleines Programm für den Raspberry Pi zu schreiben mit dem ich WS2812 LED Streifen Steuern kann und wollte mir hierfür ein paar Effekte selbst Schreiben.
Die Effekte soll man dann ganz einfach über das GUI Aktivieren und Deaktivieren können.
Mein Problem hierbei war das meine Tkinter GUI sich bei einer immer wieder wiederholenden Schleife Aufhängt.
Das habe ich soweit mit threading erst mal beheben können doch jetzt hängt sich das ganze Programm auf sobald ich den thread "beended" habe und erneut auf irgendeinen Button klicke.
Ich Teste und Google schon seit knapp 3 Tagen komme aber mehr oder weniger immer wieder auf das gleiche Problem hinaus deshalb hoffe ich nun das ihr mir hier weiter helfen könnt.
Ich bin dabei mir ein kleines Programm für den Raspberry Pi zu schreiben mit dem ich WS2812 LED Streifen Steuern kann und wollte mir hierfür ein paar Effekte selbst Schreiben.
Die Effekte soll man dann ganz einfach über das GUI Aktivieren und Deaktivieren können.
Mein Problem hierbei war das meine Tkinter GUI sich bei einer immer wieder wiederholenden Schleife Aufhängt.
Das habe ich soweit mit threading erst mal beheben können doch jetzt hängt sich das ganze Programm auf sobald ich den thread "beended" habe und erneut auf irgendeinen Button klicke.
Code: Alles auswählen
#!/usr/bin/python
# -*- coding: utf-8 -*-
import time
import threading
import board
import neopixel
try:
# for Python2
from Tkinter import * ## notice capitalized T in Tkinter
except ImportError:
# for Python3
from tkinter import * ## notice lowercase 't' in tkinter here
import RPi.GPIO as GPIO
ORDER = neopixel.GRB
ledMode = 0
num_pixels = 60
pixels = neopixel.NeoPixel(board.D18, num_pixels, brightness=0.2, auto_write=False, pixel_order=ORDER)
def mode_off():
global ledMode
ledMode = 0
modeOffButton['state'] = NORMAL
modeStaticButton['state'] = NORMAL
modeSnakeButton['state'] = NORMAL
pixels.fill((0, 0, 0))
pixels.show()
def mode_static():
global ledMode
if(ledMode != 1):
ledMode = 1
modeOffButton['state'] = NORMAL
modeStaticButton['state'] = DISABLED
modeSnakeButton['state'] = NORMAL
pixels.fill((int(staticColorR), int(staticColorG), int(staticColorB)))
pixels.show()
def mode_snake_do():
global ledMode
while True:
if(ledMode == 2):
for x in range(0, num_pixels):
pixels[x] = (0, 32, 0)
pixels.show()
time.sleep(0.025)
for x in range(0, num_pixels):
pixels[x] = (0, 0, 0)
pixels.show()
time.sleep(0.025)
continue #Restart while loop
def mode_snake():
global ledMode
ledMode = 2
modeOffButton['state'] = NORMAL
modeStaticButton['state'] = NORMAL
modeSnakeButton['state'] = DISABLED
t = threading.Thread(target=mode_snake_do)
t.start()
#GUI Window
app = Tk()
modesGrid = Frame(app)
modesGrid.pack(side=TOP, anchor=W, fill=X, pady=2)
modeSnakeButton = Button(modesGrid, text="Snake", fg="black", borderwidth=2, relief=GROOVE, command=mode_snake)
modeSnakeButton.pack(side=LEFT)