Falls es jemanden interessiert, ich klatsch hier mal den Quellcode rein. In der Methode pi_naehern wird zufällig ein Punkt generiert, dann wird mit dem Pythagoras geguckt, ob der im gedachten Viertel-Kreis drin ist, und dann wird mit Hilfe der "Trefferquote" überlegt, wie groß der Kreis denn ungefähr ist und wie groß Pi folglich sein muss. Der Rest ist für die GUI zuständig.
Code: Alles auswählen
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk
from random import random
class Pi_Rechner:
def __init__(self, update_schritt=100, wartezeit=500):
self.punkte_gesetzt = 0
self.punkte_im_kreis = 0
self.laeuft = False
self.update_schritt = update_schritt
self.wartezeit = wartezeit
self.init_fenster()
def init_fenster(self):
self.fenster = tk.Tk()
self.fenster.geometry("400x150")
self.fenster.title("Pi nähern")
self.gesetzt_label = tk.Label(self.fenster)
self.im_kreis_label = tk.Label(self.fenster)
self.pi_label = tk.Label(self.fenster)
for label in (self.gesetzt_label, self.im_kreis_label, self.pi_label):
label.config(font="Arial 14")
label.pack()
self.startstop_button = tk.Button(self.fenster, text="Start", command=self.umschalten)
self.startstop_button.pack()
def umschalten(self):
self.laeuft = not self.laeuft
button_text = "Pause" if self.laeuft else "Weiter"
self.startstop_button.configure(text=button_text)
if self.laeuft:
self.durchlauf()
def pi_naehern(self):
self.punkte_gesetzt += 1
x, y = random(), random()
abstand = (x**2 + y**2) ** 0.5
if abstand <= 1:
self.punkte_im_kreis += 1
def gui_aktualisieren(self):
self.gesetzt_label.configure(text = "Punkte gesetzt: %i" %self.punkte_gesetzt)
self.im_kreis_label.configure(text = "Punkte im Viertelkreis: %i" %self.punkte_im_kreis)
self.pi_label.configure(text = "π = 4*%i/%i = %f"
%(self.punkte_im_kreis, self.punkte_gesetzt,
4 * self.punkte_im_kreis / self.punkte_gesetzt))
def durchlauf(self):
self.pi_naehern()
if self.punkte_gesetzt % self.update_schritt == 0:
self.gui_aktualisieren()
self.fenster.after(self.wartezeit, self.durchlauf)
elif self.laeuft:
self.fenster.after(0, self.durchlauf)
pi_rechner = Pi_Rechner(10000, 1)
Ich weiß, es ist nicht der Event-Handler, der sich rekursiv aufruft. Aber so was ähnliches! ^^
Edit (19:10) : kleinen Fehler in umschalten() korrigiert.
PS: Die angebotene Summe ist beachtlich.