2016-07-29 26 views
0

Ich brauche Hilfe. Ich entwickelte eine Schnittstelle mit tkinter. an einem Punkt, wenn ich eine Schaltfläche in das Fenster einfügen, funktioniert es nicht wie es soll ... in der Tat, funktioniert nicht. Ich gebe mir diese Fehlermeldung, wenn ich die Taste drücken:Python 3 (.5.2) Tkinter

File  "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/tkinter/__init__.py", line 1550, in __call__ 
return self.func(*args) 
    File "/Users/Edoardo/Desktop/Progetti/Programming Projects/Python Projects/Encoder 1.0 alpha.py", line 277, in <lambda> 
encode = Button(text="ENCODE", command=lambda: encode()) 
TypeError: 'Button' object is not callable 

Dies ist der Code (einige Teile Ursache fehlt, bevor das gesamte Programm schreiben, möchte ich sicherstellen, dass es funktioniert):

from tkinter import * 
import tkinter.messagebox 

# encode = {char : code} 
utf8int = { 
    "!": "\\33", 
    "\"": "\\34", 
    "#": "\\35", 
    "$": "\\36", 
    "%": "\\37", 
    "&": "\\38", 
    "'": "\\39", 
    "(": "\\40", 
    ")": "\\41", 
    "*": "\\42", 
    "+": "\\43", 
    ",": "\\44", 
    "-": "\\45", 
    ".": "\\46", 
    "/": "\\47", 
    "0": "\\48", 
    "1": "\\49", 
    "2": "\\50", 
    "3": "\\51", 
    "4": "\\52", 
    "5": "\\53", 
    "6": "\\54", 
    "7": "\\55", 
    "8": "\\56", 
    "9": "\\57", 
    ":": "\\58", 
    ";": "\\59", 
    "<": "\\60", 
    "=": "\\61", 
    ">": "\\62", 
    "?": "\\63", 
    "@": "\\64", 
    "A": "\\65", 
    "B": "\\66", 
    "C": "\\67", 
    "D": "\\68", 
    "E": "\\69", 
    "F": "\\70", 
    "G": "\\71", 
    "H": "\\72", 
    "I": "\\73", 
    "J": "\\74", 
    "K": "\\75", 
    "L": "\\76", 
    "M": "\\77", 
    "N": "\\78", 
    "O": "\\79", 
    "P": "\\80", 
    "Q": "\\81", 
    "R": "\\82", 
    "S": "\\83", 
    "T": "\\84", 
    "U": "\\85", 
    "V": "\\86", 
    "W": "\\87", 
    "X": "\\88", 
    "Y": "\\89", 
    "Z": "\\90", 
    "[": "\\91", 
    "\\": "\\92", 
    "]": "\\93", 
    "^": "\\94", 
    "_": "\\95", 
    "`": "\\96", 
    "a": "\\97", 
    "b": "\\98", 
    "c": "\\99", 
    "d": "\\100", 
    "e": "\\101", 
    "f": "\\102", 
    "g": "\\103", 
    "h": "\\104", 
    "i": "\\105", 
    "j": "\\106", 
    "k": "\\107", 
    "l": "\\108", 
    "m": "\\109", 
    "n": "\\110", 
    "o": "\\111", 
    "p": "\\112", 
    "q": "\\113", 
    "r": "\\114", 
    "s": "\\115", 
    "t": "\\116", 
    "u": "\\117", 
    "v": "\\118", 
    "w": "\\119", 
    "x": "\\120", 
    "y": "\\121", 
    "z": "\\122", 
    "{": "\\123", 
    "|": "\\124", 
    "}": "\\125", 
    "~": "\\126", 
    "€": "\\128", 
    "‚": "\\130", 
    "ƒ": "\\131", 
    "„": "\\132", 
    "…": "\\133", 
    "†": "\\134", 
    "‡": "\\135", 
    "ˆ": "\\136", 
    "‰": "\\137", 
    "Š": "\\138", 
    "‹": "\\139", 
    "Œ": "\\140", 
    "Ž": "\\142", 
    "‘": "\\145", 
    "’": "\\146", 
    "“": "\\147", 
    "”": "\\148", 
    "•": "\\149", 
    "–": "\\150", 
    "—": "\\151", 
    "˜": "\\152", 
    "™": "\\153", 
    "š": "\\154", 
    "›": "\\155", 
    "œ": "\\156", 
    "ž": "\\158", 
    "Ÿ": "\\159", 
    "¡": "\\161", 
    "¢": "\\162", 
    "£": "\\163", 
    "¤": "\\164", 
    "¥": "\\165", 
    "¦": "\\166", 
    "§": "\\167", 
    "¨": "\\168", 
    "©": "\\169", 
    "ª": "\\170", 
    "«": "\\171", 
    "¬": "\\172", 
    "®": "\\174", 
    "¯": "\\175", 
    "°": "\\176", 
    "±": "\\177", 
    "²": "\\178", 
    "³": "\\179", 
    "´": "\\180", 
    "µ": "\\181", 
    "¶": "\\182", 
    "·": "\\183", 
    "¸": "\\184", 
    "¹": "\\185", 
    "º": "\\186", 
    "»": "\\187", 
    "¼": "\\188", 
    "½": "\\189", 
    "¾": "\\190", 
    "¿": "\\191", 
    "À": "\\192", 
    "Á": "\\193", 
    "Â": "\\194", 
    "Ã": "\\195", 
    "Ä": "\\196", 
    "Å": "\\197", 
    "Æ": "\\198", 
    "Ç": "\\199", 
    "È": "\\200", 
    "É": "\\201", 
    "Ê": "\\202", 
    "Ë": "\\203", 
    "Ì": "\\204", 
    "Í": "\\205", 
    "Î": "\\206", 
    "Ï": "\\207", 
    "Ð": "\\208", 
    "Ñ": "\\209", 
    "Ò": "\\210", 
    "Ó": "\\211", 
    "Ô": "\\212", 
    "Õ": "\\213", 
    "Ö": "\\214", 
    "×": "\\215", 
    "Ø": "\\216", 
    "Ù": "\\217", 
    "Ú": "\\218", 
    "Û": "\\219", 
    "Ü": "\\220", 
    "Ý": "\\221", 
    "Þ": "\\222", 
    "ß": "\\223", 
    "à": "\\224", 
    "á": "\\225", 
    "â": "\\226", 
    "ã": "\\227", 
    "ä": "\\228", 
    "å": "\\229", 
    "æ": "\\230", 
    "ç": "\\231", 
    "è": "\\232", 
    "é": "\\233", 
    "ê": "\\234", 
    "ë": "\\235", 
    "ì": "\\236", 
    "í": "\\237", 
    "î": "\\238", 
    "ï": "\\239", 
    "ð": "\\240", 
    "ñ": "\\241", 
    "ò": "\\242", 
    "ó": "\\243", 
    "ô": "\\244", 
    "õ": "\\245", 
    "ö": "\\246", 
    "÷": "\\247", 
    "ø": "\\248", 
    "ù": "\\249", 
    "ú": "\\250", 
    "û": "\\251", 
    "ü": "\\252", 
    "ý": "\\253", 
    "þ": "\\254", 
    "ÿ": "\\255", 
    "Ā": "\\256", 
    "ā": "\\257", 
    "Ă": "\\258", 
    "ă": "\\259", 
    "Ą": "\\260", 
    "ą": "\\261", 
    "Ć": "\\262", 
    "ć": "\\263", 
    "Ĉ": "\\264", 
    "ĉ": "\\265", 
    "Ċ": "\\266", 
    "ċ": "\\267", 
    "Č": "\\268", 
    "č": "\\269", 
    "Ď": "\\270", 
    "ď": "\\271", 
    "Đ": "\\272", 
    "đ": "\\273" 
} 

utf8hex = { 

} 

Ascii = { 

} 

binary = { 

} 

root = Tk() 
root.resizable(0, 0) 
root.title("Encoder 1.0 (Alpha)") 

v = IntVar() 

infoLabel = Label(text="This is an encoder, please choose the encode type and enter a message ") 
infoLabel.grid(column=1, columnspan=3, row=1) 

RB_UTF8_int = Radiobutton(text="UTF-8 (int)", variable=v, value="utf-8 int") 
RB_UTF8_int.grid(column=1, row=2) 

RB_UTF8_hex = Radiobutton(text="UTF-8 (hex)", variable=v, value="utf-8 hex") 
RB_UTF8_hex.grid(column=2, row=2) 

RB_Ascii = Radiobutton(text="Ascii", variable=v, value="Ascii") 
RB_Ascii.grid(column=1, row=3) 

RB_UTF16 = Radiobutton(text="Binary", variable=v, value="binary") 
RB_UTF16.grid(column=2, row=3) 

message = Entry() 
message.grid(column=1, columnspan=4, row=4) 

encode = Button(text="ENCODE", command=lambda: encode()) 
encode.grid(column=1, columnspan=4, row=5) 

root.mainloop() 


def encode(): 
    errors = 0 
    decoded_message = [] 
    encoded_message = [] 
    for i in message.get(): 
     decoded_message.append(i) 
    if message.get() != "": 
     if v == "utf-8 int": 
      for i in decoded_message: 
       for char, code in utf8int: 
        if char == i: 
         encoded_message.append(code) 
        else: 
         encoded_message.append("(error)") 
         errors += 1 
         pass 
      decoded_message1 = str(decoded_message) 
      decoded_message2 = decoded_message1.replace("[", "") 
      decoded_message3 = decoded_message2.replace("]", "") 
      decoded_message4 = decoded_message3.replace(", ", "") 
      decoded_message5 = decoded_message4.replace("'", "") 
      if tkinter.messagebox.askyesno(title="Succesfully Generated", message="Your code is succesfully " 
                        "generated\n" 
                        "with"+str(errors)+"errors.\n" 
                        "This is your code:\n" + 
                        decoded_message5 + 
                        "Copy it on the clipboard?"): 
       root.clipboard_clear() 
       root.clipboard_append(decoded_message5) 
      else: 
       pass 
     elif v == "utf-8 hex": 
      for i in decoded_message: 
       for char, code in utf8hex: 
        if char == i: 
         encoded_message.append(code) 
        else: 
         errors += 1 
         pass 
     elif v == "Ascii": 
      for i in decoded_message: 
       for char, code in Ascii: 
        if char == i: 
         encoded_message.append(code) 
        else: 
         errors += 1 
         pass 
     elif v == "binary": 
      for i in decoded_message: 
       for char, code in binary: 
        if char == i: 
         encoded_message.append(code) 
        else: 
         errors += 1 
         pass 
     else: 
      tkinter.messagebox.showerror(title="FATAL ERROR", message="Please, select an encode type.") 
    else: 
     tkinter.messagebox.showerror(title="ERROR 404", message="ERROR 404: message not found!") 

Antwort

1

Sie haben dort ein Definitionsproblem: Ihre Callback-Definition wird nie erreicht, da Tkinter's mainloop vorher aufgerufen wird. Was passiert, wenn die Taste gedrückt wird, versucht es das Tastenobjekt selbst aufzurufen, nicht die unten definierte encode Funktion.

Damit es funktioniert wie es ist, bewegen Sie einfach Ihre root.mainloop() in die letzte Zeile des Skripts.

Außerdem rufen Sie den Button und Ihre Callback-Funktion mit dem gleichen Namen. Das würde funktionieren (und könnte in anderen Versionen des Programms funktioniert haben), wenn Sie die Tkinter-Schleife nach dem Definieren der Callback-Funktion starten und danach keinen Zugriff mehr auf den Button selbst benötigen. Sie sollten andere Namen verwenden.

Aber besser als andere Namen, gibt es ein organisatorisches Problem zu versuchen, Ihre Schnittstellendefinition Code in der Programm-Root-Ebene, anstatt in einer Funktion.

+0

Wenn Sie _only_ 'root.mainloop()' verschieben, erhalten Sie 'NameError', da die Funktion, die Sie aufrufen möchten, zu diesem Zeitpunkt nicht definiert ist. Deshalb habe ich gesagt "Sie sollten Ihre Funktionsdefinition über" verschieben, die sowohl NameError als auch Mainloop löst. – Lafexlos

+0

Es wird kein "naemerror" verursacht, da der Code in einen "Lambda" -Ausdruck eingeschlossen ist: er wird nur zu "click time" ausgewertet. – jsbueno

+1

Oh schießen. Das komplett verpasst. Du hast recht, Entschuldigung. :) – Lafexlos