2017-09-14 1 views
0

Ich benutze Tkinter, um ein sehr einfaches Experiment auf dem Himbeer-Kuchen zu erstellen. Ich möchte einen Stimulus auf dem Bildschirm anzeigen, ständig (so die Listenzeile meines Codes ist win.mainloop(). Bei jedem Klicken/Berühren des Stimulus sollte der Stimulus die Position ändern. Ich erzeuge die Stimulus-Positionen mit Basic Trigonometrie by doing:Wert bei jeder Iteration ändern - python 3

distance = 0.2 
angle_range = list(range(0, 360, 45)) 
xc = (math.sin(angle_range[0] * 0.0174) * distance) + 0.5 
yc = (math.cos(angle_range[0] * 0.0174) * distance) + 0.5 

ich dann xc und yc positionieren sie den Reiz auf dem Bildschirm (in diesem Fall ist es als Button von tkinter behandelt wird) verwenden:

photo = PhotoImage(file="FaceStimulus.png") 
Stimulus = Button(win, command=changePosition) 
Stimulus.config(image=photo) 
Stimulus.place(relx=xc, rely=yc) 

Und schließlich der Fu nction mit der Taste zugeordnet

def changePosition(): 
    print("Stimulus pressed") 
    angle_range = random.shuffle(angle_range) 

In der Funktion changePosition ich für einen Shuffle der Positionen Liste fragen, was eigentlich nicht passieren. Der Stimulus behält immer seine Anfangsposition bei.

Ich vermisse wahrscheinlich einige sehr grundlegende Logik der Python-Programmierung, tut mir leid, wenn dies eine triviale Frage ist. Ich habe ein wenig online geschaut, bevor ich hier geschrieben habe, und ich finde einige Methoden, aber jedes Mal, wenn ich versuche, sie zu implementieren, laufe ich denselben logischen Fehler: Wie kann ich eine Variable immer wieder von einer Funktion definieren?

+0

Möchten Sie, dass der Stimulus an beliebiger Stelle auf dem Bildschirm angezeigt wird oder möchten Sie, dass er auf einem vordefinierten Algorithmus basiert? @antscolony –

+0

Ich möchte, dass die Schaltfläche in jeder zufälligen Position angezeigt wird mit einem Winkel aus der Liste (Bereich (0, 360, 45)) berechnet – antscolony

Antwort

0

Sobald Sie xc = something deklarieren, wird xc gesperrt und ändert sich nicht, es sei denn, Sie gehen hinein und ändern es. Das Ändern der Liste, auf der es basiert, tut nichts. Versuchen Sie, die Variablen in Ihrer Funktion zu aktualisieren, nicht nur die Liste.

Dieser Code funktioniert wahrscheinlich nicht, aber hoffentlich hilft Ihnen, herauszufinden, was zu tun ist.

def changePosition(): 
    print("Stimulus pressed") 
    random.shuffle(angle_range) 
    xc = (math.sin(angle_range[0] * 0.0174) * distance) + 0.5 
    yc = (math.cos(angle_range[0] * 0.0174) * distance) + 0.5 
    Stimulus.place(relx=xc, rely=yc) 
+0

Ich verstehe Ihre Vorgehensweise, danke! Wenn ich jedoch versuche, Ihren Code zu implementieren, bin ich wieder da, wo ich vorher war. Ich brauche einen Startwert von xc und yc, sonst wird bei Versuch 1 (bei der Initialisierung) der Stimulus grundsätzlich nicht angezeigt. Ich könnte überprüfen, ob dies Testversion 1 ist, indem Sie einen Zähler der Klicks auf den Stimulus ausführen, so dass jeder Klick eine neue Testversion startet. Ich werde versuchen, dass .. – antscolony

0

meine erklärt Schnipsel Siehe unten:

from tkinter import * 
import math 
import random 

class App: 
    def __init__(self, root): 
    self.root = root 
    self.distance = 0.2 
    self.angle_range = list(range(0, 360, 45)) 

    #this is a placeholder for your stimulus 
    self.label = Label(self.root, text="Image Placeholder") 

    self.command() #calls the command to generate the first position 
    self.label.bind("<Button-1>", self.command) #creates a callback whenever the label is clicked with mousebutton 1 
    def command(self, *args): 
    #i'll explain this below the snipper 
    var = random.choice(self.angle_range) 
    self.xc = (math.sin(var * 0.0174) * self.distance) + 0.5 
    self.yc = (math.cos(var * 0.0174) * self.distance) + 0.5 
    self.label.place(relx=self.xc, rely=self.yc) 

root = Tk() 
App(root) 
root.mainloop() 

So sieht es aus wie das Problem, das Sie vor, die waren war, dass man immer nur forderten die 0th Element in Ihrem list. Um dies zu beheben, habe ich auf self.angle_range[random.randrange(len(self.angle_range))] hinzugefügt.

Lassen Sie uns das brechen.

self.angle_range[n] ist Ihre Liste, die alle Elemente enthält, die wir früher propagiert haben. Also wollen wir ein zufälliges Element aus dieser Liste? Fein.

So verwenden wir random.choice(self.angle_range), die ein zufälliges Element greifen wird.

Dies gibt ein zufälliges Element von listself.angle_range zurück und gibt uns eine zufällige Koordinate basierend auf der von uns bereitgestellten list.

+0

Dies funktioniert wie erwartet. Auch sehr klare Erklärung. Ich habe bemerkt, dass sich die Art und Weise der Codierung signifikant von meinen eigenen unterscheidet (meine ist sehr naiv). Würdest du wissen, wo ich mehr Informationen über diese Struktur des Skripts finden kann? Danke – antscolony

+0

Das ist kaputt; Sie wählen einen potenziell unterschiedlichen zufälligen Winkel zum Berechnen der x- und y-Koordinaten aus, sodass der Punkt nicht auf dem gewünschten Kreis festgelegt ist. 'random.choice (self.angle_range)' wäre sowieso eine bessere Möglichkeit, ein Element aus einer Liste auszuwählen. – jasonharper

+0

Dies ist "objektorientierte Programmierung". Es ist eine der einfachsten Möglichkeiten, etwas Komplexes in 'tkinter' zu programmieren (Offensichtlich basiert dies auf Meinungen). Diese Frage ist wahrscheinlich besser zu erklären, dass ich bin: https://stackoverflow.com/questions/17466561/best-way-to-structure-a-tkinter-application –

Verwandte Themen