Nach langem Suchen bin ich auf dieses Froum gestoßen. Ich habe auch schon einiges an brauchbarem daraus gezogen. Vielen, vielen Dank an alle!!! Nun bin ich aber an einem Punkt wo ich nicht mehr weiter komme.
Ich habe in Python3 eine eigene Klasse erstellt die eine Analoguhr zeichnet. Bei der Erstellung des Objektes übergebe ich ihm die Werte für den Rahmen in der die Uhr erscheinen soll und die Größe der Uhr.
Desweiteren Werten noch zwei weitere Werte für die Anzeige übergeben. Genau diese Werte müssen jetzt aber immer wieder aktualisiert werden. Ich kann zwar die Werte zuweisen und sie werden auch erstellt aber ich weiß nun nicht wie ich sie laufend aktualisieren soll so dass das Hauptfenster auch stehen bleibt. Wenn ich eine Schleife einbaue läuft sie erst ab und erst dann wird das Hauptfenster erstellt.
Ich hoffe mir kann von euch jemand weiterhelfen. Schon mal vielen Dank im Voraus.
Grüße Jörg
Hier der Code:
Code: Alles auswählen
#!/usr/bin/python3
from tkinter import *
import tkinter
from math import *
from module.analoguhr import RhUhr
#from module.analoguhr import TempUhr
# root-Fenster
root = tkinter.Tk()
root.geometry("800x480")
root.title("Humimeter")
root.configure(background="black")
img = tkinter.PhotoImage(file='pics/humilogo.gif')
root.tk.call('wm', 'iconphoto', root._w, img)
# Rahmen erzeugen
toprahmen = Frame(root, bg="black", bd=8, relief=RIDGE)
toprahmen.grid()
rahmen_rh1 = Frame(toprahmen, bg="black", bd=2, relief=RIDGE)
rahmen_rh1.grid(row=0, column=0, pady=0, sticky=W + N)
rahmen_rh2 = Frame(toprahmen, bg="black", bd=2, relief=RIDGE)
rahmen_rh2.grid(row=0, column=1, pady=0, sticky=W + N)
# Testwerte fuer die Analog-RH-Uhr
folgeRh = 63.5
rhSoll = 65
zifferblattgroesse = 180
# Aufruf der RH-Analoguhr
testuhr1 = RhUhr(tkrahmen=rahmen_rh1, zifferblattgroesse=zifferblattgroesse)
testuhr1.setFolgeRh(folgeRh)
testuhr1.setSollRh(rhSoll)
root.mainloop()
Code: Alles auswählen
#!/usr/bin/env python3
from tkinter import *
from math import *
import tkinter as tk
class RhUhr(tk.Frame):
def __init__(self, tkrahmen=None, zifferblattgroesse=100):
tk.Frame.__init__(self, tkrahmen)
self._zifferblattgroesse = zifferblattgroesse
self.grid()
self.erzeugeRhUhr()
def setFolgeRh(self, folgeRh):
self._humidity = folgeRh
self._korrekturwert = (self._humidity) * 3 # Fuer Teilung des Kreises
self._korrekturwert = (-self._korrekturwert) # Vorzeichenwechsel
self._cos_x = (sin(radians(self._korrekturwert)) *
self._zifferblatt_radius)
self._cos_x = (self._cos_x + self._zifferblatt_radius)
self._sin_y = (cos(radians(self._korrekturwert)) *
self._zifferblatt_radius)
self._sin_y = self._sin_y + self._zifferblatt_radius
self._w3.coords(self._sid_zeiger_rhneu,
self._zifferblatt_radius,
self._zifferblatt_radius,
self._cos_x, self._sin_y) # Zeiger
self._rh_anzeigen = self._humidity
self._w3.itemconfigure(self._id_font_humidity, text=self._rh_anzeigen)
def setSollRh(self, rhSoll):
self._rhSoll = rhSoll
self._zifferblatt_radius = self._zifferblattgroesse / 2
self._strich_radius_in = (self._zifferblatt_radius * 0.9)
self._alpha_soll = (-rhSoll * 3)
self._start_x = (sin(radians(self._alpha_soll)) *
self._zifferblatt_radius)
self._start_x = self._start_x + (self._zifferblatt_radius)
self._start_y = (cos(radians(self._alpha_soll)) *
self._zifferblatt_radius)
self._start_y = self._start_y + (self._zifferblatt_radius)
self._end_x = (sin(radians(self._alpha_soll)) * self._strich_radius_in)
self._end_x = self._end_x + (self._zifferblatt_radius)
self._end_y = (cos(radians(self._alpha_soll)) * self._strich_radius_in)
self._end_y = self._end_y + (self._zifferblatt_radius)
self._w3.coords(self._id_soll_rh, self._start_x, self._start_y,
self._end_x, self._end_y)
def erzeugeRhUhr(self):
self._rh = 0
self._rhSoll = 0
#print ((self._zifferblattgroesse))
# ZifferblattDurchmesser
self._zifferblattgroesse = (self._zifferblattgroesse)
# ZifferblattRadius
self._zifferblatt_radius = (self._zifferblattgroesse / 2)
# Liniestartpunkt innen Striche
self._line_radius_in = (self._zifferblatt_radius * 0.6)
# Liniestartpunkt aussen Striche
self._line_radius_aus = (self._zifferblatt_radius * 0.7)
# Linienendpunkt Sollstrich
self._strich_radius_in = (self._zifferblatt_radius * 0.9)
# Schriftgrösse der Ziffern
self._zifferngroesse = int(self._zifferblatt_radius / 6)
# ZiffernPostitionsverhältnis
self._text_radius = (self._zifferblatt_radius * 0.8)
# Schriftgrösse RH und Temp
self._font_size_zifferblatt = int(self._zifferblatt_radius / 4)
self._alpha = 90 # Startpunkt für die Linienteilung in Grad
self._teilung = 30 # Teilung der Linien
# Wert x für das Canvas-Grafikfenster
self._canvas3_width = (self._zifferblattgroesse)
# Wert y für das Canvas-Grafikfenster
self._canvas3_height = (self._zifferblattgroesse)
# Hier wird das Canvas-Zeichenfenster erstellt'
self._w3 = tk.Canvas(self)
self._w3["width"] = self._canvas3_width
self._w3["height"] = self._canvas3_height
self._w3["highlightthickness"] = 0
self._w3["bd"] = 0
self._w3.grid(row=0, column=0, padx=0) # 'grid' für Rahmen platziert
self._w3.create_rectangle(0, 0, self._zifferblattgroesse,
self._zifferblattgroesse,
fill="black") # Zifferblatthintergrund
self._w3.create_oval(0, 0, self._zifferblattgroesse,
self._zifferblattgroesse,
fill="AntiqueWhite", width=0) # Zifferblatt
self._w3.create_rectangle(0, 0, self._zifferblattgroesse,
self._zifferblattgroesse,
fill="black") # Zifferblatthintergrund
self._w3.create_oval(0, 0, self._zifferblattgroesse,
self._zifferblattgroesse,
fill="AntiqueWhite", width=0) # Zifferblatt
# grüner Gutbereich auf das Ziffferblatt Zeichnen ---------------------
self._start_tk1 = (0, 0, self._zifferblattgroesse,
self._zifferblattgroesse)
self._sartline = self._zifferblattgroesse * 0.2
self._endline = self._zifferblattgroesse * 0.8
self._start_tk2 = (self._sartline, self._sartline,
self._endline, self._endline)
self._w3.create_arc(self._start_tk1, start=50, extent=30,
fill="green1", outline="")
self._w3.create_arc(self._start_tk2, start=0, extent=180,
fill="AntiqueWhite", outline="")
# Formel für die Winkelteilung der Teilstriche
self._i = 1
self._alpha_ziffer = (self._alpha)
while self._i <= 7:
self._start_x = ((sin(radians(self._alpha)) *
self._line_radius_in) +
(self._zifferblatt_radius))
self._start_y = ((cos(radians(self._alpha)) *
self._line_radius_in) +
(self._zifferblatt_radius))
self._end_x = ((sin(radians(self._alpha)) *
self._line_radius_aus) +
(self._zifferblatt_radius))
self._end_y = ((cos(radians(self._alpha)) *
self._line_radius_aus) +
(self._zifferblatt_radius))
self._text_x = ((sin(radians(self._alpha)) *
self._text_radius) +
(self._zifferblatt_radius))
self._text_y = ((cos(radians(self._alpha)) *
self._text_radius) +
(self._zifferblatt_radius))
# Teilstrich und Ziffern zeichnen
self._w3.create_line(self._start_x, self._start_y,
self._end_x, self._end_y, fill="black",
width=2)
self._w3.create_text(self._text_x, self._text_y,
text=(self._alpha_ziffer),
font=("Helvetica",
(self._zifferngroesse), "bold"))
self._i = (self._i + 1) # Zähler erhöhen
# Winkel Versetzen für die nächsten Linie
self._alpha = (self._alpha + (self._teilung))
self._alpha_ziffer = (self._alpha_ziffer - 10)
# Sollwertstrich erstellen
self._alpha_soll = (-self._rhSoll * 3)
self._start_x = ((sin(radians(self._alpha_soll)) *
self._zifferblatt_radius) +
(self._zifferblatt_radius))
self._start_y = ((cos(radians(self._alpha_soll)) *
self._zifferblatt_radius) +
(self._zifferblatt_radius))
self._end_x = ((sin(radians(self._alpha_soll)) *
self._strich_radius_in) +
(self._zifferblatt_radius))
self._end_y = ((cos(radians(self._alpha_soll)) *
self._strich_radius_in) +
(self._zifferblatt_radius))
self._id_soll_rh = self._w3.create_line(self._start_x, self._start_y,
self._end_x, self._end_y,
fill="orange", width=4)
# Zeiger erstellen
self._cos2_x = self._zifferblatt_radius
self._sin2_y = self._zifferblattgroesse
self._sid_zeiger_rhneu = self._w3.create_line(self._zifferblatt_radius,
self._zifferblatt_radius,
self._cos2_x,
self._sin2_y,
fill="red", width=1)
# Beschriftug für Digialwert erstellen
self._font_rh = ("Helvetica", self._font_size_zifferblatt, "bold")
self._text_pos_y = (self._zifferblatt_radius * 0.5 +
self._zifferblatt_radius)
self._id_font_humidity = self._w3.create_text(self._zifferblatt_radius,
self._text_pos_y,
text="Hygro",
font=self._font_rh) # RH
self._font_rh = ("Helvetica", self._font_size_zifferblatt)
self._text_pos_y = self._zifferblatt_radius * 0.7
self._w3.create_text(self._zifferblatt_radius, self._text_pos_y,
text="%", font=self._font_rh, fill="#404040")
# Mittenpunkte des Zeigers Vorbereitung RH
self._radius_zeigermitte = (self._zifferblattgroesse / 20)
self._radius_mittelstifft = (self._radius_zeigermitte / 3)
self._zeiger_mitte_radius_1 = (self._zifferblatt_radius +
self._radius_zeigermitte)
self._zeiger_mitte_radius_2 = (self._zifferblatt_radius -
self._radius_zeigermitte)
self._zeiger_mitte_stift_1 = (self._zifferblatt_radius +
self._radius_mittelstifft)
self._zeiger_mitte_stift_2 = (self._zifferblatt_radius -
self._radius_mittelstifft)
# Zeigermittepunkte Zeichnen
self._w3.create_oval(self._zeiger_mitte_radius_2,
self._zeiger_mitte_radius_2,
self._zeiger_mitte_radius_1,
self._zeiger_mitte_radius_1,
fill="red", width=0) # Zeigermittelkreis
self._w3.create_oval(self._zeiger_mitte_stift_2,
self._zeiger_mitte_stift_2,
self._zeiger_mitte_stift_1,
self._zeiger_mitte_stift_1,
fill="black", width=0) # Mittelstifftkreis