Datenaustausch zwischen Classen

melmager

Erfahrenes Mitglied
erst mal eine Erklärung vorweg: Ich komme aus der Java ecke
Zur Frage :
Wie Tausche ich in Python daten aus / oder rufe Functionen (def) in andren Classen auf ?

Ich erstelle grade eine Classe die mit noblocking Code arbeiten soll und wenn über Netzwerk daten reinkommen soll erstmal eine funktion einer andren classe aufgerufen werden.

Code:
class motosteuerung:
   def speed(self,tempo):
       pass

class netz:
   ## snipp
   async def run_client(self, sreader, swriter):
      # daten lesen und aufbereiten
      # und hier möchte ich speed von der motor steuerung aufrufen

In java ürde ich ja einfach eine Referenz von der Motorsteuerung classe an die Classe Netz übergeben - wird das in Python genauso gemacht oder gibt es da ein andre Vorgehensweise / Technik ?
 

melmager

Erfahrenes Mitglied
problem gelöst - man kann in Python funktionen übergeben - nett

m = motorsteuerung()
f = m.speed

dann geht f(100)

und die classe netz kann auf t zugreifen
geht sicher noch schöner :)
 

melmager

Erfahrenes Mitglied
Andrerseits regt mich Python grade auf das Tkinker die pack / grid Functionen die Variablen Refenzen löscht - für die Erkenntnis habe ich Stunden gebraucht.
die Reihenfolge geht:
Code:
lbscroll = tk.Scrollbar(frametop, orient=tk.VERTICAL)
lbox = tk.Listbox(frametop,yscrollcommand = lbscroll.set)
lbox.grid(row=0,column=0,columnspan=2)
lbscroll.grid(row=0,column=3)

und die nicht :
Code:
lbscroll = tk.Scrollbar(frametop, orient=tk.VERTICAL)
lbscroll.grid(row=0,column=3)
#ab hier ist lbscroll keine gültige var mehr undin der folge gibt es ein fehler
lbox = tk.Listbox(frametop,yscrollcommand = lbscroll.set)
lbox.grid(row=0,column=0,columnspan=2)

warum ist so ein murks eigendlch so beliebt ?
 

zerix

Hausmeister
Moderator
UIs habe ich mit Python noch nicht gebaut, aber ich würde eher in Richtung GTK oder QT schauen.

Bezüglich deiner ersten Frage. Grundsätzlich gibt man dort auch Objekte mit, um dort Funktionen aufzurufen. Also ich würde es genau so machen, wie in Java.
Aber wie du schon festgestellt hast, ist in Python tatsächlich alles ein Objekt, also auch Methoden und Funktionen und man kann diese gesondert übergeben.

Viele Grüße
Sascha
 

Technipion

Erfahrenes Mitglied
Es ist durchaus möglich sehr schöne und funktionale GUIs in Python mit tkinter zu erstellen. Das große Problem ist nur, dass das Internet bis zur Unkenntlichkeit mit veralteten oder schlechten Python tkinter Tutorials verunstaltet ist.
Dem interessierten Leser sei hier das E-Book Modern Tkinter for Busy Python Developers von Mark Roseman empfohlen. Dort werden die internen Konzepte von TK eigentlich ganz gut erklärt, und es wird durchweg der "neue" Stil mit ttk verwendet.
Aus diesem Buch habe ich hier mal ein Code-Listing abgetippt und noch etwas verfeinert:
Python:
from tkinter import *
from tkinter import ttk

root = Tk()

root.style = ttk.Style()
#print(root.style.theme_names()) # find out what themes are supported
#('clam', 'alt', 'default', 'classic') # on my ubuntu system at least
root.style.theme_use('clam')

content = ttk.Frame(root, padding=(3, 3, 12, 12))
frame = ttk.Frame(content, borderwidth=5, relief='sunken', width=200, height=100)

namelbl = ttk.Label(content, text='Name')
name = ttk.Entry(content)

onevar = BooleanVar()
twovar = BooleanVar()
threevar = BooleanVar()

onevar.set(True)
twovar.set(False)
threevar.set(True)

one = ttk.Checkbutton(content, text='One', variable=onevar, onvalue=True)
two = ttk.Checkbutton(content, text='Two', variable=twovar, onvalue=True)
three = ttk.Checkbutton(content, text='Three', variable=threevar, onvalue=True)

ok = ttk.Button(content, text='Okay')
cancel = ttk.Button(content, text='Cancel')

content.grid(column=0, row=0, sticky=(N, S, E, W))
frame.grid(column=0, row=0, columnspan=3, rowspan=2, sticky=(N, S, E, W))

print('**check before**')
print(id(namelbl), type(namelbl))
print(id(name), type(name))

namelbl.grid(column=3, row=0, columnspan=2, sticky=(N, W), padx=5)
name.grid(column=3, row=1, columnspan=2, sticky=(N, E, W), pady=5, padx=5)

print('**check after**')
print(id(namelbl), type(namelbl))
print(id(name), type(name))

one.grid(column=0, row=3)
two.grid(column=1, row=3)
three.grid(column=2, row=3)

ok.grid(column=3, row=3)
cancel.grid(column=4, row=3)

root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)

content.columnconfigure(0, weight=3)
content.columnconfigure(1, weight=3)
content.columnconfigure(2, weight=3)
content.columnconfigure(3, weight=1)
content.columnconfigure(4, weight=1)
content.rowconfigure(1, weight=1)

print('**listing all widgets that have been gridded**')
print(content.grid_slaves())
for w in content.grid_slaves():
    print(w)

print('**asking for specific row**')
for w in content.grid_slaves(row=3):
    print(w)

print('**asking for specific column**')
for w in content.grid_slaves(column=0):
    print(w)

print('**listing gridding options of namelbl**')
print(namelbl.grid_info())

print('**reconfiguring gridding options of namelbl**')
namelbl.grid_configure(sticky=(E, W))

print('**check if successfull**')
print(namelbl.grid_info())

root.mainloop()

Ich denke das meiste davon sollte selbsterklärend sein, außer natürlich den zugrundeliegenden Konzepten von TK selbst. Ich wollte damit eigentlich nur zeigen, dass auch die Python Bordmittel sehr sinnvoll für GUIs genutzt werden können.
Für sehr umfangreiche grafische Software würde ich persönlich wahrscheinlich auch eher zu GTK (hoffentlich kommt bald 4.0 raus) oder QT (in dem Fall PySide) greifen. Aber um mal schnell ein "einfaches" Kommandozeilenprogramm für den typischen Windows-User zugänglich zu machen reicht tkinter imho völlig aus.

Gruß Technipion
 

Neue Beiträge