Einrücken zerstört ganzes Programm

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
jake-the-snake

Abend Freunde

Nachdem ich ein paar Sachen zurecht gerückt hatte, geht nun gar nichts mehr! Ich habe ja schon einige Sachen programmiert, u. a. in Perl, aber sowas ist mir im Leben noch nicht unter gekommen. Ich kann keinen Sinn darin finden, wie das Python jetzt die Abstände haben will. Ich probiere schon seit Stunden mit Space und Tab - ohne Erfolg.

Man muss sich das einmal vorstellen - fünf Tage Arbeit futsch -> wegen Einrückfehler!

Ich poste hier mal den Python-Code - die Verschlüsselungssequenzen sind ja noch nicht implementiert...
Wie gesagt, das Programm lief - ich habe nichts geändert - außer den Einrückungen - manmanman...

Code: Alles auswählen

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
import sys
import time
import pyudev
import subprocess

from tkinter import *

# Byte-Werte aus Terminal-in Variable-Packen
output = subprocess.check_output("lsusb")

# Byte-Werte umwandeln in String-Werte
output = output.decode('utf8')
# String-Werte zur Definition von Variable
usbid = output
# USB-Seriennummern-Vergleich
usbid = usbid.find('054c:019e')
# Fenster-Titel
root = Tk(className=" xxxxxx - xxxx - xxxx                                                                                                  (xxx_xx.x)")

# Einleitung der App-Knoepfe
class App:
	  def __init__(self, master):
	 frame = Frame(master)
	 frame.place(width=120, height=320, x=288, y=120, border= "outside")
	 # Code-Botton
	 self.codeing = Button(frame, 
	 text="Verschlüsseln ►", fg="red", pady=5, padx=5,
	 command=self.write_codeing)
	 self.codeing.pack()
	 # Decode-Botton    
	 self.decoding = Button(frame,
	 text="◄ Entschlüsseln", fg="green", pady=5, padx=5,
	 command=self.write_decoding)
	 self.decoding.pack()
	 # Export-Botton
	 self.savetousb = Button(frame,
	 text="USB  - Export ▼", fg="black", pady=5, padx=5,
	 command=self.write_savetousb)
	 self.savetousb.pack()
	 # Import-Botton
	 self.loadfromusb = Button(frame,
	 text="USB  - Import ▲", fg="black", pady=5, padx=5,
	 command=self.write_loadfromusb)
	 self.loadfromusb.pack()
	####################
	# Codierungs-Block #
	####################
	 def write_codeing(self):
	  print ("Verschlüsselung wird ausgeführt") 
	######################
	# Decodierungs-Block #
	######################
	 def write_decoding(self):
	  print ("Entschlüsselung wird ausgeführt")
	####################
	# USB-Export-Block #
	####################
	 def write_savetousb(self):
	  print ("Schreibe Daten auf USB")
	  os.system('clear')
	####################
	# USB-Import-Block #
	####################
	 def write_loadfromusb(self):
	  print ("Lese Daten von USB")
	  os.system('clear')

	# Knoepfe-App-Ende
	app = App(root)

def center_window(width=300, height=200):
# get screen width and height
  screen_width = root.winfo_screenwidth()
  screen_height = root.winfo_screenheight()

# calculate position x and y coordinates
  x = (screen_width/2) - (width/2)
  y = (screen_height/2) - (height/2)
  root.geometry('%dx%d+%d+%d' % (width, height, x, y))

  center_window(700, 380)

# Linke Schrift ueber Klartext-Feld 
  oneLabel = Label(root, text="Klartext-Feld", font=("TimesNewRoman", 18))
  oneLabel.place(x=25,y=15)

# Rechte Schrift ueber Codetext-Feld
  twoLabel = Label(root, text="Codetext-Feld", font=("TimesNewRoman", 18))
  twoLabel.place(x=535,y=15)

# Linkes Klartextfeld 
  klartextfeld = Text(root, height=20, width=35)
  klartextfeld.place(x=25,y=60)
  klartextfeld.insert(END, "Ihre Nachricht...")

# Rechtes Codetextfeld 
  codetextfeld = Text(root, height=20, width=35)
  codetextfeld.place(x=425,y=60)
  codetextfeld.insert(END, "Zugehöriger Cryptocode...")


# Photo-Anzeige-On
  photo = PhotoImage(file="usb-logo-on.gif")
  label = Label(image=photo)
  label.image = photo
  label.place(x=330,y=245)

root.mainloop()
Ich mach morgen nochmal einen Versuch - heute sehe ich sowieso nur noch Sternchen vor lauter def und root und app.-Geschichten...

Gute Nacht Forum

:K
Benutzeravatar
pillmuncher
User
Beiträge: 1482
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Lies einfach die Sprachreferenz in der Dokumentation und/oder arbeite das Tutorial durch, dann wird dir das mit den Einrückung auch klar.

Wildes Herumexperimentieren bringt, wie du bereits gemerkt hast, nichts.
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

jake-the-snake hat geschrieben:Ich kann keinen Sinn darin finden, wie das Python jetzt die Abstände haben will. Ich probiere schon seit Stunden mit Space und Tab - ohne Erfolg.

Man muss sich das einmal vorstellen - fünf Tage Arbeit futsch -> wegen Einrückfehler!
Also wenn du für diesen Schnipsel mehrere Stunden zum Wiederherstellen der korrekten Einrückung brauchst, dann hast du in Sachen Python (und Programmierung allgemein) noch einiges zu tun. Sicherlich ist es ärgerlich, diese Erfahrung zu machen, sofern einem das vorab nicht klar war. Aber hier kommt es so rüber als wenn du Null Plan von der Strukturierung des vorliegenden Programms hast. Ist das überhaupt von dir geschrieben worden? Machst du das hauptberuflich...?
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@jake-the-snake: da fehlen halt die Grundlagen. Tipp: vergiss' dein Programm für ein paar Tage und lern' die Grundlagen. Z.B. indem du das Python-Tutorial durcharbeitest.

Einrückungen sind _essentiell_ wichtig und Syntax-Element bei Python. Der Standard bei Einrückungen ist 4 (und nicht 1 oder 2 oder 3 oder 5 oder ...) Leerzeichen (Leerzeichen, keine Tabs). Was eine Einrückungsebene ist -> siehe Python-Tutorial.

In dem Zuge könntest du dir auch mal anschauen, wie das mit der Objektorientierung bei Python funtkioniert und wie man nicht-triviale Tk-Inter Programme strukturiert. Aktuell ist dein Code eine ziemliche wilde Mischung aus einer Klasse, einer Funktion und Inline-Code.

In dem Zuge kannst du direkt auch den Sternchen-Import eleminieren. Viele TK-Inter Tutorials benutzen das zwar, aber das ist schelchter Still, weil es so unerwarteten Namenskollissionen kommen kann, welche im schlechtesten Fall lustige Fehler im Programm verursachen, die man schwer bis gar nicht findet. Besser: `import tkinter as tk` und dann z.B. `root = tk.Tk(...)` oder `frame = tk.Frame(...)`.

Und, wie ich dir schon im ubuntuusers.de Forum sagte: vergiß' einfach, dass es `os.system()` gibt. `subprocoess` ist der richtige Weg.

Gruß, noisefloor
jake-the-snake

Morgen Forum

Erstmal sorry für den kleinen Anfall von gestern - es ist aber auch zum... gewesen.

@pillmuncher
Ich habe hier teilweise 3 Tutorial gleichzeitig offen gehabt... Und in jedem ist der Syntax wieder ein klein wenig anders. Dann muss man noch aufpassen, dass man kein Python2 Code erwischt... usw...

@snafu
Also wenn du für diesen Schnipsel mehrere Stunden zum Wiederherstellen der korrekten Einrückung brauchst, dann hast du in Sachen Python (und Programmierung allgemein) noch einiges zu tun. Sicherlich ist es ärgerlich, diese Erfahrung zu machen, sofern einem das vorab nicht klar war. Aber hier kommt es so rüber als wenn du Null Plan von der Strukturierung des vorliegenden Programms hast. Ist das überhaupt von dir geschrieben worden? Machst du das hauptberuflich...?
Ich habe noch nie etwas in Python geschrieben - bin ganz frisch und ja, ich habe das Programm selber geschrieben - unter Zuhilfename von Tutorials.
Wobei mein englisch nicht das Beste ist. Hauptberuflich bin ich Industrieelektriker auf dem Weg zur Meisterprüfung - aber ich brauche in meinem Job außer SPS - sonst keine tieferen Programmiererfahrungen.

@noisefloor
Tipp: vergiss' dein Programm für ein paar Tage und lern' die Grundlagen. Z.B. indem du das Python-Tutorial durcharbeitest.
Das kann ich nicht. Ich fress' hier gleich die Tapete von der Wand :cry:
Außerdem hab ich ja mit Tutorial die Probleme.

Ich mach es jetzt nochmal komplett neu - Zeile für Zeile...

Aber bitte gebt mir doch noch folgende Hinweise :? :

- ist das |root = Tk()| ein wrapper zu |root.mainloop()| ?
- das |class App:| ein wrapper zu |app = App(root)| ?
- muss der Fenster-Code von tkinter den gesamten Code umspannen? Das ganze Programm soll ja im Fenster laufen oder...
- sind die Knöpfe aus zu lagern?

Gruß jts
jake-the-snake

Nochmals ich :?

Hab von vorne angefangen mit "Einzeltestlauf nach jeder ergänzten Zeile:

Code: Alles auswählen

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
import sys
import time
import pyudev
import subprocess
import tkinter as Tk

# Byte-Werte aus Terminal-in Variable-Packen
output = subprocess.check_output("lsusb")
# Byte-Werte umwandeln in String-Werte
output = output.decode('utf8')
# String-Werte zur Definition von Variable
usbid = output
# USB-Seriennummern-Vergleich
usbid = usbid.find('054c:019e')
print (usbid)

# Fenster-Titel
root = tk.Tk(className=" Fensterbeschriftung ")

# Einleitung der App-Knoepfe
class App:
      app = App(root)
Ich kann das |class App:| bzw. das |app = App(root) hinschieben, wohin ich will - es geht einfach nicht!
Entweder dieser Fehler: IndentationError: expected an indented block
oder dieser Fehler: NameError: name 'App' is not defined
Ich habs auch mit 4 Einrücker probiert, wie von noisefloor beschrieben - alles für die Katz' !

Verzweifelten Gruß

jts

P.S. Das import tkinter as TK / root = tk.TK(className=" Fensterbeschriftung ") von noisefloor hab ich gemacht.
Jetz habe ich einen Fehler mehr: name 'tk' is not defined...
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

jake-the-snake hat geschrieben:Hauptberuflich bin ich Industrieelektriker auf dem Weg zur Meisterprüfung - aber ich brauche in meinem Job außer SPS - sonst keine tieferen Programmiererfahrungen.
Dann sei dir noch halbwegs verziehen, aber anscheinend musst du da trotzdem jetzt durch.
jake-the-snake hat geschrieben:- ist das |root = Tk()| ein wrapper zu |root.mainloop()| ?
Tk() erzeugt dein Fenster. mainloop() ruft man auf, wenn das GUI-Framework (hier: TKinter) die Kontrolle übernehmen darf. Vor diesem Aufruf sollte der gesamte Ablauf deiner GUI in Programmcode definiert sein.

Bei den anderen Punkten verstehe ich nicht so wirklich, was du meinst...
jake-the-snake

Hallöle
Tk() erzeugt dein Fenster. mainloop() ruft man auf, wenn das GUI-Framework (hier: TKinter) die Kontrolle übernehmen darf. Vor diesem Aufruf sollte der gesamte Ablauf deiner GUI in Programmcode definiert sein.
Beim erzeugen mit Tk() wird das Fenster aber noch nicht sichtbar? Erst durch mainloop() ?

Gruß jts

P.S. Musste das "tkinter as TK / root = tk.TK(className=" Fensterbeschriftung ") von noisefloor" wieder in from tkinter import * umwandeln. das vorherige ergab fehler.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Alle grafischen Elemente werden erst durch den Aufruf von mainloop() tatsächlich sichtbar. Vorher existieren sie sozusagen nur theoretisch. So funktioniert GUI-Programmierung halt.
jake-the-snake hat geschrieben:Musste das "tkinter as TK / root = tk.TK(className=" Fensterbeschriftung ") von noisefloor" wieder in from tkinter import * umwandeln. das vorherige ergab fehler.
Liegt eher daran, dass du nicht wirklich weißt, was du tust, weil du den Import-Mechanismus bzw den Zugriff auf Namensräume noch nicht drauf hast. Aber vielleicht lässt du diese Baustelle erstmal weg. An dem Ergebnis für den Benutzer ändert sich dadurch nichts.

Rein theoretisch solltest du erstmal die Grundlagen von Python lernen. Aber wahrscheinlich hast du Druck durch die Aufgabe und willst fertig werden. Außerdem scheinst du von Python nicht allzu angetan zu sein. Insofern würde ich schon verstehen, wenn du nicht jedes Detail unbedingt optimal ausprogrammieren willst... ^^
Zuletzt geändert von snafu am Mittwoch 8. November 2017, 10:23, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@jake-the-snake: das macht doch so keinen Sinn. Einfach irgendwohin class und app zu schreiben, ohne zu verstehen, was die Zeilen bedeuten führt zu keinem funktionierenden Programm. Wenn Du keine Zeit oder Lust hast, die Grundlagen zu lernen, dann mußt Du Dich zwangsläufig von Deinem Ziel verabschieden und statt dessen etwas Programmieren, das Du noch verstehst, also linearer Programmablauf.

Aber egal was man in welcher Sprache programmiert, immer muß man wissen, was eine logische Einheit ist, und das was bei Python anders ist als bei anderen Sprachen ist halt, dass so eine Einheit nicht per geschweifter Klammer, sondern per Einrückung gekennzeichnet wird. Und dass das 4 Leerzeichen sein sollen, ist wohl auch nicht so schwer zu verstehen.

Nächster Punkt: es wird nach Groß- und Kleinschreibung unterschieden. Statt also alles wieder Rückgängig zu machen, solltest Du verstehen, was der Fehler ist, und den beheben. Was Du mit Wrappern meinst, kann ich auch beim besten Willen nicht verstehen, zumal Du sowohl einen Methodenaufruf als auch eine Klassendefinition als Wrapper bezeichnest.

@snafu: bei Tk wird alles schon beim Erzeugen sichtbar, funktionieren tuts halt erst, wenn `mainloop` aufgerufen wird.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich denke, es geht vorwiegend darum, dass man sich schnell in neuen Sprachen einfinden kann. Dazu sind nicht zwangsläufig umfangreiche Detailkenntnisse nötig, aber man sollte schon allgemeine Grundkenntnisse fürs Programmieren drauf haben, z.B. if-Anweisungen, for-Schleifen, Funktionen und Klassen. Denn das findet sich in vielen Sprachen wieder. Auch muss man mit den Eigenheiten der jeweiligen Sprachen zurechtkommen können, d.h. in Python der Zwang zur Einrückung oder in Java der Zwang zum Gebrauch von Klassen. Oder in C, dass man relativ nahe am Betriebssystem denken muss (also sehr lowlevel). Oder in C++, dass alles sehr komisch ist.
jake-the-snake

Hallo zusammen

Ich bin jetzt soweit, dass mir im Terminal keine Identation-Errors mehr anzeigt (heisst auf gut Deutsch = Einrückfehler)
Code:

Code: Alles auswählen

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
import sys
import time
import pyudev
import subprocess
from tkinter import *

# Byte-Werte aus Terminal-in Variable-Packen
output = subprocess.check_output("lsusb")
# Byte-Werte umwandeln in String-Werte
output = output.decode('utf8')
# String-Werte zur Definition von Variable
usbid = output
# USB-Seriennummern-Vergleich
usbid = usbid.find('054c:019e')
print (usbid)

# Fenster-Titel
root = Tk(className=" Fensterbeschriftung")

def center_window(width=300, height=200):
            
            # get screen width and height
            screen_width = root.winfo_screenwidth()
            screen_height = root.winfo_screenheight()

            # calculate position x and y coordinates
            x = (screen_width/2) - (width/2)
            y = (screen_height/2) - (height/2)
            root.geometry('%dx%d+%d+%d' % (width, height, x, y))

            # Linke Schrift ueber Klartext-Feld 
            oneLabel = Label(root, text="Klartext-Feld", font=("TimesNewRoman", 18))
            oneLabel.place(x=25,y=15)

            # Rechte Schrift ueber Codetext-Feld
            twoLabel = Label(root, text="Codetext-Feld", font=("TimesNewRoman", 18))
            twoLabel.place(x=535,y=15)

            # Linkes Klartextfeld 
            klartextfeld = Text(root, height=20, width=35)
            klartextfeld.place(x=25,y=60)
            klartextfeld.insert(END, "Ihre Nachricht...")

            # Rechtes Codetextfeld 
            codetextfeld = Text(root, height=20, width=35)
            codetextfeld.place(x=425,y=60)
            codetextfeld.insert(END, "Zugehöriger Cryptocode...")

            # USB-Photo-Anzeige-OFF
            photo = PhotoImage(file="usb-logo-off.gif")
            label = Label(image=photo)
            label.image = photo
            label.place(x=330,y=245)

center_window(700, 380)

# Einleitung der App-Knoepfe
class App:
    def __init__(self, master):
        frame = Frame(master)
        frame.place(width=120, height=320, x=288, y=120, border= "outside")
        # Code-Botton
        self.codeing = Button(frame, 
        text="Verschlüsseln ►", fg="red", pady=5, padx=5,
        command=self.write_codeing)
        self.codeing.pack()
        # Decode-Botton    
        self.decoding = Button(frame,
        text="◄ Entschlüsseln", fg="green", pady=5, padx=5,
        command=self.write_decoding)
        self.decoding.pack()
        # Export-Botton
        self.savetousb = Button(frame,
        text="USB  - Export ▼", fg="black", pady=5, padx=5,
        command=self.write_savetousb)
        self.savetousb.pack()
        # Import-Botton
        self.loadfromusb = Button(frame,
        text="USB  - Import ▲", fg="black", pady=5, padx=5,
        command=self.write_loadfromusb)
        self.loadfromusb.pack()
        ####################
        # Codierungs-Block #
        ####################
        def write_codeing(self):
            print ("Verschlüsselung wird ausgeführt")
        ######################
        # Decodierungs-Block #
        ######################
        def write_decoding(self):
            print ("Entschlüsselung wird ausgeführt")
        ####################
        # USB-Export-Block #
        ####################
        def write_savetousb(self):
            print ("Schreibe Daten auf USB")
            os.system('clear')
        ####################
        # USB-Import-Block #
        ####################
        def write_loadfromusb(self):
            print ("Lese Daten von USB")
            os.system('clear')
            # Knoepfe-App-Ende
        app = App(root)



root.mainloop()
Ich habe jetzt eine Spange bestehend aus |def center_window bis |center_window|, sowie
eine |class App:| bis |app = App(root)| Spange, in der die Knöpfe sind.

Könnt ihr mir bitte Hilfestellung geben, wie ich die Knöpfe wieder in das Fenster bekomme?
Weil das Fenster funktioniert jetzt wieder. :D

Gruß jts
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

in der offiziellen Python-Doku ist ein IMHO sehr gutes und sauberes Beispiel, wie man ein Python Programm mit Tkinter deiner Größenordnung aufbaut: https://docs.python.org/3/library/tkint ... ld-program
Daran solltest du dich orientieren.

Dein Hauptproblem: Die ziehst es vor zu Raten bzw. wilde Trial & Error Versuche zu machen, statt dir die Zeit zu nehmen, die Grundlagen einmal ordernlich zu lernen. Vielleicht kommt dann irgendwann mal zufällig ein lauffähiges Programm raus, aber auf lange Sicht wirst du mit diesem Vorgehen scheitern.

Zweiter Punkt: GUI-Programmierung erfordert und Python ein Grundverständnis der Objektorientierung von Python und wie man Klassen, deren Instantzen, deren Methoden und deren Attribute richtig nutzt. Bei der Größenordnung Programm, die du schreiben möchtest, macht man das nämlich so - und so ist auch das Beispiel in der Python-Doku aufgebaut. Wenn du das nicht verstanden hast, kann da eigentlich nie ein brauchbares Programm bei raus kommen...

Zum Code: die Einrückungen stimmen so nicht bzw. das ist sicher nicht das, was du willst. Wie gezeeigt wären die Methoden `write...` Untermethoden von `__init__()`. In der `__init__()` Methode steht IMHO zu viel Code, den man besser in eine eigene Methode auslagert - siehe Beispiel in der Python-Doku.
Alles, was in `center_window` steht, sollte in die `App` Klasse. Das `app = App(root)` in der `App` Klasse steht ist falsch.

Gruß, noisefloor
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@jake-the-snake:
Das sieht alles noch sehr planlos und hingemurkst aus. Code wird auf den verschiedensten Ebenen ausgeführt und man hat das Gefühl, dass es für dich einfach nur laufen soll. So funktioniert Programmieren, welches über ein kurzes 5-Zeilen-Skript hinausgeht, leider nicht. Du solltest dir schon Gedanken über den Sinn von Klassen und Funktionen machen und wie du entsprechend logisch sinnvoll dein Programm danach gliedern kannst. Für deine Master-Arbeit brauchst du ja auch eine Einteilung in Kapitel und Unterkapitel. Geh doch mal nach diesem Schema an die Programmieraufgabe ran...

EDIT:
Ersetze Master-Arbeit durch Meister-Prüfung. Ich hatte im Hinterkopf, dass du studieren würdest. Aber ich denke, du weißt was ich meine.
jake-the-snake

Aaaahhhhhhhhhrrrrrgggggg - <- Könnt ihr die Schmerzen in meinem Kopf hören? :lol:

Puuuhhh - ganz ruhig -wird schon werden...

button .fred -fg red -text "hi there"
^ ^ \______________________/
| | |
class new options
command widget (-opt val -opt val ...)

Classe ist das vor dem Punkt. Hier jetzt ein Kommando mit Befehl->Mach Knöpfe?
widget ist die Hilfsfunktion (nennt man das nicht API), welches dem oberen eingebundenen Modul (durch "import Modul") bekannt sein muss?
optionen-> Müssten Parameter sein, die optional Werte mit liefern/angeben?

Das ist alles ganz, ganz abstrakte Sch**** - Kein vernünftiges Beispiel - dann auch noch in englisch - was die Sache natürlich vereinfacht ...

In ein Tutorial gehört eine Ausgangsproblemstellung
Dann der Lösungscode
Dann eine Zeile für Zeile Erklärung, was wo passiert
Eine Anzeige der Ausgabe

Alles andere ist "jbdsjkabachk gacghgghk jklö agjkl jl"...

Ich geh mir einen Kaffee holen
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

ohne englisch kommst du nicht weit - weder bei Python noch bei anderen Programmiersprachen. Die Dokumentation von Python und so gut wie allen Python-Modulen ist nun mal in Englisch.

Und nochmal: ohne die Objektorientierung von Python verstanden zu haben wirst du nie nie nie nie nie eine vernünfitge GUI programmieren können. Weder mit Tkinter noch mit Qt noch mit GTK noch mit Kivy. Da würde auch kein noch so gutes Tutorial helfen. Weil stumpf abtippen ohne zu verstehen, was da über abläuft bringt halt auch nichts.
Ich geh mir einen Kaffee holen
...und dann mal ganz in Ruhe das offizielle Python-Tutorial lesen (und auf keinen Fall python-kurs.eu oder so was).

Gruß, noisefloor
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich weiß nicht was du da rausgesucht hat, aber es sieht nach TCL/TK aus. Der originalen Sprache von Tkinter, mit der man aber nix zu tun hat. Du wirst nicht glücklich werden, wenn du auch noch in den falschen Ecken rumtreibst.
jake-the-snake

Hallo Leute...

Also das Grundgerüst des Programmes steht - und was noch viel besser ist - es hat Basis-Funktionalität:

Code: Alles auswählen

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

###################################
#   ----------------------------- #
###################################
# Programmed by : --------------- #
###################################
# Development started in: ------- #
###################################
# Successful finished in: ------- #
###################################

import os
import sys
import time
import pyudev
import subprocess
from tkinter import *

# Byte-Werte aus Terminal-in Variable-Packen
output = subprocess.check_output("lsusb")
# Byte-Werte umwandeln in String-Werte
output = output.decode('utf8')
# String-Werte zur Definition von Variable
usbid = output
# USB-Seriennummern-Vergleich
usbid = usbid.find('054c:019e')
print (usbid)

# Einleitung der App-Knoepfe
class App:
  
  def __init__(self, master):
    frame = Frame(master)
    frame.place(width=120, height=320, x=288, y=120, border= "outside")
    
    # Code-Button
    self.codeing = Button(frame, 
                         text="Verschlüsseln ►", fg="red", pady=5, padx=5,
                         command=self.write_codeing)
    self.codeing.pack()

    # Decode-Button    
    self.decoding = Button(frame,
                         text="◄ Entschlüsseln", fg="green", pady=5, padx=5,
                         command=self.write_decoding)
    self.decoding.pack()

    # Export-Button
    self.savetousb = Button(frame,
                         text="USB  - Export ▼", fg="black", pady=5, padx=5,
                         command=self.write_savetousb)
    self.savetousb.pack()

    # Import-Button
    self.loadfromusb = Button(frame,
                         text="USB  - Import ▲", fg="black", pady=5, padx=5,
                         command=self.write_loadfromusb)
    self.loadfromusb.pack()

####################
# Codierungs-Block #
####################

  def write_codeing(self):
    print ("Verschlüsselung wird ausgeführt")
  
######################
# Decodierungs-Block #
######################

  def write_decoding(self):
    print ("Entschlüsselung wird ausgeführt")

####################
# USB-Export-Block #
####################

  def write_savetousb(self):
    print ("Schreibe Daten auf USB")

####################
# USB-Import-Block #
####################

  def write_loadfromusb(self):
    print ("Lese Daten von USB")

# Fenster-Titel
root = Tk(className=" ------ - ---- - ----                                                                                                  (--------)")

# Knoepfe-App-Ende
app = App(root)

def center_window(width=300, height=200):
    # get screen width and height
    screen_width = root.winfo_screenwidth()
    screen_height = root.winfo_screenheight()

    # calculate position x and y coordinates
    x = (screen_width/2) - (width/2)
    y = (screen_height/2) - (height/2)
    root.geometry('%dx%d+%d+%d' % (width, height, x, y))

center_window(700, 380)

# Linke Schrift ueber Klartext-Feld 
oneLabel = Label(root, text="Klartext-Feld", font=("TimesNewRoman", 18))
oneLabel.place(x=25,y=15)

# Rechte Schrift ueber Codetext-Feld
twoLabel = Label(root, text="Codetext-Feld", font=("TimesNewRoman", 18))
twoLabel.place(x=535,y=15)

# Linkes Klartextfeld 
klartextfeld = Text(root, height=20, width=35)
klartextfeld.place(x=25,y=60)
klartextfeld.insert(END, "Ihre Nachricht...")

# Rechtes Codetextfeld 
codetextfeld = Text(root, height=20, width=35)
codetextfeld.place(x=425,y=60)
codetextfeld.insert(END, "Zugehöriger Cryptocode...")

if usbid == 123:
    # USB-Photo-Anzeige ON
    photo = PhotoImage(file="usb-logo-on.gif")
    label = Label(image=photo)
    label.image = photo
    label.place(x=330,y=245)

if usbid == -1:
    # USB-Photo-Anzeige OFF
    photo = PhotoImage(file="usb-logo-off.gif")
    label = Label(image=photo)
    label.image = photo
    label.place(x=330,y=245)

root.mainloop()



Ich hatte noch eine weniger weit entwickelte Vorgängerversion als Backup gefunden. Diese habe ich erneut ergänzt. Aber diesmal mit Samthandschuh! Komischer weise ist bei dieser lauffähigen Version nichts mit 4er Einrückungen - und trotzdem kann das Programm ausgeführt werden.

Naja, woran das nun gelegen hat, weiss ich nicht, aber es läuft wieder - endlich! :D

Gruß jts

Ich hätte gerne noch die zwei USB-Logos als img angehängt, damit ihr das mal gesehen hättet.
Je nachdem, ob bei Programmstart der korrekte USB-Stick eingesteckt ist, wechselt das USB-Stick-Bildchen die Schrift von Off zu On - und eine LED leuchtet - oder geht eben aus.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@jake-the-snake: Python ist es an sich egal, wie eingerückt wird, solang es eindeutig ist. Für den menschlichen Leser ist aber alles andere als 4 Leerzeichen pro Ebene unübersichtlich und fehleranfällig.
Antworten