MAC-Adessen Format Wandler

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@DerT: in der ersten Zeile der Funktion erzeugst Du einen neuen Frame. Der alte kann also komplett gelöscht werden.
DerT
User
Beiträge: 8
Registriert: Dienstag 10. Januar 2017, 15:58

Hallo,
Sirius3 hat geschrieben:@DerT: in der ersten Zeile der Funktion erzeugst Du einen neuen Frame. Der alte kann also komplett gelöscht werden.
Ja aber wenn ich den Frame mit destroy() zerstöre bekomme ich beim ersten durchlauf einen "NameError:" da der Frame ja noch nicht definiert ist.


Dieses Problem könnte/konnte ich lösen mit einem.

Code: Alles auswählen

    try:
        results_frame.destroy()
    except NameError:
        [...]
Aber ich möchte ebenfalls einen Clear Burron einbauen. Welchen command muss ich diesem geben?



Anbei mal mein "neues" Programm. (Ohne "frame.destroy()" ) Ich habe versucht alle Tipps zu berückstichtigen.

Code: Alles auswählen

import os
import tkinter as tk
from string import hexdigits

def cleanmac(inputmac):
    cleanmac=inputmac.upper()
    clean=[":", " ", "-"]
    for i in clean:
        cleanmac=cleanmac.replace(i, "")
    return cleanmac
	
def check_mac_length(inputmac):
    return len(inputmac) == 12

def check_allowed_characters(inputmac): 	
    return all(digit in hexdigits for digit in inputmac)					

def format_mac(inputmac, inputcharacter):
    formatmac=""
    for i in range(0,12,2):
        formatmac += inputmac[i:i+2] + inputcharacter
    formatmac=formatmac[:-1]
    return formatmac
	
def add_to_clipboard(text, parent):					
    parent.clipboard_clear()	
    return parent.clipboard_append(text)

def getclipboard(parent):
    getclip = ""
    getclip = parent.clipboard_get()
    if len(getclip) < 20:
        return getclip
    else:
        return ""
    
def check_and_format_mac(inputmac, parent):
    results_frame = tk.Frame(parent, width=430, height=90)
    errors = []
    mac = []
    delimeter = [":", "-"]
    clean = cleanmac(inputmac)
    from_above = 10
    if not check_mac_length(clean):
    	errors.append("Zeichenanzahl ungültig")
    if not check_allowed_characters(clean):
        errors.append("Ungültiges Zeichen")

    if errors:
        errors.insert(0, "Eingabe Prüfen")
        for line in errors:
            tk.Label(results_frame, font= "Verdana 10 bold", text=line, justify=tk.CENTER, width=20).place(x=120, y=from_above, width=170, height=20)
            from_above += 20
        
    else:
        print(inputmac)
        mac.append(clean)
        for i in delimeter:
            mac.append(format_mac(clean, i))
        for row, line in enumerate(mac):
            tk.Label(results_frame,  font= "Verdana 10 ", text=line, justify=tk.CENTER).place(x=120, y=from_above, width=170, height=20)
            from_above += 25
            
        tk.Button(results_frame, font= "Verdana 10 ", text="copy", command=lambda: add_to_clipboard(mac[0], parent), width=10).place(x=320, y=10, width=100, height=20) 
        tk.Button(results_frame, font= "Verdana 10 ", text="copy", command=lambda: add_to_clipboard(mac[1], parent), width=10).place(x=320, y=35, width=100, height=20)
        tk.Button(results_frame, font= "Verdana 10 ", text="copy", command=lambda: add_to_clipboard(mac[2], parent), width=10).place(x=320, y=60, width=100, height=20)

        #for row, line in enumerate(mac):
            #tk.Button(results_frame, text="copy", command=lambda: add_to_clipboard(str(line), parent)).place(x=120, y=from_above, width=170, height=20)
            #from_above += 25

    return results_frame

def main():
    master = tk.Tk()
    master.title = "MAC Zauberer"
    master.resizable(width=0, height=0)
    master.bind("<Return>",lambda eff:check_and_format_mac(eingabefeld.get(), master).grid(row=1, column=0))

    entry_frame = tk.Frame(master, width=430, height=70)
    entry_frame.grid(row=0)
    
    eingabe_label = tk.Label(entry_frame, font= "Verdana 10 bold", text="Eingabe:")
    eingabe_label.place(x=30, y=40, width=60, height=20)

    eingabefeld  = tk.Entry(entry_frame, justify=tk.CENTER, font= "Verdana 10 ")
    eingabefeld.place(x=120, y=40, width=170, height=20)
    eingabefeld.insert(0,getclipboard(master))

    clear_button = tk.Button(entry_frame, font= "Verdana 10 ", text= "Clear",)
    clear_button.place(x=320, y=10, width=100, height=20)

    start_button = tk.Button(entry_frame,  font= "Verdana 10 ", width=10, text= "Start", command= lambda: check_and_format_mac(eingabefeld.get(), master).grid(row=1, column=0))
    start_button.place(x=320, y=40, width=100, height=20)
	
	
if __name__ == "__main__": main()
BlackJack

@DerT: `NameError` sollte man nicht behandeln. Das ist ein Programmierfehler der zur Laufzeit gar nicht auftreten sollte. Falls er Auftritt sollte man das Programm so ändern das er nicht auftreten kann.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@DerT: "format_mac" könnte man mit .join schreiben

Code: Alles auswählen

def format_mac(inputmac, inputcharacter=":"):
    return inputcharacter.join(inputmac[i:i+2] for i in range(0,12,2))
Der Rückgabewert von add_to_clipboard ist wenig sinnvoll. getclip wird unnötigerweise an eine leere Zeichenkette gebunden. mac und delimiter werden definiert, lange bevor sie verwendet werden. place sollte man nicht verwenden. Die Copy-Buttons kann man innerhalb der Schleife erzeugen, wenn man partial statt lambda verwendet.

Solange kein results_frame existiert weist man ihm den Wert None zu, so dass eine einfache Abfrage "result_frame is not None" statt des NameErrors ausreicht. Dann brauchst Du aber eine Klasse, um diesen Wert irgendwo speichern zu können.
DerT
User
Beiträge: 8
Registriert: Dienstag 10. Januar 2017, 15:58

Hallo,

versuche mich gerade daran eine Klasse zu erstellen.
Keine Ahnung ob es so überhaupt Sinn macht.
Ich wollte eine Klasse "gui" erstellen die z.B. die methoden "create_frame" und "destroy_frame" hat.
Funktioniert auch soweit. Nur "destroy_frame" zerstört den Frame nicht.

Code: Alles auswählen

class gui:

    def __init__ (self, master):
        self.master = master
        master.title("Das ist ein GUI")


    def create_frame(self):
        self.frame = tk.Frame(self.master)
        self.label = tk.Label(self.master, text="Hallo aus create_frame") 
        self.frame.pack()
        self.label.pack()
        
    
    def destroy_frame(self):
        self.frame.destroy()
        print("destroy_frame")
Nerv ich euch langsam? :?: :lol: :D

Gruß
T
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@DerT: woran merkst Du, dass der Frame nicht entfernt wird? Bei 0 Pixel großen Frames kann man sowas leicht mal übersehen.
DerT
User
Beiträge: 8
Registriert: Dienstag 10. Januar 2017, 15:58

Ich nehme alles zurück :)
Tut mir leid hab meinen Fehler gesehen und korrigiert.
Sirius3 hat geschrieben:@DerT: woran merkst Du, dass der Frame nicht entfernt wird? Bei 0 Pixel großen Frames kann man sowas leicht mal übersehen.

Code: Alles auswählen

class gui:

    def __init__ (self, master):
        self.master = master
        master.title("Das ist ein GUI")


    def create_frame(self):
        self.frame = tk.Frame(self.master)
        self.label = tk.Label(self.frame, text="Hallo aus create_frame") 
        self.frame.pack()
        self.label.pack()
        
    
    def destroy_frame(self):
        self.frame.destroy()
        print("destroy_frame")

Macht eine klasse "gui" sinn?
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@DerT: das kommt drauf an, wie Du sie implementierst.
Antworten