Programmierer Python gesucht ( gegen Bezahlung ) für Steuerung

Alles, was nicht direkt mit Python-Problemen zu tun hat. Dies ist auch der perfekte Platz für Jobangebote.
Antworten
Serian
User
Beiträge: 7
Registriert: Freitag 13. März 2020, 18:49

Hallo

Hardware :
Raspi3b+
10 Zoll Touch (1024x600)
8 Taster
4 Relais
2 Temperatursensoren (one Wire)

Programm:
(der code den ich gleich teilweise einfüge ist aus allen Programmiersprachen gemixt, sollte aber zum Verständnis beitragen )

Programm an, Bildschirm Schwarz, nur Temeraturanzeige Fühler 1, gpio ( mir jacke ich nehm mal 40 ) high
sind dann 62 Grad C erreicht gpio 40 auf low und gpio 38 auf high. Hauptprogramm start.

Oberfläche sieht so aus ( dank eines Forenusers hier der auch noch was abbekommt ) :

Code: Alles auswählen

import tkinter as tk
from functools import partial

def button_click(button):
    if button["text"] == "Start":
        button["text"] = "Stopp"
        button["background"] = "red"
        activebackground = "red"
    else:
        button["text"] = "Start"
        button["background"] = "#00ff00"
        activebackground = "#00ff00"

def create_button_pair(button_frame, row):
    time_button = tk.Button(button_frame, text="2:00:00", bg="#ffffff", width=6, height=1, font=("arial", 46))
    time_button.grid(row=row, column=0, padx=22, pady=12)
    start_stop_button = tk.Button(button_frame, text="Start", bg="#00ff00", width=6, height=1, font=("arial", 46))
    start_stop_button.grid(row=row, column=1, padx=65, pady=3)
    start_stop_button['command'] = partial(button_click, start_stop_button)
    return time_button, start_stop_button

def main():
    root = tk.Tk()
    root.wm_title("TR3000")
    root.geometry("600x1024")
    root.config(cursor="none")
#    root.attributes('-fullscreen', True)
    main_frame = tk.Frame(root, background="#000000", width=600, height=1024)
    main_frame.grid(row=0, column=0, padx=0, pady=0)
    button_frame = tk.Frame(main_frame, background="#000000")
    button_frame.grid(row=1, column=0, padx=0, pady=20)
    buttons = [create_button_pair(button_frame, row) for row in range(8)]
    slider = tk.Scale(main_frame, from_=0, to=120, resolution=1, orient=tk.HORIZONTAL, length=500, font=("arial",22))
    slider.set(120)
    slider.grid(row=8, padx=0, pady=3)
    root.mainloop()

if __name__ == '__main__':
    main()

Sollte fast selbsterklärend sein ( die Optik und Funktion )

Ich tippe auf eine Zeit ( vor Start ) , stelle die Zeit über den Slider ein und gut ist.
Dazu kommt pro Start-Stopp - Button noch eine Abfrage ob der Taster auch aktiv ist, wenn nein ( also offen ) gpio 40 auf High.

Ist eine Zeit abgelaufen gpio 38 auf High ( Blinkend ) und Button Grün Blinkend .

Das ist alles, Erbitte Angebote,
Mister
User
Beiträge: 36
Registriert: Freitag 24. Januar 2020, 21:58

Also bis die Temperatur über 62 Grad steigt willst du nur einen schwarzen Bildschirm mit der Temperaturanzeige und gpio 40 soll high sein und wenn 62 Grad erreicht sind soll dann ein programm gestartet werden und gpio 40 auf low und gpio 38 auf high gesetzt werden?
Und dann soll irgendwann noch eine Zeit ausgewählt werden nach der gpio 38 auf high gesetzt werden soll? :?:
Kannst du mal erklären was das ganze steuern soll und das Programm ausführlicher erklären damit mandas besser versteht?
Grüße
Mister
Serian
User
Beiträge: 7
Registriert: Freitag 13. März 2020, 18:49

Ne, daher ja der code (optik). Das in geht + Bildschirm davor + Timer die gehen.... steht alles im ersten Post
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Sollte selbsterklaerend, ist es nicht. Das ist alles krude. "mir Jacke" kann ich nicht programmieren. 40 kann ich programmiern. Das dann irgendwie irgendwas heizt muss man schon raten, weil dann ploetzlich eine Temperatur erreicht wird. Und welcher von den zwei Sensoren ist denn da massgeblich? Oder beide, gemittelt? Oder gewuerfelt? Dann schaltet man also die Heizung aus, und dann erst startet die GUI? Oder wie oder was?

Du denkst du hast hier was. Und du denkst, mit dem Setup, das du hast, ist dein Problem auch loesbar. Ersteres ist 100%ig falsch. Letzteres unter Umstaenden. Wenn man sowas geloest haben will, dann beschreibt man - ausfuehrlich, und nicht mit wedelnden Handbewegungen bei Details - was das PROBLEM ist. In dieser Problembeschreibung kommen keine GPIOs vor, keine GUI-Element, nix. Sondern was das fuer eine Anlage ist, was da gemessen wird, was da gesteuert wird, wie man das beeinflussen will. Dann kann man einschaetzen, ob das was hier vorliegt an Hardware und damit Mess- und Schaltfunktion ueberhaupt ausreicht, und wie das angesprochen werden muss.
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Serian: Die Fenstergrösse sollte man nicht vorgeben, die sollte sich aus dem Fensterinhalt ergeben. Wenn man denn unbedingt eine Grösse für irgend etwas vorgeben muss, dann sollte man das an *einer* Stelle tun. Also entweder die Fenstergrösse und dann dem Inhalt entsprechend sagen er soll sich den ganzen Platz nehmen der da ist, oder man setzt die Grösse auf dem Inhalt, woraus sich die Fenstergrösse dann ja ergibt.

`buttons` wird definiert, aber nirgends verwendet. Dann ist an der Stelle die „list comprehension“ auch nicht sinnvoll.

``height=1`` bei den Buttons ist überflüssig.

Das Zeit-Button und Start/Stopp-Button unterschiedliche Padding-Werte haben macht nicht wirklich Sinn und führt zu einer asymmetrischen GUI.

Warum die beiden Elemente im `main_frame` in den Grid-Zeile 1 und 8 landen ist nicht wirklich klar. Die sollten in 0 und 1 stehen. Wobei ich persönlich auch überlegen würde für alles was nicht Zeilen *und* Spalten benötigt einfach `pack()` zu verwenden.

Im Button-Callback wird die lokale Variable `activebackground` gebunden, was aber wohl eher eine Option des `Button` sein sollte. Zudem sollte man diesen Wert dann auch beim erstellen der Buttons setzen, sonst ändert sich das Verhalten beim ”hovern” erst wenn man den jeweiligen Button das erste mal gedrückt hat.

Ich persönlich teste ja auch gerne unmögliche Möglichkeiten. Also nicht nur ob im Button "Start" steht und dann einfach davon ausgehen dass es ansonsten "Stopp" sein muss. Was wenn es das mal nicht ist durch Programmänderungen, absichtlich oder unabsichtlich.

Wobei das natürlich sowieso äusserst unschön ist sich hier Zustand in Form von Text in Buttons zu merken. Das ist ja nur so weil es ein Beispiel war/ist bei dem die Programmlogik unbekannt ist. *Die* sollte hier zugreifbar sein, und den Zustand zur Verfügung stellen.

Warum werden da eigentlich alle Farben in Hex-Notation angegeben, ausser die Farbe rot? Und das sind wenn ich das richtig sehe alles sehr einfache Farben, die ziemlich eindeutige Namen haben. Es wäre IMHO lesbarer wenn man all diesen Farben als Namen schreiben würde.

Zwischenstand:

Code: Alles auswählen

#!/usr/bin/env python3
import tkinter as tk
from functools import partial

FONT_NAME = "arial"


def on_button_click(button):
    text = button["text"]
    if text == "Start":
        button.config(text="Stopp", bg="red", activebackground="red")
    elif text == "Stopp":
        button.config(text="Start", bg="green", activebackground="green")
    else:
        assert False, f"unexcpedted button text {text!r}"


def create_button_pair(button_frame, row):
    font = (FONT_NAME, 46)
    width = 6
    grid_options = {"padx": 22, "pady": 12}
    time_button = tk.Button(
        button_frame, text="2:00:00", bg="white", width=width, font=font
    )
    time_button.grid(row=row, column=0, **grid_options)
    start_stop_button = tk.Button(
        button_frame,
        text="Start",
        bg="green",
        activebackground="green",
        width=width,
        font=font,
    )
    start_stop_button.grid(row=row, column=1, **grid_options)
    start_stop_button["command"] = partial(on_button_click, start_stop_button)


def main():
    root = tk.Tk()
    root.wm_title("TR3000")
    root.config(cursor=tk.NONE)
    # root.attributes("-fullscreen", True)
    main_frame = tk.Frame(root, background="black", width=600, height=1024)
    main_frame.grid(row=0, column=0, padx=0, pady=0)

    button_frame = tk.Frame(main_frame, background="black")
    button_frame.grid(row=0, column=0, padx=0, pady=20)
    for row in range(8):
        create_button_pair(button_frame, row)

    max_value = 120
    slider = tk.Scale(
        main_frame,
        from_=0,
        to=max_value,
        resolution=1,
        orient=tk.HORIZONTAL,
        font=(FONT_NAME, 22),
    )
    slider.set(max_value)
    slider.grid(row=1, column=0, padx=22, pady=3, sticky=tk.EW)

    root.mainloop()


if __name__ == "__main__":
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten