Bestimmt Reihenfolge von Zahlen, die eine Datei öffnen.

Fragen zu Tkinter.
Antworten
klaslas
User
Beiträge: 40
Registriert: Samstag 9. Juli 2011, 15:57

Bei diesen Beispiel:

Code: Alles auswählen

import sys, Tkinter

def ende():
    sys.exit(0)

def kev(e):
    lbanz["text"] = "Zeichen:" + e.char \
       + ", Beschreibung: " + e.keysym \
       + ", Codezahl: " + str(e.keycode)

main = Tkinter.Tk()

# Key-Events
e = Tkinter.Entry(main)
e.bind("<p>",kev)
e.bind("<+>",kev)
e.bind("<%>",kev)
e.bind("<,>",kev)
e.pack()

# Hilfe-Label
lbhlp = Tkinter.Label(main,
        text = "Taste: p oder + oder % oder ,",
        width=40)
lbhlp.pack()

# Anzeigelabel
lbanz = Tkinter.Label(main)
lbanz.pack()

# Ende-Button
bende = Tkinter.Button(main, text = "Ende",
                       command = ende)
bende.pack()

main.mainloop()

Wie kann man es jetzt hinbekommen, dass wenn man diese Zeichen in einer bestimmten Reihenfolge eingibt, ein Programm geöffnet wird?
Das Öffnen mache ich mit startfile().
Beispielsweise: if er p% eingibt, dass die Datei geöffnet wird,
else Falscher Code wird angezeigt.
Mir geht es nur darum, wie ich dass mit dieser Reihenfolge hinbekomm?!:P

Gruß Klaslas
deets

Fuer Dinge mit Reihenfolgen sind Listen die richtige Datenstruktur. Du musst also

- deine Tastendrueck in einer Liste speichern. Bei deinem simplen Code reicht dafuer eine globale Variable
- wenn ein Tastendruck gekommen ist, speicher, und dann die letzten n Eintraege mit dem gewuenschten Ergebnis vergleichen

Code: Alles auswählen


test = [1, 2, 3, 4]

if test[-3:] == [4, 5, 6]: # stimmt nicht..
   ...
- wenn es stimmt, dann machst du dein startfile
- als Bonus-Frage: welche Eintraege in der Liste kannst du loeschen, wenn ein Tastendruck falsch war?
BlackJack

@klaslas: Du müsstest Dir halt jeden Tastendruck merken und jedesmal testen ob die Reihenfolge komplett ist, und dann das Programm starten. Falls die Reihenfolge noch nicht komplett ist und auch nicht mehr komplett werden kann, weil eine falsche Taste gedrückt wurde, dann kannst Du die Fehlermeldung ausgeben.

Die Namen sind übrigens nicht so toll. Man sollte auf kryptische Abkürzungen verzichten und die Bedeutungen besser ausschreiben. Dann kann man sich auch den einen oder anderen Kommentar sparen. Wenn `lbhlp` zum Beispiel `help_label` hiesse, bräuchte man den Kommentar dass es sich um ein Hilfe-Label handelt nicht mehr hinschreiben.
klaslas
User
Beiträge: 40
Registriert: Samstag 9. Juli 2011, 15:57

Was ist falsch, wie gesagt bin Anfänger.

Code: Alles auswählen

import sys, Tkinter, os

def ende():
    sys.exit(0)

def kev(e):
    lbanz["text"] = "Zeichen:" + e.char \
       + ", Beschreibung: " + e.keysym \
       + ", Codezahl: " + str(e.keycode)

main = Tkinter.Tk()

# Key-Events
e = Tkinter.Entry(main)
e.bind("<+>",kev)
e.bind("<->",kev)
e.bind("<#>",kev)
e.bind("<,>",kev)
e.pack()

# Hilfe-Label
lbhlp = Tkinter.Label(main,
        text = "Taste: < oder , oder . oder +",
        width=40)
lbhlp.pack()

# Anzeigelabel
lbanz = Tkinter.Label(main)
lbanz.pack()

# Ende-Button
bende = Tkinter.Button(main, text = "Ende",
                       command = ende)
bende.pack()

main.mainloop()
x= input()
passwort= e.bind("<+>",kev)
if x == passwort:
    os.startfile('C:\Unbekannt1.ods')
deets

Das du Anfaenger bist wissen wir inzwischen...

Was falsch ist, ist ganz einfach: du hast keine der Anregungen von BlackJack & mir aufgegriffen.

e.bind() ist kein Funktionsaufruf, der dir magisch zurueckgibt, was du willst.

Du bekommst events fuer jeden Tastendruck. Deine erste Aufgabe besteht darin, diese Events zu speichern, in einer Liste. Mach das doch mal.
klaslas
User
Beiträge: 40
Registriert: Samstag 9. Juli 2011, 15:57

Code: Alles auswählen

import sys, Tkinter, os

def ende():
    sys.exit(0)

def kev(e):
    lbanz["text"] = "Zeichen:" + e.char \
       + ", Beschreibung: " + e.keysym \
       + ", Codezahl: " + str(e.keycode)

main = Tkinter.Tk()

# Key-Events
e = Tkinter.Entry(main)
e.bind("<p>",kev)
e.bind("<+>",kev)
e.bind("<%>",kev)
e.bind("<,>",kev)
e.pack()

# Hilfe-Label
lbhlp = Tkinter.Label(main,
        text = "Taste: p oder + oder % oder ,",
        width=40)
lbhlp.pack()

# Anzeigelabel
lbanz = Tkinter.Label(main)
lbanz.pack()

# Ende-Button
bende = Tkinter.Button(main, text = "Ende",
                       command = ende)
bende.pack()

x= input()
passwort= ["p","+","%",","]
if x == passwort:
    os.startfile('C:\Unbekannt1.ods')

main.mainloop()
Und jetzt ?
Es funktioniert immer noch nicht.
Gruß Klaslas
BlackJack

@klaslas: Ich denke Dir fehlen noch Grundlagen bevor Du Dich an GUI-Programmierung heran wagen kannst. Mal die GUI komplett aussen vor gelassen, denn Du verwendest ja dann doch plötzlich `input()` statt der GUI, sollte Dir erst einmal klar werden warum die vier Quelltextzeilen vor dem ``main.mainloop()`` ”nicht funktionieren”. Das ist jetzt in Anführunsstrichen, weil mit der passenden Eingabe tatsächlich `os.startfile()` ausgeführt wird. Entweder solltest Du herausfinden was die passende Eingabe dafür ist, und warum — oder Du solltest Dir klar machen warum bei einer falschen Eingabe entweder eine Fehlermeldung kommt, oder der Vergleich nicht „wahr” ergibt.

Apropos Fehlermeldung: Wenn Du eine bekommst, ist die viel hilfreicher als einfach nur zu schreiben dass es immer noch nicht funktioniert.
klaslas
User
Beiträge: 40
Registriert: Samstag 9. Juli 2011, 15:57

Wo kann man GUI denn lernen, damit ich die Grundlagen besitze. Dieses Beispiel hab ich auch aus einem Buch, nämlich "Einstieg in Python 3". Eine Frage nebenbei, ist dieses Buch gut, oder nicht? Sollte ich direkt mit Python 3 anfangen, oder 2.6?
:P
Gruß Klaslas
deets

Du solltest erstmal gar nicht mit GUI anfangen. Sondern mit so simplen Dingen wie Schleifen, Eingabe ueber die Tastatur und solchen Sachen. Und zu wiederholten male: es gibt nicht die magische Stelle im Internet, die man sich mal ne halbe Stunde durchliest, und dann "kann man GUI/Spiele-Programmieren".
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi klaslas

Kannst du einmal kontrollieren ob das folgende Skript deinen Anforderungen entspricht?:

Code: Alles auswählen

import sys, Tkinter, os
from string import printable

PASS_WORD =  ['+', '-', '#', ',']
ALLOWABLE_CHARS = list(printable)

def ende():
    sys.exit(0)

def key(event):
    #print list(printable)
    #print event.char, event.keysym, event.keysym_num, event.num
    
    if event.char in ALLOWABLE_CHARS:
        print event.char
        if event.char == PASS_WORD[main.char_count]:
            # Das Zeichen ist in der richtigen Reihenfolge
            main.char_count += 1
            if main.char_count == len(PASS_WORD):
                #~~ Alle Zeichen wurden in der richtigen Reihenfolge eingegeben!
                info_label.config(text="Super!\nDein Programm kann starten",
                    font=('helvetica',20, 'bold'), foreground='darkolivegreen')
                
                main.char_count = 0

        else:
            main.char_count = 0
            info_lbl_text = "Zeichen: " + event.char + '\n' + "Beschreibung: "+\
                event.keysym + '\n' + "Codezahl: " + str(event.keycode)
                
            info_label.config(text=info_lbl_text)          

    print main.char_count
    
main = Tkinter.Tk()
main.title('Zeichereihenfolge')

main.char_count = 0

# Key-Events
char_entry = Tkinter.Entry(main, bd=2, bg='white', font=('helvetica',12),
    highlightthickness=0)
char_entry.pack(pady=4)
char_entry.bind('<Key>', key)

# Hilfe-Label
help_label = Tkinter.Label(main, text = "Tasten: + - # , ", width=40,
    font=('helvetica',12), fg='steelblue')
help_label.pack(padx=5, pady=5)

# Anzeigelabel
info_label = Tkinter.Label(main)
info_label.pack(padx=5, pady=5)

# Ende-Button
end_button = Tkinter.Button(main, text = "Ende", command = ende)
end_button.pack(pady=4)

# Setze den Fokus auf das Eingabefeld
char_entry.focus_set()

main.mainloop()
Gruß wuf :wink:
Take it easy Mates!
klaslas
User
Beiträge: 40
Registriert: Samstag 9. Juli 2011, 15:57

Danke das entspricht genau meinen Vorstellungen wuf:P!
Jetzt hätte ich mal noch eine Frage. Könnte man es denn auch so machen, dass wenn man auf die Openoffice-Datei klickt, die geöffnet werden soll durch ein Passwort, dass dann das Passworteingabefeld erscheint und nicht erst nachdem man auf die Python-Datei geht und dort auf "run" klickt? :D
Gruß Klaslas
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi klaslas

Das ist ein wenig komplizierter. Aber für OpenOffice-Dokumente brauchst du kein Python Passwort-Programm mehr da sich OO-Dokumente aus der OO-Umgebung schon mit einem Kennwort abspeichern lassen. Wenn du dann ein solches Dokument mit Klick bzw. Doppelklick offnest dann starte OO mit einem nachfolgenden Kennwort-Eingabedialog. Ich nehme an du wusstest dies noch nicht. Probier es doch einfach mal aus.

Gruß wuf :wink:
Take it easy Mates!
klaslas
User
Beiträge: 40
Registriert: Samstag 9. Juli 2011, 15:57

Achso ;). Ne, das wusste ich wirklich nicht.
Aber nur mal so, wenn man eine Datei öffnet, wie bekommt man es hin, dass sich dann ein tkinter Fenster automatisch öffnet. Wie programmiert man dies?:P
Gruß Klaslas
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Kann ich dir leider nicht genau sagen da ich es noch nie gemacht habe. Bei einer OO-Datei ist vermutlich in Bezug auf ihre Dateiendung z.B '.odt' (OO-Text-Dokument) das OO als Startprogramm zugewiesen. Änderst du diese Zuweisung dann würde beim öffnen einer Datei mit der Endung '.odt' automatisch das von dir neu zugewiesene Programm gestartet. Eventuell müsste die Datei mit einer neuen Endung versehen werden. In unserem Forum gibt es sicher Leute die es dir besser erklären können.

Gruß wuf :wink:
Take it easy Mates!
klaslas
User
Beiträge: 40
Registriert: Samstag 9. Juli 2011, 15:57

Okay, dann geht die Frage jetzt an alle!
Wie funktioniert das?:?(in den obigen genannten Kommentaren beschrieben)??
Gruß Klaslas
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

klaslas hat geschrieben:Okay, dann geht die Frage jetzt an alle!
Wie funktioniert das?:?(in den obigen genannten Kommentaren beschrieben)??
Gruß Klaslas
Ich würde mal sagen gar nicht. Du kannst natürlich ein bestimmtes Programm einer Dateiendung zuordnen und dann eine Art Proxy-Programm eingerichtet haben, in welchem Du dann erst nach einer Passwortabfrage das Dokument in OO öffnest. Wie man das unter Windows einrichtet weiß ich nicht; das sollte sich aber per google leicht rausfinden lassen. Unter Linux hängt das von der DE ab und bei MacOS hab ich gar keine Ahnung. Insofern wird Deine Lösung erst nach einer mehr oder minder aufwendigen Konfiguration laufen.

Aber mal im Ernst: Was bringt Dir das? Ein Benutzer kann das Verhalten ja einfach Umgehen, indem er auf "Öffnen mit" klickt oder das Dokument aus OO heraus läd. Einen Schutz stellt das also nicht dar.

@all: Wird ein OO-Dokument mit PW-Schutz eigentlich verschlüsselt? Wenn nein, kann man das ja mit einfachsten Mitteln aushebeln? Wenn ja: Nach welcher Methode?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@Hyperion: Da steht natürlich nicht einfach nur ein Flag in der Datei was sagt „Finger weg”. Der Inhalt der XML-Dateien im Archiv ist mit dem Blowfish-Algorithmus verschlüsselt.
Antworten