Python 3 "Item 1" doesn't exist

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
wasauchimmer
User
Beiträge: 2
Registriert: Dienstag 2. Juli 2019, 10:55

Also ich hab mal angefangen in Python zu programmieren und wollte dass mir an bestimmten Positionen Rechtecke angezeigt werden mit MAC-Adressen und und dem Status erstmal gleichzeitig auch mit der Maus verschiebbar aber sobald ich das machen will gibt er mir den Error Item "1" doesnt exist wenn ich das Rechteck und den Text nur anzeigen will gehts kann mir da jemand helfen oder Tipps geben hier der code:

Code: Alles auswählen

import tkinter as tk
from tkinter import *



def Button_action():
  fenster = Tk()
  fenster.geometry("650x350")
  fenster.title("Auswahl")
  
  
  # Ausgabe Der Gewünschten Informationen
  
  
  my_label = Label(fenster, text="Wähle die Gewünschte Information aus.")
  Mac_ausgabe_Label = Label(fenster, text=mac)
  Status_ausgabe_Label = Label(fenster, text=status)
  Ip_ausgabe_Label = Label(fenster, text=ip)
  Name_ausgabe_Label = Label(fenster, text=name)
  PosX_ausgabe_Label = Label(fenster, text=posx)
  PosY_ausgabe_Label = Label(fenster, text=posy)
  Farbe_ausgebe_Label = Label(fenster, text=farbe)
  SwitchPort_ausgabe_Label = Label(fenster, text=switchPort)
  
  #Button zum ändern der Werte
  
  
  def Button_SwitchPort():
        switchPort = eingabefeld_switchPort.get()
  
  def Button_Farbe():
        farbe = eingabefeld_farbe.get()
  
  def Button_PosY():
        posy = eingabefeld_posy.get()
  
  def Button_PosX():
        posx = eingabefeld_posx.get()
  
  def Button_Name():
        name = eingabefeld_name.get()
  
  def Button_Ip():
        ip = eingabefeld_ip.get()

  def Button_Status():
        status = eingabefeld_status.get()

  def Button_Mac():
        mac = eingabefeld_mac.get()


  
  
  #Hier kann der Benutzer eine Eingabe machen
  
  
  eingabefeld_mac = Entry(fenster, bd=5, width=40)
  eingabefeld_status = Entry(fenster, bd=5, width=40)
  eingabefeld_ip = Entry(fenster, bd=5, width=40)
  eingabefeld_name = Entry(fenster, bd=5, width=40)
  eingabefeld_posx = Entry(fenster, bd=5, width=40)
  eingabefeld_posy = Entry(fenster, bd=5, width=40)
  eingabefeld_farbe = Entry(fenster, bd=5, width=40)
  eingabefeld_switchPort = Entry(fenster, bd=5, width=40)  
  
  
  #Platzzuweisungen/Größenzuweisungen
  
  
  my_label.grid(row=0, column=2)
  Mac_Button = Button(fenster, text="Mac-Adressen", width = '12', height = '1', command=Button_Mac)
  Mac_Button.grid(row=1,column=1)
  Mac_ausgabe_Label.grid(row=1, column=2)
  eingabefeld_mac.grid(row=1, column=3)
  Status_Button = Button(fenster, text="Status", width = '6', height = '1', command=Button_Status)
  Status_Button.grid(row=2,column=1)
  Status_ausgabe_Label.grid(row=2, column=2)
  eingabefeld_status.grid(row=2, column=3)
  Ip_Button = Button(fenster, text="Ip", width = '2', height = '1', command=Button_Ip)
  Ip_Button.grid(row=3,column=1)
  Ip_ausgabe_Label.grid(row=3, column=2)
  eingabefeld_ip.grid(row=3, column=3)
  Name_Button = Button(fenster, text="Name", width = '4', height = '1', command=Button_Name)
  Name_Button.grid(row=4,column=1)
  Name_ausgabe_Label.grid(row=4, column=2)
  eingabefeld_name.grid(row=4, column=3)
  Posx_Button = Button(fenster, text="PosX", width = '4', height = '1', command=Button_PosX)
  Posx_Button.grid(row=5,column=1)
  PosX_ausgabe_Label.grid(row=5, column=2)
  eingabefeld_posx.grid(row=5, column=3)
  Posy_Button = Button(fenster, text="PosY", width = '4', height = '1', command=Button_PosY)
  Posy_Button.grid(row=6,column=1)
  PosY_ausgabe_Label.grid(row=6, column=2)
  eingabefeld_posy.grid(row=6, column=3)
  Farbe_Button = Button(fenster, text="Farbe", width = '5', height = '1', command=Button_Farbe)
  Farbe_Button.grid(row=7,column=1)
  Farbe_ausgebe_Label.grid(row=7, column=2)
  eingabefeld_farbe.grid(row=7, column=3)
  SwitchPort_Button = Button(fenster, text="SwitchPort", width = '9', height = '1', command=Button_SwitchPort)
  SwitchPort_Button.grid(row=8,column=1)
  SwitchPort_ausgabe_Label.grid(row=8, column=2)
  eingabefeld_switchPort.grid(row=8, column=3)
  
  
  def mouse_button1(mouse,object):
    """Maus fasst das Grafik-Objekt"""

    cv.drag_drop_flag = True
	
    tags = cv.gettags(object)
    if tags != ():
        object = tags[0]

    #~~ Hebt das selektierte Objekt über die anderen
    cv.tag_raise(object,None)

    #~~ Drag-Koordinaten
    cv.mouse_x  = mouse.x
    cv.mouse_y  = mouse.y
    print(cv.mouse_x,cv.mouse_y)

def mouse_release1():
  """Maus lässt Grafik-Objekte fallen"""
  cv.drag_drop_flag = False

def mouse_move(mouse,object):
  """Maus bewegt dich über das Grafil-Objekt"""
    
  tags = cv.gettags(object)
  if tags != ():
        object = tags[0]

  if cv.drag_drop_flag == True:
      # Ermittle den Koordinaten-offset
      xoff = mouse.x - cv.mouse_x
      yoff = mouse.y - cv.mouse_y
  
      # verschiebe das Grafik Objekt
      cv.move(object,xoff,yoff)
    
      # Aktuelle Koordinaten
      cv.mouse_x = mouse.x
      cv.mouse_y = mouse.y

def mouse_enter(event):
  """Maus bewegt sich in das grafische Objekt"""
  
  cv.temp_cursor = cv['cursor']
  cv['cursor'] = 'hand1'
  
def mouse_leave(event):
  """Maus bewegt sich aus dem Grafischen Objekt"""
  
  cv['cursor'] = cv.temp_cursor
  
def event_bindings(object):
  """Binde Mausereignisse an das Grafik-Objekt"""
  
  # Event für linke Maustaste
  cv.tag_bind(object,"<Button-1>", lambda e,obj=object:mouse_button1(e,obj))
  # Event für loslassen der linken Maustaste
  cv.tag_bind(object,"<ButtonRelease 1>", lambda e, obj=object:mouse_release1())
  # Event für Mausbewegung
  cv.tag_bind(object,"<Motion>", lambda e, obj=object:mouse_move(e,obj))
  # Maus bewegt sich ins Grafik-Objekt
  cv.tag_bind(object,"<Enter>", lambda e:mouse_enter(e))
  # Maus bewegt sich aus dem Grafik-Objekt
  cv.tag_bind(object, "<Leave>", lambda e:mouse_leave(e))

  
def Button_rechteck():
  
  fenster = Tk()
  
  cv = Canvas(fenster,height=500, width=500,bd=0,relief='raised',bg='#ffffff')
  cv.pack()
  #Folgende Variablen werden dem cv.objekt angehängt
  cv.drag_drop_flag = False
  cv.mouse_x = None
  cv.mouse_y = None
  
  

def Button_rechteck():
  
  fenster.title("Rechteck")
  canvas_width = 500
  canvas_height = 500

  colours = ("#476042", "yellow")


  master = Tk()

  w = Canvas(master, 
           width=canvas_width, 
           height=canvas_height)
  w.pack()
  posx1 = posx[:]
  posy1 = posy[:]

  for i in range(len(posx)):
      posx[i] = posx[i] +100
  for i in range(len(posy)):
      posy[i] = posy[i] +100

# das rechteck und das drag and drop mit der maus  

  rechteck = w.create_rectangle(posx[0], posy[0], posx1[0], posy1[0], fill=colours)	
  event_bindings(rechteck)

  for i in range(len(posx1)):
      posx1[i] = posx1[i] +50
  for i in range(len(posy1)):
      posy1[i] = posy1[i] +50

#die MAC  Adresse die aus der liste angezeigt wird / verbinden mit dem rechteck

  inhalt_a = w.create_text(posx1[0], posy1[0], text=mac[0])
  #cv.addtag_withtag('rechteck', rechteck)
  #cv.addtag_withtag('rechteck', inhalt_a)
  
  for i in range(len(posx1)):
      posx1[i] = posx1[i] -10
  for i in range(len(posy1)):
      posy1[i] = posy1[i] -10


  #der status der mir angezeigt wird / verbinden mit dem rechteck

  inhalt_b = w.create_text(posx1[0], posy1[0], text=status[0])
  #cv.addtag_withtag('rechteck', rechteck)
  #cv.addtag_withtag('rechteck', inhalt_b)



#Das erste Fenster dass sich öffnet
fenster = Tk()
fenster.geometry("1000x550")
fenster.title("Programm mit einem Menü")



#InfoText im Fenster


info_text = Label(fenster, text = "Ich habe ein Menü!\n\
Wenn du darauf Klickst geht ein Drop-Down-Menü auf.")
info_text.pack()



# Menüleiste erstellen 


menuleiste = Menu(fenster)



#Menü Datei erstellen


datei_menu = Menu(menuleiste, tearoff=0)
datei_menu =Menu(menuleiste, tearoff=0)





# Beim Klick auf Datei sollen nun weitere Einträge erscheinen.
# Diese werden also zu "datei_menu" hinzugefügt.


datei_menu.add_command(label="Computer", command=Button_action)
datei_menu.add_separator() # Fügt eine Trennlinie hinzu
datei_menu.add_command(label="Rechteck", command=Button_rechteck)
datei_menu.add_separator()
datei_menu.add_command(label="Exit", command=fenster.quit)



# Nun fügen wir die Menüs (Datei) der Menüleiste
#als "Drop-down-Menü" hinzu


menuleiste.add_cascade(label="Computer", menu=datei_menu)



# Die Menüleiste mit den Menüeinrägen noch dem Fenster übergeben und fertig.


fenster.config(menu=menuleiste)





class Computer:

    def __init__(self, mac, status, ip, name, posx, posy, farbe, switchPort):
        self.__mac = mac 
        self.__status = status 
        self.__ip = ip 
        self.__name = name 
        self.__posx = posx 
        self.__posy = posy 
        self.__farbe = farbe 
        self.__switchPort = switchPort
        
    def __GetMac(self):
        return self.__mac
    def __SetMac(self, mac):
        self.__mac = mac

    def __GetStatus(self):
        return self.__status
    def __SetStatus(self, status):
        self.__status = status

    def __GetIp(self):
        return self.__ip
    def __SetIp(self, ip):
        self.__ip = ip

    def __GetName(self):
        return self.__name
    def __SetName(selfname):
        self.__name = name 

    def __GetPosX(self):
        return self.__posx
    def __SetPosX(self, posx):
        self.__posx = posx

    def __GetPosY(self):
        return self.__posy
    def __SetPosY(self, posy):
        self.__posy = posy

    def __GetFarbe(self):
        return self.__farbe
    def __SetFarbe(self, farbe):
        self.__farbe = farbe

    def __GetSwitchPort(self):
        return self.__switchPort
    def __SetSwitchPort(self, switchPort):
        self.__switchPort = switchPort

    mac = property(__GetMac, __SetMac)
    status = property(__GetStatus, __SetStatus)
    ip = property(__GetIp, __SetIp)
    name = property(__GetName, __SetName)
    posx = property(__GetPosX, __SetPosX)
    posy = property(__GetPosY, __SetPosY)
    farbe = property(__GetFarbe, __SetFarbe)
    switchPort = property(__GetSwitchPort, __SetSwitchPort)

if __name__ == "__main__":
    
    mac = ['23:24:34:2E:22:1A', 'aa:bb:cc:dd:ee:ff']
    status = ['ok', 'beschädigt']
    ip = ['192.168.3.6', '192.168.9.9']
    name = ['Koala', 'Kaninchen', 'Igel', 'Maus', 'Elefant']
    posx = [30, 66]
    posy = [50, 99]
    farbe = ['Grün', 'Silber']
    switchPort = ['der da daneben', 'der da drüben']
    
    cv = Canvas(fenster,height=500, width=500,bd=0,relief='raised',bg='#ffffff')



fenster.mainloop()
Benutzeravatar
__blackjack__
User
Beiträge: 14044
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@wasauchimmer: Wenn Du eine Fehlermeldung bekommst, zum Beispiel wegen einer Ausnahme, dann bitte immer den gesamten Traceback 1:1 kopieren und beschreiben wie man diese Ausnahme auslösen kann. Dann muss man nicht raten wie man zum Fehler kommt und wo im Code der auftritt.

Ansonsten sollte der Code dringend überarbeitet werden. Eingerückt wird mit vier Leerzeichen pro Ebene. Namen werden klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Das Hauptprogramm sollte ja schon nicht auf Modulebene stehen, aber wenn man es dort auch noch zwischen Funktions- und Klassendefinitionen verteilt, ist es noch einmal ein Stück schlechter.

Wenn man das Hauptprogramm in eine Funktion verschiebt, funktionieren einige Funktionen nicht mehr, weil die auf globale Variablen zugreifen: Funktionen und Methoden sollten alles was sie ausser Konstanten benötigen als Argument(e) übergeben bekommen.

Sternchen-Importe sind Böse™. Es steht ja schon der richtige Import da: ``import tkinter as tk``. Den sollte man dann auch nutzen, statt sich den gesamten Modulinhalt noch mal per *-Import ins aktuelle Modul zu holen. Das sind ca. 190 Namen und nicht einmal alle sind direkt von `tkinter`, denn man importiert damit ja auch alles was das importierte Modul seinerseits importiert.

Es darf in einem Programm immer nur *ein* `Tk`-Objekt geben. Das ist *das* Hauptfenster, wo der Tk/Tcl-Interpreter dran hängt. Wenn man mehr als ein Objekt davon erstellt, passieren komische Sachen.

Lokale Funktionen sollte man nur in Ausnahmefällen definieren. Nur wenn man tatsächlich ein Closure braucht oder wenn die Funktion zu speziell/einfach ist als das man sie testen müsste — denn das kann man mit lokalen Funktionen ja nicht.

Die ganzen lokalen `Button_*()`-Funktion in `Button_action()` machen auch keinen Sinn, weil sie keinen Effekt haben.

Die `Computer`-Klasse schreibt man in Python so:

Code: Alles auswählen

class Computer:

    def __init__(self, mac, status, ip, name, posx, posy, farbe, switch_port):
        self.mac = mac
        self.status = status
        self.ip = ip
        self.name = name
        self.posx = posx
        self.posy = posy
        self.farbe = farbe
        self.switch_port = switch_port
Und das war's. Vergiss doppelte führende Unterstriche. Das bedeutet *nicht* ”private”. Und vergiss triviale Getter und Setter. Und `property()` wird seit Python 2.4 nicht mehr *so* benutzt, sondern als Dekorator.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
wasauchimmer
User
Beiträge: 2
Registriert: Dienstag 2. Juli 2019, 10:55

@__blackjack__
Danke für dein Feedback ich versuch das mal zu verstehen bin noch nicht so vertraut mit dem ganzen und versteh nicht alles wie du es meinst.
Das Problem kommt hier vor wenn ich das rechteck mit event_bindings() verbinde klammert man dies auf funktioniert es

Code: Alles auswählen

# das rechteck und das drag and drop mit der maus  

  rechteck = w.create_rectangle(posx[0], posy[0], posx1[0], posy1[0], fill=colours)	
  event_bindings(rechteck)

  for i in range(len(posx1)):
      posx1[i] = posx1[i] +50
  for i in range(len(posy1)):
      posy1[i] = posy1[i] +50

#die MAC  Adresse die aus der liste angezeigt wird / verbinden mit dem rechteck

  inhalt_a = w.create_text(posx1[0], posy1[0], text=mac[0])
  #cv.addtag_withtag('rechteck', rechteck)
  #cv.addtag_withtag('rechteck', inhalt_a)
  
  for i in range(len(posx1)):
      posx1[i] = posx1[i] -10
  for i in range(len(posy1)):
      posy1[i] = posy1[i] -10


  #der status der mir angezeigt wird / verbinden mit dem rechteck

  inhalt_b = w.create_text(posx1[0], posy1[0], text=status[0])
  #cv.addtag_withtag('rechteck', rechteck)
  #cv.addtag_withtag('rechteck', inhalt_b)
Das wäre die Fehlermeldung sobald man auf Rechteck im Drop-Down menu geht.

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Program Files (x86)\Python36-32\lib\tkinter\__init__.py", line 1705,
in __call__
    return self.func(*args)
  File "D:\python\Aufgabe\new 1.py", line 211, in Button_rechteck
    event_bindings(rechteck)
  File "D:\python\Aufgabe\new 1.py", line 161, in event_bindings
    cv.tag_bind(object,"<Button-1>", lambda e,obj=object:mouse_button1(e,obj))
  File "C:\Program Files (x86)\Python36-32\lib\tkinter\__init__.py", line 2453,
in tag_bind
    sequence, func, add)
  File "C:\Program Files (x86)\Python36-32\lib\tkinter\__init__.py", line 1206,
in _bind
    self.tk.call(what + (sequence, cmd))
_tkinter.TclError: item "1" doesn't exist
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das kommt davon, wenn man mit globalen Variablen arbeitet. Welche von den beiden brilliant benannten "cv" Canvases erwischst du denn deiner Meinung nach? Und in welchem anderen Canvas erzeugst du die Objekte? Da hast du dann deine Antwort.
Antworten