Kreis aus Radiobuttons

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

Hallo,
ich möchte gerne einen Kreis aus 24 Radiobuttons erstellen. Jedoch sind in meinem Kreis mehr als 24 Radiobuttons (95). Ich habe den Code vorher in einer Matlab GUI ausprobiert und dort funktioniert es. Liegt es an "np.arange", durch z1 wird doch eigentlich die Schrittfolge angegeben? Wäre über eure Hilfe sehr dankbar!
Schreibe ich z1=15, erhalte ich 24 Stück, aber ungleich verteilt. Das erste Viertel aus 6 Stück soll bei 9 Uhr anfangen, das zweite bei 6 Uhr, das dritte bei 3 Uhr und das vierte bei 12 Uhr. So ist auch die Anordnung und Nummerierung bei der Platine, auf der sich LEDS befinden.

Code: Alles auswählen

r = 160

z1 = 24/(2*math.pi)

for i in np.arange(0,360,z1):
    x = math.cos(i)*r
    y = math.sin(i)*r
    z= Radiobutton(f3,bg='red')
    z.place(x=590+x, y=290+y)
Zuletzt geändert von Anonymous am Donnerstag 3. August 2017, 14:44, insgesamt 2-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

So wie ich das sehe mischst du doch wild RAD mit DEG. Wenn dein z1 in RAD ist, musst du im range auch bis 2*PI gehen. Oder einfacher (IMHO) ganzzahlig schreiten (15 Grad / Schritt ist ja ganzzahlig), und *danach* in RAD konvertieren.
Philipp68
User
Beiträge: 34
Registriert: Freitag 23. Juni 2017, 10:14

Das habe ich auch schon gemacht.

Code: Alles auswählen

z1 = 24/(2*math.pi)

for i in np.arange(0,math.pi*2,z1):
    x = math.cos(i)*r
    y = math.sin(i)*r
    z= Radiobutton(f3,bg='red')
    z.place(x=590+x, y=290+y)
    print(z)
Nur werden hier zwei Radiobuttons erstellt...
Zuletzt geändert von Anonymous am Donnerstag 3. August 2017, 14:48, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

Gewoehn dir mal an die Code-Boxen fuer Python-Code zu benutzen, so ist es schwierig, deinen Code zu verwenden.

Und ein paar prints einzustreuen um sich die Werte von Variablen anzuschauen ist eine einfache Uebung, die du ebenfalls exerzieren solltest.

Dann sieht man den Fehler: statt 2PI / 24 rechnest du 24 / 2PI...

Code: Alles auswählen

import numpy as np
import math

r = 100
z1 = (2*math.pi) / 24
print(z1)

for i in np.arange(0,math.pi*2,z1):
    x = math.cos(i)*r
    y = math.sin(i)*r
    print(x, y)
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@Philipp68: Du willst ja auch nicht 24 in 2pi-Stücke teilen, sondern 2pi in 24 Stücke. Dazu ist aber linspace besser geeignet: np.linspace(0, 2*np.pi, 24, endpoint=False).
Philipp68
User
Beiträge: 34
Registriert: Freitag 23. Juni 2017, 10:14

Hier ist die Lösung :D

Code: Alles auswählen

z1 = math.pi/12

for i in np.arange(0,math.pi*2,z1):
    x = math.cos(i)*r
    y = math.sin(i)*r
    z= Radiobutton(f3,bg='red')
    z.place(x=590+x, y=290+y)
    print(z)
Zuletzt geändert von Anonymous am Donnerstag 3. August 2017, 14:54, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Philipp68
User
Beiträge: 34
Registriert: Freitag 23. Juni 2017, 10:14

Eine Frage hätte ich noch. Wie kann ich in meiner Schleife jedem Radiobutton eine einzelne Variable für weitere Befehle zuweisen?
Ich weiß, dass ich dafür "value=x" anwenden muss. Aber wie setze ich das in einer Schleife um?

Code: Alles auswählen

z1 = math.pi/12
 
for i in np.arange(0,math.pi*2,z1):
    x = math.cos(i)*r
    y = math.sin(i)*r
    z= Radiobutton(f3,bg='red',value=i) / i = 1-24
    z.place(x=590+x, y=290+y)
    print(z)
Zuletzt geändert von Anonymous am Donnerstag 3. August 2017, 16:09, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@Philipp68: Du musst allen `Radiobutton`\s die zusammengehören das selbe Exemplar von einer Unterklasse von `tkinter.Variable` per `variable`-Argument übergeben. Also beispielsweise ein Exemplar von `tkinter.IntVar` wenn das die Zahlen 1 bis 24 aufnehmen soll.

Dein `i` hat allerdings nicht die Werte 1 bis 24. Deswegen ist `i` auch nicht wirklich ein guter Name dafür. Da erwarten die meisten Leser, insbesondere auch als Laufvariable in einer Schleife nur ganze Zahlen. Einbuchstabige Namen sind sowieso oft nicht wirklich gut verständlich. Nenne das `i` mal in `angle` oder um, dann weiss man was der Wert bedeutet.

Und dann kannst Du Dir mit `enumerate()` eine zusätzliche laufende Zahl zu dem Winkelwert erzeugen lassen.
Antworten