Datei aus Ordner löschen

Fragen zu Tkinter.
Antworten
Philipp68
User
Beiträge: 34
Registriert: Freitag 23. Juni 2017, 10:14

Hallo,
ich habe ein kleines Problem, eine Datei, die ich in einer listbox auswähle, aus einem bestimmten Ordner zu löschen.
Über einen "Load" Button werden alle csv Datein in meiner listbox angezeigt. Nach meiner Auswahl, wird über ein Delete-Button der Eintrag gelöscht, leider nicht aus meinem Ordner. Muss ich den String meiner ausgewählten Datei in meinen Pfad einbinden oder gibt es die Möglichkeit "os.remove" etwas besser für mein Vorhaben zu verwenden?
Hier ist der Befehl meines Buttons.

Code: Alles auswählen

def delete():
    current_selection = Liste.curselection()
    Liste.delete(current_selection)
    os.remove(r'C:\Users\Philipp\PycharmProjects\NeuBeginn\Config\"current_selection")
"os.remove(current_selection)" wäre natürlich sehr gut, funktioniert leider nicht.
In "NeuBeginn" befinden sich Bilder und die .py Datei. In "Config" alle .csv Datein.

Falls jemand einen Tipp hat, wäre ich sehr dankbar!
Liebe Grüße
Zuletzt geändert von Anonymous am Mittwoch 16. August 2017, 10:54, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@Philipp68: Das sieht nach Programmieren durch wildes raten oder sich wünschen was etwas bedeuten soll aus. So funktioniert programmieren aber nicht. Auch wenn das natürlich super praktisch wäre wenn Funktione, Methoden, und Syntax einfach das machen und bedeuten würden was man sich wünscht, so muss man leider damit leben das Syntax und APIs nur das tun was dokumentiert ist.

Also schau Dir mal an was die `curselection()`-Methode als Ergebnis liefert und was `os.remove()` als Argument erwartet. Dazwischen muss dann Code liegen den Du schreiben musst, der dafür sorgt das aus dem Rückgabewert von `curselection()` passende Argumente für die (Mehrzahl!) `os.remove()`-Aufrufe werden.

Sonstige Anmerkungen:

`Liste` hält sich in der Schreibweise nicht an die Namenskonvention (siehe Style Guide for Python Code).

Die `delete()`-Funktion sollte auf `Liste` nicht einfach so auf magische Weise zugreifen können, sonst ist das nicht wirklich eine Funktion. Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert.  Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Auch wenn man mit Funktionen und Closures/`functools.partial()` noch ein gutes Stück weit kommen kann, braucht man für GUI-Programmierung letztlich objektorientierte Programmierung (OOP) für alles was nicht sehr trivial ist.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Philipp68 hat geschrieben: "os.remove(current_selection)" wäre natürlich sehr gut, funktioniert leider nicht.
Falls jemand einen Tipp hat, wäre ich sehr dankbar!
Liebe Grüße
Probiere zuerst einmal aus, was curselection ist:

Code: Alles auswählen

# -*- coding: utf-8 -*-

try:
    import tkinter as tk
except ImportError:
    import Tkinter as tk

class Application(tk.Tk):

    def __init__(self,**kwargs):
        tk.Tk.__init__(self,**kwargs)
        # widget definitions ===================================
        self.listbox = tk.Listbox(self,selectmode='extended')
        self.listbox.delete(0,'end')
        for e in 'sel 0\nsel 1\nsel 2\nsel 3\nsel 4\nsel 5\nsel 6\nsel 7\nsel 8\nsel 9\n'.split('\n'):
            self.listbox.insert('end',e)
        self.listbox.pack()

        self.listbox.bind("<Return>",self.output_selection)
        self.listbox.bind("<1>",self.output_selection)

    def print_after(self):
        print(self.listbox.curselection())

    # needs some time until curselection fits
    def output_selection(self,event=None):
        self.after(10,self.print_after)

if __name__ == '__main__':
    Application().mainloop()
PS: bevor man etwas aus einem directory löscht, sollte man zuerst einmal das programmiert haben, was die Listbox tut. Und das kann man sich jederzeit mit print ausgeben lassen.

Also: nicht gleich alles zusammen programmieren, sondern jeden Teil einzeln und durchtesten. Bzw. nicht einzeln, sondern auch aufbauend auf das was bis jetzt geht.
BlackJack

@Alfons Mittelmeyer: Ein ziemlich hässlicher Hack mit der Wartezeit, da will man doch lieber das '<<ListboxSelect>>'-Ereignis verwenden.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

BlackJack hat geschrieben:@Alfons Mittelmeyer: Ein ziemlich hässlicher Hack mit der Wartezeit, da will man doch lieber das '<<ListboxSelect>>'-Ereignis verwenden.
Ja, das funktioniert auch viel besser, also nochmals richtig:

Code: Alles auswählen

# -*- coding: utf-8 -*-

try:
    import tkinter as tk
except ImportError:
    import Tkinter as tk

class Application(tk.Tk):

    def __init__(self,**kwargs):
        tk.Tk.__init__(self,**kwargs)
        # widget definitions ===================================
        self.listbox = tk.Listbox(self,selectmode='extended')
        self.listbox.delete(0,'end')
        for e in 'sel 0\nsel 1\nsel 2\nsel 3\nsel 4\nsel 5\nsel 6\nsel 7\nsel 8\nsel 9\n'.split('\n'):
            self.listbox.insert('end',e)
        self.listbox.pack()

        self.listbox.bind("<<ListboxSelect>>",self.output_selection)

    def output_selection(self,event=None):
        print(self.listbox.curselection())

if __name__ == '__main__':
    Application().mainloop()
Philipp68
User
Beiträge: 34
Registriert: Freitag 23. Juni 2017, 10:14

@Blackjack: Ich weiß, dass programmieren nicht durch wildes raten funktioniert. Ich habe den Ausdruck nur so geschrieben, um zu zeigen, was ich genau meine und machen will. Für mein Hauptprogramm habe ich keine "main-Funktion" geschrieben. Ich vermute, dass der Aufbau meiner GUI auch völlig falsch ist. Es funktioniert schon alles, was ich bisher geschrieben habe, nur ab wann kommt es zu Problemen? Dürfte ich meinen Code posten, damit ihr mich auf mögliche Fehler/Schwachstellen (Aufbau) hinweisen könnt?

@Alfons: Ich habe mir die Ausgabe angesehen, es wird der Index angegeben und kein String. Vielen Dank für dein Beispiel. D.h für meinen Fall, dass ich den String aus meiner listbox erhalten, den mit meinen Pfad zusammensetzen muss, damit genau diese Datei gelöscht wird?
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Philipp68 hat geschrieben: @Alfons: Ich habe mir die Ausgabe angesehen, es wird der Index angegeben und kein String. Vielen Dank für dein Beispiel. D.h für meinen Fall, dass ich den String aus meiner listbox erhalten, den mit meinen Pfad zusammensetzen muss, damit genau diese Datei gelöscht wird?
Es wird eine Liste von Indizes ausgegeben. Frage: wählt man bei Dir nur einen Eintrag aus, oder auch mehrere gleichzeitig.
Wenn es nur einer ist durch Return oder Mausklick, kannst Du es auch anders machen. Im GuiDesigner habe ich ein Mausklick Event und ein Return Event dran hängen und lese es so aus:

Code: Alles auswählen

def do_lbox_click(event,lbox,entry,isMouse):
    if isMouse: text = lbox.get(lbox.nearest(event.y))
    else: text = lbox.get(tk.ACTIVE)
Den Parameter entry dabei bitte vergessen, das ist der Entry in den ich dann den Listbox Eintrag übernehme.

Du kannst es natürlich auch mit dem oder mehreren Indizes aus curselection auslesen. Die Methode heißt get().
BlackJack

@Philipp68: Zu Problemen mit globalen Variablen kommt es spätestens wenn man den Überblick verliert wann was von welcher ”Funktion” verändert wird. Und vorher halt schon wenn man die Funktionen nicht separat betrachten kann, sondern immer auch den ganzen Rest des Programms im Kopf haben muss, und das dadurch schwieriger ist als nötig.

Das menschliche Gehirn scheint so zwischen 4 und 7 Dinge gleichzeitig im Kopf jonglieren zu können, das ist also der Rahmen der üblicherweise für die maximale Anzahl von Variablen empfohlen wird. Da die meisten Programme natürlich mehr als 7 Variablen haben/brauchen, bricht man Probleme auf kleinere Teilprobleme herunter, die man isoliert betrachten kann und in separaten Funktionen oder Methoden mit wenigen Zeilen Code lösen kann. Dort kann man sich dann auch üblicherweise auf diese kleinere Anzahl von lokalen Variablen und/oder Attributen beschränken.

Globale Variablen machen auch die Fehlersuche schwieriger, weil man nicht einzelne Funktionen isoliert mit Testwerten ausführen kann, sondern immer auch die Variablen ausserhalb der Funktion berücksichtigen muss, die von dieser Funktion verwendet oder verändert werden, oder von Funktionen die von der zu testenden Funktion aufgerufen werden. Theoretisch kann ja jede davon irgend etwas globales ändern und damit Einfluss auf das Ergebnis und den Fehler haben. Um das zu wissen, muss man wieder *alle* Funktionen kennen, und nicht nur die, die man gerade testet.

Programm auf Modulebene macht ebenfalls das testen schwerer. Man kann nicht mal eben das Modul in einer Python-Shell importieren um einzelne Funktionen zu testen, ohne dass das Hauptprogramm losläuft. Automatisierte Tests gehen so auch nicht. Und auch andere Werkzeuge wie Sphinx, zur Erstellung von Dokumentation kann man mit solchen Modulen nicht verwenden. Und es gibt Module wie `multiprocessing` und `concurrent.futures` die erwarten das man das als Programm ausgeführte Modul zumindest unter Windows importieren kann, ohne das dabei gleich wieder das Programm als ganzes startet.

Komplett ungetestet:

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf-8
from __future__ import absolute_import, division, print_function
import os
import Tkinter as tk
from glob import iglob

PROGRAM_PATH = os.path.dirname(__file__)
CONFIG_PATH = os.path.join(PROGRAM_PATH, 'Config')


def iter_filenames(path, extension):
    return (
        os.path.basename(p) for p in iglob(os.path.join(path, '*' + extension))
    )


def _on_error(_filename, exception):
    raise exception


def delete_files(filenames, on_error=_on_error):
    for filename in filenames:
        try:
            os.remove(filename)
        except Exception as error:
            on_error(filename, error)


class Application(tk.Tk):

    def __init__(self):
        tk.Tk.__init__(self)
        self.filenames_listbox = tk.Listbox(self)
        self.filenames_listbox.pack()
        tk.Button(self, text='Load', command=self.on_load).pack()
        tk.Button(self, text='Delete', command=self.on_delete).pack()

    def on_load(self):
        filenames = sorted(iter_filenames(CONFIG_PATH, '.csv'))
        self.filenames_listbox.delete(0, tk.END)
        self.filenames_listbox.insert(0, *filenames)

    def on_delete(self):
        indices = self.filenames_listbox.curselection()
        filenames = [
            os.path.join(CONFIG_PATH, self.filenames_listbox.get(i))
            for i in indices
        ]
        # 
        # TODO Instead of ignoring exceptions while deleting files, maybe
        #       collect errors and display them after deleting.
        # 
        delete_files(filenames, lambda filename, exception: None)
        # 
        # Need to delete in reverse order so not yet deleted entries
        # are not moved to a different index.
        # 
        for index in sorted(indices, reverse=True):
            self.filenames_listbox.delete(index)


def main():
    Application().mainloop()

 
if __name__ == '__main__':
    main()
Philipp68
User
Beiträge: 34
Registriert: Freitag 23. Juni 2017, 10:14

Hallo BlackJack,
meine Problem eine Datei aus der listbox und auch aus dem Pfad zu löschen habe ich relativ einfach gelöst. Ich muss einfach dazusagen, dass mir das Programmieren mit Python (bis jetzt) gar nicht liegt und ich aus zeitlichen Gründen mich nicht sehr tief in die ganze Materie einarbeiten kann, zudem arbeite ich mit Python erst seit 1-2 Monaten. Daher entschuldige ich mich schon mal, wenn ich mich "dumm" anstelle.

Meine delete-Funktion:
[codebox=octave file=Unbenannt.txt]
def delete():
current_selection = Liste.curselection()
Name = Liste.get(current_selection)
print(Name)
os.remove(r'C:\Users\Philipp\SkyDrive\Designprojekt\Philipp\GUI Python\NeuBeginn\Config\\' +Name)
Liste.delete(current_selection)
[/code]

Hier ist der Aufbau meiner GUI, sollte ich für Elemente (Window, Buttons, etc.) immer eine eigene Klasse erstellen?
[codebox=octave file=Unbenannt.txt]
from tkinter import *
import os
import sys
import cv2
import time
import shutil
import csv
import math
import numpy as np




def raise_frame(frame):
frame.tkraise()


root = Tk()
root.geometry('800x480')

f1 = Frame(root) # Main menu
f2 = Frame(root) # Automatic mode
f3 = Frame(root) # Manual mode
f4 = Frame(root) # Picture mode
f5 = Frame(root) # Copyright

date_string = time.strftime("%Y-%m-%d-%H_%M_%S")

image1 = PhotoImage(file="das.png")
bild1 = Label(f1, image=image1, background='white')
bild1.pack()

image2 = PhotoImage(file="Automatic_BG.png")
bild2 = Label(f2, image=image2, background='white')
bild2.pack()

image3 = PhotoImage(file="Manual2_BG.png")
bild3 = Label(f3, image=image3, background='white')
bild3.pack()

image4 = PhotoImage(file="PICTURE_BG.png")
bild4 = Label(f4, image=image4, background='white')
bild4.pack()

image5 = PhotoImage(file="COPY_BG.png")
bild5 = Label(f5, image=image5, background='white')
bild5.pack()

for frame in (f1, f2, f3, f4, f5):
frame.grid(row=0, column=0, sticky='news')

button1 = Button(f1, text='AUTOMATIC MODE', command=lambda: raise_frame(f2), bg='white', height=1,width=30)
button1.place(x='20', y='200')

button2 = Button(f2, text='Back', command=lambda: raise_frame(f1), bg='white', height=1, width=7)
button2.place(x='20', y='450')

button3 = Button(f1, text='MANUAL MODE', command=lambda: raise_frame(f3), bg='white', height=1, width=30)
button3.place(x='20', y='260')

button4 = Button(f3, text='Back', command=lambda: raise_frame(f1), bg='white', height=1, width=7)
button4.place(x='20', y='450')

button5 = Button(f1, text='PICTURE MODE', command=lambda: raise_frame(f4), bg='white', height=1, width=30)
button5.place(x='20', y='320')

button6 = Button(f4, text='Back', command=lambda: raise_frame(f1), bg='white', height=1, width=7)
button6.place(x='20', y='450')


#Piture Mode

def cam():
camera_port = 0 # =0 integrated cam =1 external cam
camera = cv2.VideoCapture(camera_port)
time.sleep(0.1)
return_value, image = camera.read()
cv2.imwrite('Retina.png',image)
del(camera)
os.rename('Retina.png', 'Retina '+date_string+'.png')


Capture = Button(f4, text='Capture Retina', command=cam, bg='white', height=5, width=30)
Capture.place(x='280', y='200')

#Copyright
button7 = Button(f1, text='©. Copyright 2017 - ADLight', command=lambda: raise_frame(f5), bg='white',height=1, width=30)
button7.place(x='20', y='450')

button8 = Button(f5, text='Back', command=lambda: raise_frame(f1), bg='white', height=1, width=7)
button8.place(x='20', y='450')

Copyright = Label(f5,
text='Urherberrecht - Copyright, by ADLight \n Verwendete Bildquellen stammen von – Pixybay und unterliegen der Lizenz: CC0 Public Domain.\n ')
Copyright.place(x='400', y='150', anchor='center')


# Automatic Mode

Liste = Listbox(f2, selectmode ='browse',height=14,width=50)
Liste.place(x='20',y='150')

def load():
files = os.listdir(r'C:\Users\Philipp\SkyDrive\Designprojekt\Philipp\GUI Python\NeuBeginn\Config')
for i in files:
Liste.insert('end',i)
print(files)


def clear():
Liste.delete(0,END)

def delete():
current_selection = Liste.curselection()
Name = Liste.get(current_selection)
print(Name)
os.remove(r'C:\Users\Philipp\SkyDrive\Designprojekt\Philipp\GUI Python\NeuBeginn\Config\\' +Name)
Liste.delete(current_selection)





buttonRefresh = Button(f2, text='Load', bg='white', height=1, width=7,command=load)
buttonRefresh.place(x='20', y='400')

buttonClear = Button(f2, text='Clear', bg='white', height=1, width=7,command=clear)
buttonClear.place(x='90', y='400')

buttonDelete = Button(f2, text='Delete', bg='white', height=1, width=7,command=delete)
buttonDelete.place(x='160', y='400')

button2 = Button(f2, text='Back', command=lambda: raise_frame(f1), bg='white', height=1, width=7,)
button2.place(x='20', y='450')

# Manual Mode

labelfield1 = Label(f3, text='Time of measurement', background='white', height='2', width=20)
labelfield1.place(x='20', y='120')
field1 = Entry(f3, width=10)
field1.place(x='180', y='125')

labelfield2 = Label(f3, text='Time of flickerlight', background='white', height='2', width=20)
labelfield2.place(x='20', y='160')
field2 = Entry(f3, width=10)
field2.place(x='180', y='165')

labelfield3 = Label(f3, text='Start of flickerlight', background='white', height='2', width=20)
labelfield3.place(x='20', y='200')
field3 = Entry(f3, width=10)
field3.place(x='180', y='205')

labelfield4 = Label(f3, text='SMD - LED - Intensity', background='white', height='2', width=20)
labelfield4.place(x='20', y='240')
field4 = Entry(f3, width=10)
field4.place(x='180', y='245')


def saveconfig():
with open(r'C:\Users\Philipp\SkyDrive\Designprojekt\Philipp\GUI Python\NeuBeginn\Config\'Configuration_' + date_string + '.csv', 'a') as f:
w = csv.writer(f, quoting=csv.QUOTE_ALL)
w.writerow([field1.get()])
w.writerow([field2.get()])
w.writerow([field3.get()])
w.writerow([field4.get()])


#LED Circle

r = 160


for i in np.arange(0,math.pi*2,math.pi/12):
x = math.cos(i)*r
y = math.sin(i)*r
z= Radiobutton(f3,bg='red',height=1, width=1)
z.place(x=590+x, y=280+y)



v1 = IntVar()
v2 = IntVar()
v3 = IntVar()
v4 = IntVar()
v5 = IntVar()
v6 = IntVar()
v7 = IntVar()
v8 = IntVar()
v9 = IntVar()
v10 = IntVar()
v11 = IntVar()
v12 = IntVar()
v13 = IntVar()
v14 = IntVar()
v15 = IntVar()
v16 = IntVar()
v17 = IntVar()
v18 = IntVar()
v19 = IntVar()
v20 = IntVar()
v21 = IntVar()
v22 = IntVar()
v23 = IntVar()
v24 = IntVar()
v25 = IntVar()
v26 = IntVar()
v27 = IntVar()
v28 = IntVar()
v29 = IntVar()

#Functions of Checkbuttons (SMD-LEDs)

def Radio1():
if v1.get():
Radio1.config(bg='green')
else:
Radio1.config(bg='red')

def Radio2():
if v2.get():
Radio2.config(bg='green')
else:
Radio2.config(bg='red')

def Radio3():
if v3.get():
Radio3.config(bg='green')
else:
Radio3.config(bg='red')

def Radio4():
if v4.get():
Radio4.config(bg='green')
else:
Radio4.config(bg='red')

def Radio5():
if v5.get():
Radio5.config(bg='green')
else:
Radio5.config(bg='red')

def Radio6():
if v6.get():
Radio6.config(bg='green')
else:
Radio6.config(bg='red')

def Radio7():
if v7.get():
Radio7.config(bg='green')
else:
Radio7.config(bg='red')

def Radio8():
if v8.get():
Radio8.config(bg='green')
else:
Radio8.config(bg='red')

def Radio9():
if v9.get():
Radio9.config(bg='green')
else:
Radio9.config(bg='red')

def Radio10():
if v10.get():
Radio10.config(bg='green')
else:
Radio10.config(bg='red')

def Radio11():
if v11.get():
Radio11.config(bg='green')
else:
Radio11.config(bg='red')

def Radio12():
if v12.get():
Radio12.config(bg='green')
else:
Radio12.config(bg='red')

def Radio13():
if v13.get():
Radio13.config(bg='green')
else:
Radio13.config(bg='red')

def Radio14():
if v14.get():
Radio14.config(bg='green')
else:
Radio14.config(bg='red')

def Radio15():
if v15.get():
Radio15.config(bg='green')
else:
Radio15.config(bg='red')

def Radio16():
if v16.get():
Radio16.config(bg='green')
else:
Radio16.config(bg='red')

def Radio17():
if v17.get():
Radio17.config(bg='green')
else:
Radio17.config(bg='red')

def Radio18():
if v18.get():
Radio18.config(bg='green')
else:
Radio18.config(bg='red')

def Radio19():
if v19.get():
Radio19.config(bg='green')
else:
Radio19.config(bg='red')

def Radio20():
if v20.get():
Radio20.config(bg='green')
else:
Radio20.config(bg='red')

def Radio21():
if v21.get():
Radio21.config(bg='green')
else:
Radio21.config(bg='red')

def Radio22():
if v22.get():
Radio22.config(bg='green')
else:
Radio22.config(bg='red')

def Radio23():
if v23.get():
Radio23.config(bg='green')
else:
Radio23.config(bg='red')

def Radio24():
if v24.get():
Radio24.config(bg='green')
else:
Radio24.config(bg='red')

def Radio25():
if v25.get():
Radio25.config(bg='green')
Radio1.config(bg='green')
Radio2.config(bg='green')
Radio3.config(bg='green')
Radio4.config(bg='green')
Radio5.config(bg='green')
Radio6.config(bg='green')


Radio1.select()
Radio2.select()
Radio3.select()
Radio4.select()
Radio5.select()
Radio6.select()



else:
Radio25.config(bg='red')
Radio1.config(bg='red')
Radio2.config(bg='red')
Radio3.config(bg='red')
Radio4.config(bg='red')
Radio5.config(bg='red')
Radio6.config(bg='red')


Radio1.deselect()
Radio2.deselect()
Radio3.deselect()
Radio4.deselect()
Radio5.deselect()
Radio6.deselect()


def Radio26():
if v26.get():
Radio26.config(bg='green')

Radio7.config(bg='green')
Radio8.config(bg='green')
Radio9.config(bg='green')
Radio10.config(bg='green')
Radio11.config(bg='green')
Radio12.config(bg='green')

Radio7.select()
Radio8.select()
Radio9.select()
Radio10.select()
Radio11.select()
Radio12.select()
else:
Radio26.config(bg='red')

Radio7.config(bg='red')
Radio8.config(bg='red')
Radio9.config(bg='red')
Radio10.config(bg='red')
Radio11.config(bg='red')
Radio12.config(bg='red')

Radio7.deselect()
Radio8.deselect()
Radio9.deselect()
Radio10.deselect()
Radio11.deselect()
Radio12.deselect()

def Radio27():
if v27.get():
Radio27.config(bg='green')

Radio13.config(bg='green')
Radio14.config(bg='green')
Radio15.config(bg='green')
Radio16.config(bg='green')
Radio17.config(bg='green')
Radio18.config(bg='green')

Radio13.select()
Radio14.select()
Radio15.select()
Radio16.select()
Radio17.select()
Radio18.select()
else:
Radio27.config(bg='red')

Radio13.config(bg='red')
Radio14.config(bg='red')
Radio15.config(bg='red')
Radio16.config(bg='red')
Radio17.config(bg='red')
Radio18.config(bg='red')

Radio13.deselect()
Radio14.deselect()
Radio15.deselect()
Radio16.deselect()
Radio17.deselect()
Radio18.deselect()

def Radio28():
if v28.get():
Radio28.config(bg='green')

Radio19.config(bg='green')
Radio20.config(bg='green')
Radio21.config(bg='green')
Radio22.config(bg='green')
Radio23.config(bg='green')
Radio24.config(bg='green')

Radio19.select()
Radio20.select()
Radio21.select()
Radio22.select()
Radio23.select()
Radio24.select()
else:
Radio28.config(bg='red')

Radio19.config(bg='red')
Radio20.config(bg='red')
Radio21.config(bg='red')
Radio22.config(bg='red')
Radio23.config(bg='red')
Radio24.config(bg='red')

Radio19.deselect()
Radio20.deselect()
Radio21.deselect()
Radio22.deselect()
Radio23.deselect()
Radio24.deselect()

def Radio29():
if v29.get():
Radio29.config(bg='green')
Radio1.config(bg='green')
Radio2.config(bg='green')
Radio3.config(bg='green')
Radio4.config(bg='green')
Radio5.config(bg='green')
Radio6.config(bg='green')
Radio7.config(bg='green')
Radio8.config(bg='green')
Radio9.config(bg='green')
Radio10.config(bg='green')
Radio11.config(bg='green')
Radio12.config(bg='green')
Radio13.config(bg='green')
Radio14.config(bg='green')
Radio15.config(bg='green')
Radio16.config(bg='green')
Radio17.config(bg='green')
Radio18.config(bg='green')
Radio19.config(bg='green')
Radio20.config(bg='green')
Radio21.config(bg='green')
Radio22.config(bg='green')
Radio23.config(bg='green')
Radio24.config(bg='green')
Radio25.config(bg='green')
Radio26.config(bg='green')
Radio27.config(bg='green')
Radio28.config(bg='green')


Radio1.select()
Radio2.select()
Radio3.select()
Radio4.select()
Radio5.select()
Radio6.select()
Radio7.select()
Radio8.select()
Radio9.select()
Radio10.select()
Radio11.select()
Radio12.select()
Radio13.select()
Radio14.select()
Radio15.select()
Radio16.select()
Radio17.select()
Radio18.select()
Radio19.select()
Radio20.select()
Radio21.select()
Radio22.select()
Radio23.select()
Radio24.select()
Radio25.select()
Radio26.select()
Radio27.select()
Radio28.select()

else:
Radio29.config(bg='red')
Radio1.config(bg='red')
Radio2.config(bg='red')
Radio3.config(bg='red')
Radio4.config(bg='red')
Radio5.config(bg='red')
Radio6.config(bg='red')
Radio7.config(bg='red')
Radio8.config(bg='red')
Radio9.config(bg='red')
Radio10.config(bg='red')
Radio11.config(bg='red')
Radio12.config(bg='red')
Radio13.config(bg='red')
Radio14.config(bg='red')
Radio15.config(bg='red')
Radio16.config(bg='red')
Radio17.config(bg='red')
Radio18.config(bg='red')
Radio19.config(bg='red')
Radio20.config(bg='red')
Radio21.config(bg='red')
Radio22.config(bg='red')
Radio23.config(bg='red')
Radio24.config(bg='red')
Radio25.config(bg='red')
Radio26.config(bg='red')
Radio27.config(bg='red')
Radio28.config(bg='red')

Radio1.deselect()
Radio2.deselect()
Radio3.deselect()
Radio4.deselect()
Radio5.deselect()
Radio6.deselect()
Radio7.deselect()
Radio8.deselect()
Radio9.deselect()
Radio10.deselect()
Radio11.deselect()
Radio12.deselect()
Radio13.deselect()
Radio14.deselect()
Radio15.deselect()
Radio16.deselect()
Radio17.deselect()
Radio18.deselect()
Radio19.deselect()
Radio20.deselect()
Radio21.deselect()
Radio22.deselect()
Radio23.deselect()
Radio24.deselect()
Radio25.deselect()
Radio26.deselect()
Radio27.deselect()
Radio28.deselect()
#Checkbuttons (SMD-LEDs)


Radio1 = Checkbutton(f3,bg='red',height=1, width=1,variable=v1,onvalue=1,offvalue=0,command=Radio1) #3Uhr
Radio1.place(x=590+160.0, y=280+0.0)


Radio2 = Checkbutton(f3,bg='red',height=1, width=1,variable=v2,onvalue=1,offvalue=0,command=Radio2)
Radio2.place(x=590+154.54813220625093, y=280+41.41104721640332)

Radio3 = Checkbutton(f3,bg='red',height=1, width=1,variable=v3,onvalue=1,offvalue=0,command=Radio3)
Radio3.place(x=590+138.5640646055102, y=280+79.99999999999999)

Radio4 = Checkbutton(f3,bg='red',height=1, width=1,variable=v4,onvalue=1,offvalue=0,command=Radio4)
Radio4.place(x=590+113.13708498984761, y=280+113.13708498984761)

Radio5 = Checkbutton(f3,bg='red',height=1, width=1,variable=v5,onvalue=1,offvalue=0,command=Radio5)
Radio5.place(x=590+80.00000000000001, y=280+138.56406460551017)

Radio6 = Checkbutton(f3,bg='red',height=1, width=1,variable=v6,onvalue=1,offvalue=0,command=Radio6)
Radio6.place(x=590+41.411047216403354, y=280+154.5481322062509)

Radio7 = Checkbutton(f3,bg='red',height=1, width=1,variable=v7,onvalue=1,offvalue=0,command=Radio7)
Radio7.place(x=590+9.797174393178826e-15, y=280+160.0)

Radio8 = Checkbutton(f3,bg='red',height=1, width=1,variable=v8,onvalue=1,offvalue=0,command=Radio8)
Radio8.place(x=590+-41.411047216403304, y=280+154.54813220625093)

Radio9 = Checkbutton(f3,bg='red',height=1, width=1,variable=v9,onvalue=1,offvalue=0,command=Radio9)
Radio9.place(x=590+-79.99999999999997, y=280+138.5640646055102)

Radio10 = Checkbutton(f3,bg='red',height=1, width=1,variable=v10,onvalue=1,offvalue=0,command=Radio10)
Radio10.place(x=590+-113.1370849898476, y=280+113.13708498984761)

Radio11 = Checkbutton(f3,bg='red',height=1, width=1,variable=v11,onvalue=1,offvalue=0,command=Radio11)
Radio11.place(x=590+-138.56406460551017, y=280+80.00000000000006)

Radio12 = Checkbutton(f3,bg='red',height=1, width=1,variable=v12,onvalue=1,offvalue=0,command=Radio12)
Radio12.place(x=590+-154.5481322062509, y=280+41.41104721640336)

Radio13 = Checkbutton(f3,bg='red',height=1, width=1,variable=v13,onvalue=1,offvalue=0,command=Radio13)
Radio13.place(x=590+-160.0, y=280+1.9594348786357652e-14)

Radio14 = Checkbutton(f3,bg='red',height=1, width=1,variable=v14,onvalue=1,offvalue=0,command=Radio14)
Radio14.place(x=590+-154.54813220625095, y=280+-41.411047216403254)

Radio15 = Checkbutton(f3,bg='red',height=1, width=1,variable=v15,onvalue=1,offvalue=0,command=Radio15)
Radio15.place(x=590+-138.56406460551023, y=280+-79.99999999999996)

Radio16 = Checkbutton(f3,bg='red',height=1, width=1,variable=v16,onvalue=1,offvalue=0,command=Radio16)
Radio16.place(x=590+-113.13708498984766, y=280+-113.13708498984754)

Radio17 = Checkbutton(f3,bg='red',height=1, width=1,variable=v17,onvalue=1,offvalue=0,command=Radio17)
Radio17.place(x=590+-80.00000000000007, y=280+-138.56406460551014)

Radio18 = Checkbutton(f3,bg='red',height=1, width=1,variable=v18,onvalue=1,offvalue=0,command=Radio18)
Radio18.place(x=590+-41.411047216403446, y=280+-154.5481322062509)

Radio19 = Checkbutton(f3,bg='red',height=1, width=1,variable=v19,onvalue=1,offvalue=0,command=Radio19)
Radio19.place(x=590+-2.9391523179536473e-14, y=280+-160.0)

Radio20 = Checkbutton(f3,bg='red',height=1, width=1,variable=v20,onvalue=1,offvalue=0,command=Radio20)
Radio20.place(x=590+41.41104721640325, y=280+-154.54813220625095)

Radio21 = Checkbutton(f3,bg='red',height=1, width=1,variable=v21,onvalue=1,offvalue=0,command=Radio21)
Radio21.place(x=590+79.99999999999989, y=280+-138.56406460551025)

Radio22 = Checkbutton(f3,bg='red',height=1, width=1,variable=v22,onvalue=1,offvalue=0,command=Radio22)
Radio22.place(x=590+113.13708498984758, y=280+-113.13708498984764)

Radio23 = Checkbutton(f3,bg='red',height=1, width=1,variable=v23,onvalue=1,offvalue=0,command=Radio23)
Radio23.place(x=590+138.56406460551014, y=280+-80.00000000000007)

Radio24 = Checkbutton(f3,bg='red',height=1, width=1,variable=v24,onvalue=1,offvalue=0,command=Radio24)
Radio24.place(x=590+154.5481322062509, y=280+-41.41104721640345)

#Circle inside
r1 = 50
for i in np.arange(math.pi/4,math.pi*2,math.pi/2):
x = math.cos(i)*r1
y = math.sin(i)*r1
z= Checkbutton(f3,bg='red',height=1, width=1)
z.place(x=590 + x, y=280 + y)
print(x)
print(y)

Radio25 = Checkbutton(f3,bg='red',height=1, width=1,variable=v25,onvalue=1,offvalue=0,command=Radio25)
Radio25.place(x=590+35.35533905932738, y=280+35.35533905932738)

Radio26 = Checkbutton(f3,bg='red',height=1, width=1,variable=v26,onvalue=1,offvalue=0,command=Radio26)
Radio26.place(x=590+-35.35533905932737, y=280+35.35533905932738)

Radio27 = Checkbutton(f3,bg='red',height=1, width=1,variable=v27,onvalue=1,offvalue=0,command=Radio27)
Radio27.place(x=590+-35.355339059327385, y=280+-35.35533905932737)

Radio28 = Checkbutton(f3,bg='red',height=1, width=1,variable=v28,onvalue=1,offvalue=0,command=Radio28)
Radio28.place(x=590+35.35533905932737, y=280+-35.355339059327385)

Radio29 = Checkbutton(f3,bg='red',height=1, width=1,variable=v29,onvalue=1,offvalue=0,command=Radio29)
Radio29.place(x=590, y=280)

#Manual Mode Options

#Save Configuration
button9 = Button(f3, text='Save Configuration', command=saveconfig, bg='white', height=1, width=31)
button9.place(x='20', y='285')

#Reset Configuration
button10 = Button(f3,text='Reset Configuration',bg='white',height=1,width=31)
button10.place(x='20',y='315')

#Reset SMD-LED
def resetsmdled():
if v1.get():
Radio1.config(bg='red')
Radio1.deselect()
if v2.get():
Radio2.config(bg='red')
Radio2.deselect()
if v3.get():
Radio3.config(bg='red')
Radio3.deselect()
if v4.get():
Radio4.config(bg='red')
Radio4.deselect()
if v5.get():
Radio5.config(bg='red')
Radio5.deselect()
if v6.get():
Radio6.config(bg='red')
Radio6.deselect()
if v7.get():
Radio7.config(bg='red')
Radio7.deselect()
if v8.get():
Radio8.config(bg='red')
Radio8.deselect()
if v9.get():
Radio9.config(bg='red')
Radio9.deselect()
if v10.get():
Radio10.config(bg='red')
Radio10.deselect()
if v11.get():
Radio11.config(bg='red')
Radio11.deselect()
if v12.get():
Radio12.config(bg='red')
Radio12.deselect()
if v13.get():
Radio13.config(bg='red')
Radio13.deselect()
if v14.get():
Radio14.config(bg='red')
Radio14.deselect()
if v15.get():
Radio15.config(bg='red')
Radio15.deselect()
if v16.get():
Radio16.config(bg='red')
Radio16.deselect()
if v17.get():
Radio17.config(bg='red')
Radio17.deselect()
if v18.get():
Radio18.config(bg='red')
Radio18.deselect()
if v19.get():
Radio19.config(bg='red')
Radio19.deselect()
if v20.get():
Radio20.config(bg='red')
Radio20.deselect()
if v21.get():
Radio21.config(bg='red')
Radio21.deselect()
if v22.get():
Radio22.config(bg='red')
Radio22.deselect()
if v23.get():
Radio23.config(bg='red')
Radio23.deselect()

if v24.get():
Radio24.config(bg='red')
Radio24.deselect()

if v25.get():
Radio25.config(bg='red')
Radio25.deselect()

if v26.get():
Radio26.config(bg='red')
Radio26.deselect()

if v27.get():
Radio27.config(bg='red')
Radio27.deselect()

if v28.get():
Radio28.config(bg='red')
Radio28.deselect()

if v29.get():
Radio29.config(bg='red')
Radio29.deselect()

button11 = Button(f3,text='Reset SMD-LED',bg='white',height=1,width=31,command=resetsmdled)
button11.place(x='20',y='345')


raise_frame(f1)
root.mainloop()

[/code]
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@Philipp68: bei dem vielen Kopieren wären aber zwei Stunden, die Du zum Lernen von Schleifen investierst, gut angelegte Zeit.
Philipp68
User
Beiträge: 34
Registriert: Freitag 23. Juni 2017, 10:14

@Sirius: Ich weiß, dass es mit einer Schleife deutlich einfacher und schneller geht. Habe auch einen zweiten Code, der mir alles mit einer Schleife erstellt. Nur bekommen alle Checkboxen verschiedene Eingänge für unseren Pi und dann wird es mit der Schleife vielleicht schwierig.
Wie man Schleifen bildet weiß ich :)
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Wäre es nicht besser 'extended' zu nehmen?

Code: Alles auswählen

self.listbox = tk.Listbox(self,selectmode='extended')
Da kann man dann auch mehrere Einträge auf einmal auswählen und das auch per Tastatur.

Außerdem sollte man Checkbuttons nicht Radio nennen, weil man dann denkt, dass das Radiobuttons wären.

Verwirrend ist auch das:

Code: Alles auswählen

def Radio7():
    if v7.get():
            Radio7.config(bg='green')
    else:
            Radio7.config(bg='red')
Da gibt es eine Funktion Radio7 und einen Checkbutton der genauso heißt. Und v1 bis v24 sowie die Callbacks Radio1 bis Radio24 kannst Du Dir sparen, weil die alles dasselbe tun.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@Phillip68: und so kannst Du Dir den ganzen Code für die Callbacks Radio1 bis Radio 24 sparen:

Code: Alles auswählen

from functools import partial

def radio_v1_v24_command(checkbutton):
    checkbutton['bg'] = 'green' if checkbutton.variable.get() else 'red'
        

variable = tk.IntVar()
Radio1 = Checkbutton(f3,bg='red',height=1, width=1,variable=variable,onvalue=1,offvalue=0) #3Uhr
Radio1.place(x=590+160.0, y=280+0.0)
Radio1.variable = variable
Radio1['command'] = partial(radio_v1_v24_command,Radio1)


# Dann wäre noch ein Dictionary zu empfehlen, damit man dann auch mehrere behandeln kann und auch über Pins Werte setzen kann
# besser wäre auch mit 0 anzufangen, weil man dann bei range den Startwert nicht mit angeben muss, aber das ist Nebensache
Checkbuttons[1] = Radio1
Wenn man die Koordinaten auch berechnen kann, kannst Du die Checkbuttons 1 bis 24 auch in einer Schleife erzeugen und die Namen Radio1 bis Radio24 braucht man da auch nicht, denn sie sind ja im Dictionary eingetragen.

Wenn alle Checkbuttons im Dictionary eingetragen sind, schrumpft resetsmdled() ganz gehörig zusammen, denn das machst Du dann mit einer Schleife.
Antworten