Anfängerproblem - GUI + Endlosschleife + Anzeige

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Jury-Universe
User
Beiträge: 3
Registriert: Donnerstag 26. Dezember 2019, 12:55

Hallo,

nun versuche ich schon seit Tagen...
Die GUI funktioniert.

Das Programm soll u.a. 8 Relais automatisch ein & aus schalten. (je nachdem, wie voll die Solarbatterie ist..)

Klicke ich auf das Fenster "Home-Modus" => ab def home_modus(self, event): , wird die Spannung an der Batterie gemessen.
Bis jetzt werden erstmal nur 2 Relais zum Test darüber dann automatisch geschaltet.

Und irgendwie habe ich es auch geschafft, dass die Spannung dann innerhalb der GUI angezeigt wird.
Jedoch wird das Textfenster => self.text_ctrl_4 = wx.TextCtrl(self, wx.ID_ANY, str(voltage1), pos = ( 717, 252), size = ( 235, 245 )) erst im Hauptprogramm angezeigt.

Aber wie bekomme ich so eine Endlosschleife hin?
(die Spannung, u.s.w. soll ständig abgefragt werden und nicht nur bei einem Klick auf das Fenster)

Oder, wie kann ich aus einem Unterprogramm die Spannung, direkt anzeigen lassen?
Also, innerhalb "def home_modus(self, event):" oder "def f(event):"
"def f(event):" läuft als MultiProcess parallel zum Hauptprogramm. Dieses erzeugt bisher nur ein Frame. Aber leider keine Ausgabe der Spannung, an der richtigen Position.
Ein Extra Frame wäre aber keine gute Lösung. Am liebsten innerhalb der GUI. So wie es schon funktioniert, nur irgendwie in einer Endlosschleife. So, dass ständig die aktuelle Spannung zu sehen ist.


Das ganze sollte eigentlich ein Weihnachtsgeschenk werden.
Aber da ich erst seit 2 Wochen erstmalig programmiere, brauche ich mehr Zeit oder einen Tip... :roll: :?:

Und hier der ganze Code (darunter ein Foto der GUI):


Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
#
# generated by wxGlade 0.9.4 on Mon Dec 16 14:13:04 2019
#

import wx
import RPi.GPIO as GPIO
import time
import Adafruit_ADS1x15
import os

from multiprocessing import Process


adc = Adafruit_ADS1x15.ADS1115()

# Start continuous ADC conversions on channel 0
adc.start_adc(3, gain=1)


GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

  
# GPIO 23 & 22 set up as inputs, pulled up to avoid false detection.  
# Both ports are wired to connect to GND on button press.  
# So we'll be setting up falling edge detection for both  
GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_UP)  
GPIO.setup(22, GPIO.IN, pull_up_down=GPIO.PUD_UP)  
  
# GPIO 24 set up as an input, pulled down, connected to 3V3 on button press  
GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

GPIO.setup(12, GPIO.OUT)    #Relai 1
GPIO.setup(16, GPIO.OUT)    #Relai 2
GPIO.setup(13, GPIO.OUT)    #Relai 3
GPIO.setup(27, GPIO.OUT)    #Relai 4
GPIO.setup(25, GPIO.OUT)    #Relai 5
GPIO.setup(19, GPIO.OUT)    #Relai 6
GPIO.setup(20, GPIO.OUT)    #Relai 7
GPIO.setup(6, GPIO.OUT)    #Relai 8

GPIO.setup(26, GPIO.OUT)    #LED
GPIO.setup(21, GPIO.OUT)    #Pieper

GPIO_PIR = 5

print ("PIR-Modul gestartet (CTRL-C to exit)")
print ("")
print ("")


# Set pin as input
GPIO.setup(GPIO_PIR,GPIO.IN)

# Initialisierung
Read  = 0
State = 0
Counter = 0
n = 0
m = 0


def f(event):
    global voltage1

    count = 0
    app = wx.App()
# Fenster
#    self.text_ctrl_4 = wx.TextCtrl(self, wx.ID_ANY, str(voltage1), pos = ( 717, 252), size = ( 235, 245 ))
    frame = wx.Frame(parent=None, title="chuck a luck", size=(235, 245))
    frame.SetBackgroundColour("white")
    frame.Show()
    app.MainLoop()

    while (count < 333333):     
        count = count + 1
        print (count)
        
    


# begin wxGlade: dependencies
# end wxGlade

# begin wxGlade: extracode
# end wxGlade

class _629771570__276881481__937043555__734407672__521534468__912868207__331308564_MyDialog(wx.Dialog):
    def __init__(self, *args, **kwds):
        # begin wxGlade: _629771570__276881481__937043555__734407672__521534468__912868207__331308564_MyDialog.__init__
        kwds["style"] = kwds.get("style", 0) | wx.CAPTION
        wx.Dialog.__init__(self, *args, **kwds)
        self.SetSize((1917, 1041))
        self.button_1 = wx.Button(self, wx.ID_ANY, "\"I AM AT\n HOME\"\n\n MODE")
        self.button_2 = wx.Button(self, wx.ID_ANY, "All Cams\n  \"OFF\"\n\n MODE")
        self.button_3 = wx.Button(self, wx.ID_ANY, "All Cams\n  \"ON\"\n\n MODE")
        self.button_4 = wx.Button(self, wx.ID_ANY, "\"I GO\nAWAY\"\n\nMODE")
        self.button_13 = wx.ToggleButton(self, wx.ID_ANY, " Shut -\n Down\n \n\"OFF\"")
        self.button_14 = wx.ToggleButton(self, wx.ID_ANY, " PIR - 1\n\n \"Deck\"")
        self.button_15 = wx.ToggleButton(self, wx.ID_ANY, "PIR - 2\n\n \"See\"")
        self.button_16 = wx.ToggleButton(self, wx.ID_ANY, "PIR - 3\n\n\"Steg\"")
        self.button_3_1 = wx.ToggleButton(self, wx.ID_ANY, "CAM\n - 1 -\n\n\"Deck\"")
        self.button_3_2 = wx.ToggleButton(self, wx.ID_ANY, "CAM\n - 2 -\n\n\"See\"")
        self.button_7 = wx.ToggleButton(self, wx.ID_ANY, "CAM\n - 3 -\n\n\"Steg\"")
        self.button_8 = wx.ToggleButton(self, wx.ID_ANY, "Schalter\n    - 4 -\n\n Telefon")
        self.button_9 = wx.ToggleButton(self, wx.ID_ANY, "Schalter\n    - 5 -\n\n   Licht")
        self.button_10 = wx.ToggleButton(self, wx.ID_ANY, "Schalter\n    - 6 -\n\nHeizung")
        self.button_11 = wx.ToggleButton(self, wx.ID_ANY, " Schalter\n    - 7 -\n\n All 12V")
        self.button_12 = wx.ToggleButton(self, wx.ID_ANY, " Schalter\n    - 8 -\n\nLAN/LTE")

        self.__set_properties()
        self.__do_layout()

        self.Bind(wx.EVT_BUTTON, self.home_modus, self.button_1)
        self.Bind(wx.EVT_BUTTON, self.no_cam_modus, self.button_2)
        self.Bind(wx.EVT_BUTTON, self.cam_modus, self.button_3)
        self.Bind(wx.EVT_BUTTON, self.go_away_modus, self.button_4)
        self.Bind(wx.EVT_TOGGLEBUTTON, self.off_modus, self.button_13)
        self.Bind(wx.EVT_TOGGLEBUTTON, self.pir1_modus, self.button_14)
        self.Bind(wx.EVT_TOGGLEBUTTON, self.pir2_modus, self.button_15)
        self.Bind(wx.EVT_TOGGLEBUTTON, self.pir3_modus, self.button_16)
        self.Bind(wx.EVT_TOGGLEBUTTON, self.schalter_01, self.button_3_1)
        self.Bind(wx.EVT_TOGGLEBUTTON, self.schalter_02, self.button_3_2)
        self.Bind(wx.EVT_TOGGLEBUTTON, self.schalter_03, self.button_7)
        self.Bind(wx.EVT_TOGGLEBUTTON, self.schalter_04, self.button_8)
        self.Bind(wx.EVT_TOGGLEBUTTON, self.schalter_05, self.button_9)
        self.Bind(wx.EVT_TOGGLEBUTTON, self.schalter_06, self.button_10)
        self.Bind(wx.EVT_TOGGLEBUTTON, self.schalter_07, self.button_11)
        self.Bind(wx.EVT_TOGGLEBUTTON, self.schalter_08, self.button_12)
        # end wxGlade

    def __set_properties(self):
        # begin wxGlade: _629771570__276881481__937043555__734407672__521534468__912868207__331308564_MyDialog.__set_properties
        self.SetTitle("Bord-Computer")
        self.SetSize((1917, 1041))
        self.SetBackgroundColour(wx.Colour(47, 47, 47))
        self.SetFont(wx.Font(36, wx.FONTFAMILY_ROMAN, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD, 0, "Serif"))
        self.button_1.SetMinSize((235, 245))
        self.button_1.SetToolTip(u"In diesem Modus schalten sich automatisch die Kameras nur über die Nacht ein.\nNach 24h (ohne weitere Klicks hier) schaltet jeder Modus in den \"NOT AT HOME\" Mode um.")
        self.button_2.SetMinSize((235, 245))
        self.button_3.SetMinSize((235, 245))
        self.button_4.SetMinSize((235, 245))
        self.button_13.SetMinSize((235, 245))
        self.button_14.SetMinSize((235, 245))
        self.button_15.SetMinSize((235, 245))
        self.button_16.SetMinSize((235, 245))
        self.button_3_1.SetMinSize((235, 245))
        self.button_3_2.SetMinSize((235, 245))
        self.button_7.SetMinSize((235, 245))
        self.button_8.SetMinSize((235, 245))
        self.button_9.SetMinSize((235, 245))
        self.button_10.SetMinSize((235, 245))
        self.button_11.SetMinSize((235, 245))
        self.button_12.SetMinSize((235, 245))
        # end wxGlade

    def __do_layout(self):
        # begin wxGlade: _629771570__276881481__937043555__734407672__521534468__912868207__331308564_MyDialog.__do_layout
        grid_sizer_1 = wx.GridSizer(4, 8, 0, 0)
        grid_sizer_1.Add(self.button_1, 0, 0, 0)
        grid_sizer_1.Add(self.button_2, 0, 0, 0)
        grid_sizer_1.Add(self.button_3, 0, 0, 0)
        grid_sizer_1.Add(self.button_4, 0, 0, 0)
        grid_sizer_1.Add((0, 0), 0, 0, 0)
        grid_sizer_1.Add((0, 0), 0, 0, 0)
        grid_sizer_1.Add((0, 0), 0, 0, 0)
        grid_sizer_1.Add(self.button_13, 0, 0, 0)
        grid_sizer_1.Add(self.button_14, 0, 0, 0)
        grid_sizer_1.Add(self.button_15, 0, 0, 0)
        grid_sizer_1.Add(self.button_16, 0, 0, 0)
        grid_sizer_1.Add((0, 0), 0, 0, 0)
        grid_sizer_1.Add((0, 0), 0, 0, 0)
        grid_sizer_1.Add((0, 0), 0, 0, 0)
        grid_sizer_1.Add((0, 0), 0, 0, 0)
        grid_sizer_1.Add((0, 0), 0, 0, 0)
        bitmap_1 = wx.StaticBitmap(self, wx.ID_ANY, wx.Bitmap("/home/pi/Pictures/man-sea-water-cut-2.jpg", wx.BITMAP_TYPE_ANY))
        bitmap_1.SetMinSize((1907, 245))
        grid_sizer_1.Add(bitmap_1, 0, 0, 0)
        grid_sizer_1.Add((0, 0), 0, 0, 0)
        grid_sizer_1.Add((0, 0), 0, 0, 0)
        grid_sizer_1.Add((0, 0), 0, 0, 0)
        grid_sizer_1.Add((0, 0), 0, 0, 0)
        grid_sizer_1.Add((0, 0), 0, 0, 0)
        grid_sizer_1.Add((0, 0), 0, 0, 0)
        grid_sizer_1.Add((0, 0), 0, 0, 0)
        grid_sizer_1.Add(self.button_3_1, 0, 0, 0)
        grid_sizer_1.Add(self.button_3_2, 0, 0, 0)
        grid_sizer_1.Add(self.button_7, 0, 0, 0)
        grid_sizer_1.Add(self.button_8, 0, 0, 0)
        grid_sizer_1.Add(self.button_9, 0, 0, 0)
        grid_sizer_1.Add(self.button_10, 0, 0, 0)
        grid_sizer_1.Add(self.button_11, 0, 0, 0)
        grid_sizer_1.Add(self.button_12, 0, 0, 0)
        self.SetSizer(grid_sizer_1)
        self.Layout()
        self.Centre()
        # end wxGlade

    def home_modus(self, event):  # wxGlade: _629771570__276881481__937043555__734407672__521534468__912868207__331308564_MyDialog.<event_handler>
        
        print("Event handler 'home_modus' not implemented!")
        global voltage, value
        # Read the last ADC conversion value and print it out.
        value = adc.get_last_result()
        voltage = ('%.1f'% (float(value)*50/32768.0))    #Originalwert:48 und nicht 50, but try..

        if State == 0 and 25 < float(voltage) < 26:
            print ("25 bis 26 Volt =>   ",voltage," V", end='\r')
            GPIO.output(25, GPIO.HIGH)
            GPIO.output(27, GPIO.LOW)
      
        elif State == 0 and float(voltage) < 25:
            print ("weniger als 25V =>  ",voltage," V", end='\r')
            GPIO.output(27, GPIO.HIGH)
            GPIO.output(25, GPIO.HIGH)
      
        elif State == 0 and float(voltage) > 26:
            print ("mehr als 26V =>     ",voltage," V", end='\r')

            GPIO.output(27, GPIO.LOW)
            GPIO.output(25, GPIO.LOW)
    

        voltage1 = str(voltage) + " Volt"

        self.text_ctrl_4 = wx.TextCtrl(self, wx.ID_ANY, str(voltage1), pos = ( 717, 252), size = ( 235, 245 ))
#        self.text_ctrl_4.ShowModal()
#        self.dialog.ShowModal()
        event.Skip()

    def no_cam_modus(self, event):  # wxGlade: _629771570__276881481__937043555__734407672__521534468__912868207__331308564_MyDialog.<event_handler>
        print("Event handler 'no_cam_modus' not implemented!3")
        event.Skip()

    def cam_modus(self, event):  # wxGlade: _629771570__276881481__937043555__734407672__521534468__912868207__331308564_MyDialog.<event_handler>
        print("Event handler 'cam_modus' not implemented!")
        event.Skip()

    def go_away_modus(self, event):  # wxGlade: _629771570__276881481__937043555__734407672__521534468__912868207__331308564_MyDialog.<event_handler>
        print("Event handler 'go_away_modus' not implemented!")
        event.Skip()

    def off_modus(self, event):  # wxGlade: _629771570__276881481__937043555__734407672__521534468__912868207__331308564_MyDialog.<event_handler>
        print("Event handler 'off_modus' not implemented!")
        event.Skip()

    def pir1_modus(self, event):  # wxGlade: _629771570__276881481__937043555__734407672__521534468__912868207__331308564_MyDialog.<event_handler>
        print("Event handler 'pir1_modus' not implemented!")
        event.Skip()

    def pir2_modus(self, event):  # wxGlade: _629771570__276881481__937043555__734407672__521534468__912868207__331308564_MyDialog.<event_handler>
        print("Event handler 'pir2_modus' not implemented!")
        event.Skip()

    def pir3_modus(self, event):  # wxGlade: _629771570__276881481__937043555__734407672__521534468__912868207__331308564_MyDialog.<event_handler>
        print("Event handler 'pir3_modus' not implemented!")
        event.Skip()

    def schalter_01(self, event):  # wxGlade: _629771570__276881481__937043555__734407672__521534468__912868207__331308564_MyDialog.<event_handler>
        print("Event handler 'schalter_01' not implemented!")
        event.Skip()

    def schalter_02(self, event):  # wxGlade: _629771570__276881481__937043555__734407672__521534468__912868207__331308564_MyDialog.<event_handler>
        print("Event handler 'schalter_02' not implemented!")
        event.Skip()

    def schalter_03(self, event):  # wxGlade: _629771570__276881481__937043555__734407672__521534468__912868207__331308564_MyDialog.<event_handler>
        print("Event handler 'schalter_03' not implemented!")
        event.Skip()

    def schalter_04(self, event):  # wxGlade: _629771570__276881481__937043555__734407672__521534468__912868207__331308564_MyDialog.<event_handler>
        print("Event handler 'schalter_04' not implemented!")
        event.Skip()

    def schalter_05(self, event):  # wxGlade: _629771570__276881481__937043555__734407672__521534468__912868207__331308564_MyDialog.<event_handler>
        print("Event handler 'schalter_05' not implemented!")
        event.Skip()

    def schalter_06(self, event):  # wxGlade: _629771570__276881481__937043555__734407672__521534468__912868207__331308564_MyDialog.<event_handler>
        print("Event handler 'schalter_06' not implemented!")
        event.Skip()

    def schalter_07(self, event):  # wxGlade: _629771570__276881481__937043555__734407672__521534468__912868207__331308564_MyDialog.<event_handler>
        print("Event handler 'schalter_07' not implemented!")
        event.Skip()

    def schalter_08(self, event):  # wxGlade: _629771570__276881481__937043555__734407672__521534468__912868207__331308564_MyDialog.<event_handler>
        print("Event handler 'schalter_08' not implemented!")
        event.Skip()

# end of class _629771570__276881481__937043555__734407672__521534468__912868207__331308564_MyDialog

class MyApp(wx.App):
    def OnInit(self):
        self.dialog = _629771570__276881481__937043555__734407672__521534468__912868207__331308564_MyDialog(None, wx.ID_ANY, "")
        self.SetTopWindow(self.dialog)      
        self.dialog.ShowModal()
        self.dialog.Destroy()
        return True

# end of class MyApp

if __name__ == "__main__":
#    info('main line')
    t = Process(target=f, args=('bob',))
    t.start()
#    p.join()

#    p = Process(target=MyApp, args=('bob',))
#    p.start()

    app = MyApp(0)
    app.MainLoop()

Bild
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und täglich grüßt das Murmeltier. Das Thema GUI und nebenläufige Programmierung mit after und ggf Threads wird hier permanent besprochen. Bitte mal durch das tkinter Forum stöbern.
Jury-Universe
User
Beiträge: 3
Registriert: Donnerstag 26. Dezember 2019, 12:55

Danke für den Hinweis...

Nur mein Problem ist, dass ich seit fast einer Woche ständig nur das Internet durchwühle.
Na nach 2 Wochen programmieren, kann man halt nur vieles ausprobieren.
Aber ich werde dort die Beiträge weiter lesen & hoffe, was zu finden..

Aber vielleicht hat jemand einen Tip für mich?
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

`import ... as` ist dazu da, einen Namen umzubenennen, GPIO wird aber gar nicht umbenannt, das `as` ist also Quatsch (da 99% der Quellen diesen Quatsch gegenseitig abschreiben ist es schwierig, den wieder aus der Welt zu schaffen). Warnungen sind dazu da, dass man sie behebt und nicht einfach ignoriert. Dazu muß man aber auch am Ende des Programms GPIO.cleanup verläßlich aufrufen.

Statt der vielen Kommentare solltest Du statt Zahlen für die Pins Deiner Relais sprechende Namen verwenden, wie Du es ja schon mit GPIO_PIR mehr oder weniger machst.

Das was Du da mit `f` und multiprocessing machst versteh ich nicht, macht auch nichts sinnvolles, kann also weg.

Du benutzt hier eine von wxGlade automatisch erzeugten Code. Der ist eigentlich nicht dazu da, ihn zu lesen oder zu verändern. Das zeigt schon der wenig schön lesbare Klassenname.

Vergiß auch gleich wieder, dass es so etwas wie `global` überhaupt gibt. Das macht nur Probleme und löst keine. In `home_modus` erzeugst Du auch ein TextCtrl. Das sollte man aber nur bei der Initialisierung machen und danach nur noch den Inhalt des TextCtrl ändern.

Um etwas regelmäßig zu tun, brauchst Du ein TimerEvent:
https://docs.wxpython.org/wx.TimerEvent.html
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Jury-Universe: Nebenläufige Programmierung und GUIs sind halt einfach nichts was man nach zwei Wochen programmieren kann, beziehungsweise ist dass das schwierigste was man sich für den Anfang aussuchen kann, weil man da letztlich alles können muss was es so zu können gibt. Woran es hier zum Beispiel offensichtlich mangelt ist objektorientierte Programmierung. ``global`` hat in einem Programm an sich schon nichts zu suchen, aber wenn man objektorientiert programmiert, gibt es dafür keine Ausrede mehr. Und Objektorientierung *braucht* man für GUI-Programmierung.

Neue Projekte sollte man nicht mehr mit Python 2 anfangen. `wx` ist auf einem Raspi eine ungewöhnliche Wahl.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst. Alles was Funktionen und Methoden ausser Konstanten benötigen, wird als Argument(e) übergeben. Ergebnisse als Rückgabewerte an den Aufrufer zurückgegeben.

Der generierte GUI-Code macht das ganze sehr unübersichtlich und man sollte den auch nicht verändern, weil man ihn dann nicht im GUI-Editor verändern und neu generieren kann ohne das man selbst geschriebenen Programmcode zerstört.

`os` und `time` werden importiert aber nirgends verwendet. Aus `multiprocessing` wird `Process` importiert aber für nichts sinnvolles verwendet.

Statt magischer Zahlen für die Pins und Kommentaren bei der ersten Verwendung, sollten Konstanten definiert werden, damit man sich a) die Kommentare sparen kann, und b) nicht nur an einer Stelle im Programm sehen kann was die Zahlen bedeuten, sondern überall wo der Wert verwendet wird.

Man sollte die Programmlogik von der GUI sauber trennen, sonst wird das sehr schnell sehr unübersichtlich.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Jury-Universe
User
Beiträge: 3
Registriert: Donnerstag 26. Dezember 2019, 12:55

Der wx.TimerEvent war die Lösung. :) :) :)

Vielen Dank Euch beiden... :D

Ich bin so happy. Jetzt ist alles weitere "leicht"... :geek:

Eigentlich hatte ich das gewünschte Ziel schon am Anfang, nach 3 Tagen erreicht. Jedoch nur in einem Terminal Fenster.
Danach suchte ich einen Weg für eine Grafik-Bedienung (auch per TochScreen) und kam auf wxGlade.
Die GUI zu erstellen war damit leicht. Jedoch dann 2 Programme zusammen zu setzen, war dann über eine Woche, bis jetzt die Hölle.

Danke folgender Zeilen (innerhalb der Initialisierung) läuft es nun:
self.timer = wx.Timer(self)
self.Bind(wx.EVT_TIMER, self.home_modus)

print ("starting timer...")
self.timer.Start(1000)
Und Danke für all die anderen Hinweise. Ja, ich muss noch viel lernen & Ordnung/Übersicht/Variablen/.. im Code besser machen.
"wxGlade" stürzte bei mir öfters ab, bei dem Versuch, die ExtraCodes dort mit rein zu schreiben.
So war ich froh, dass zumindest eine GUI so einfach möglich war. Jedoch zum testen & lernen, veränderte ich diesen Code danach lieber im "Tonny Python Editor".
Ich benutze auch Python 3.
Der Multiprocess ermöglichte mir eine Endlosschleife. Nur konnte ich von da aus nicht die Spannung innerhalb der GUI darstellen. Es war nur ein Versuch, der jetzt nur ganz evtl. noch gebraucht wird.
Import "OS" und "Time" werden später noch gebraucht. (z.B. VLC Player starten, um Fernseher zu simulieren, Raspberry ausschalten - einschalten nach Uhrzeit, best. Verbraucher nach Batteriespannung entsprechend ausschalten, u.s.w..)

Nur eine kleine Frage.. - Warum ist "wx" auf einem Raspberry eine ungewöhnliche Wahl?
Hat es irgendwelche Nachteile? Oder, was wäre besser?

Und so langsam verstehe ich, was "objektorientierte Programmierung" ist...
Da fang ich ganz neu an, und da nützen alte C64 & Amiga Basic Kenntnisse nur wenig... :lol:

Dank der GUI werde ich nun viele kleine Unterprogramme basteln.
Und aus meinem ersten Programm, die alte, lange Endlosschleife schön übersichtlich klein zerlegen...
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Jury-Universe: Ein Programm bei dem man selbst die volle Kontrolle über den Programmfluss hat, mit einer GUI wo der Programmfluss von der GUI-Hauptschleife gesteuert wird, zu verbinden ist die Hölle weil das zwei Ansätze sich die sich nicht vertragen. Also muss man da einiges umschreiben, damit es in das passt was vom GUI-Rahmenwerk vorgegeben ist.

Also `wx` ist eigentlich unter Linux eine ungewöhnliche Wahl weil da Gtk und Qt dominieren. `wx` sieht man eher unter Windows weil dort die Installation leichter ist, oder zumindest war als ich mich das letzte mal damit beschäftigte, und die Lizenz kommt Leuten die keine GPL mögen entgegen. Zudem wirkt die API von `wx` im Gegensatz zu Gtk und Qt doch ein wenig angestaubt an.

`wxGlade` hat zudem den Nachteil das dort nur das angeboten wird was das zugrundeliegende `wxWidgets` anbietet, die Python `wx`-Anbindung ist aber nicht nur eine 1:1 Anbindung sondern bietet selbst noch einiges was in Python programmiert ist, in `wxGlade` aber nicht zur Auswahl steht.

Bei der Beschreibung wofür `os` später noch gebraucht wird, kann man vermuten das externe Programme gestartet werden sollen: dafür gibt es das `subprocess`-Modul. `os.system()` sollte nicht verwendet werden. Dessen Dokumentation verweist auf das `subprocess`-Modul. Und für die anderen Funktionen um Prozesse zu starten sollte man einen guten Grund haben.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten