Ich habe vor kurzem angefangen in python zu programmieren und bin auf ein Problem gestoßen zu dem Ich gerade keine Lösung parat habe und auch im Internet leider nichts gefunden habe. Nachdem Ich bei stackoverflow an meine nervlichen Grenzen gekommen bin da ich anscheinend den Code nicht richtig formatiert habe, schreibe ich jetzt hier.
Ich will eine kleine GUI schreiben die mir über die Formel 1 Saison 18 Daten ausgibt.
Dazu lese ich Dateien ein und will mir diese dann in der GUI wieder ausgeben.
Ich versuche gerade eine Fahrerliste mit deren Platzierung und Punktestand in einer Tabelle anzeigen zu lassen, welche ich auch in einem seperatem Fenster zum laufen gebracht habe. Als ich jedoch das ganze in meinen "Haupt-Code" einbringen wollte bekam ich die Fehlermeldung dass das leider nicht geht. Mehr dazu später.
Mein Ziel ist es eine Tabelle in einem neuem Fenster, neben meinem Hauptfenster, anzeigen zu lassen womit ich toplevel benutzen will.
Hier erstmal der Code. Ich versuche noch viel und experimentiere, daher ist das ganze etwas unaufgeräumt.
In dem ersten Abschnitt habe ich die Klasse Fahrer erstellt um so eventuell später leichter auf diese Liste zuzugreifen.
from PIL import Image, ImageTk
import tkinter as tk
import pandas as pd
import folium
import webview
# Fahrer soll beinhalten: Name, Fahrzeug, Rennstall, Punkte
# Dient zur Vereinfachung beim Zugriff auf einen Fahrer mit seiner jeweiligen Punktzahl und Positionierung am Saison-Ende
class Fahrer:
def __init__(self,pl,na,pu):
self.__Platzierung = pl
self.__Name = na
self.__Punkte = pu
def setPlatzierung(self, platz_neu):
self.__Platzierung = platz_neu
def getPlatzierung(self):
return self.__Platzierung
def setName(self, name_neu):
self.__Name = name_neu
def getName(self):
return self.__Name
def setPunkte(self, punkte_neu):
self.__Punkte = punkte_neu
def getPunkte(self):
return self.__Punkte
# Definieren einer Funktion die über einen Button dann ein neues Fenster öffnet
"""
Kürzen!
"""
class MyButton(Button):
def createWindow_result():
window = Toplevel()
window.geometry("800x600")
window.title("Renn-Ergebnisse 2018")
driver = []; r=1; c=0; laenge = int(len("Fahrer 2018.txt"))
with open("Fahrer 2018.txt","r") as file:
for line in file:
line_splitted = line.strip().split(",")
platz = line_splitted[0]
name = line_splitted[1]
punkte = line_splitted[2]
driver += [Fahrer(platz,name,punkte)]
for i in range(20):
Label(text="Platzierung", relief=RIDGE, width=10).grid(row=0,column=0)
Label(text="Fahrer Name", relief=RIDGE, width=25).grid(row=0,column=1)
Label(text="Punkte", relief=RIDGE, width=10).grid(row=0,column=2)
Label(text=driver.getPlatzierung(), relief=RIDGE, width=10).grid(row=r, column=c)
Label(text=driver.getName(), relief=RIDGE, width=25).grid(row=r, column=c+1)
Label(text=driver.getPunkte(), relief=RIDGE, width=10).grid(row=r,column=c+2)
r =r + 1
def createWindow_details():
window = tk.Toplevel(root)
window.geometry("800x600")
window.title("Rennspezifische Daten")
def createWindow_pkt():
window = tk.Toplevel(root)
window.geometry("800x600")
window.title("Punkte-Tabelle")
def createWindow_map():
#window = tk.Toplevel(root)
#window.geometry("800x600")
#window.title("Karte")
webview.create_window("Karte","https://upload.wikimedia.org/wikipedia/ ... d-2019.svg")
#Karte einfügen?
def createWindow_pic():
window = tk.Toplevel(root)
window.geometry("800x600")
window.title("Strecken Layout")
#Karte mit Folium und pandas
locations = pd.DataFrame({
"lat":[-37.85,26.03,31.34,40.37,41.57,43.73,45.50,43.25,47.22,52.07,49.33,47.58,50.43,45.62,1.29,43.40,34.85,30.13,19.40,-23.70,24.47],
"lon":[144.96,50.51,121.22,49.85,2.26,7.42,-73.53,5.79,14.76,-1.01,8.57,19.24,5.97,9.28,103.86,39.97,136.54,-97.63,-99.08,-46.7,54.60],
"name":[
"Albert Park Circut","Bahrain International Circuit","Shanghai Audi International Circuit","Baku City Circuit","Circuit de Barcelona","Grand Prix de Monaco",
"Circuit Gilles-Villeneuve","Circuit Automobile Paul Ricard","Red Bull Ring","Silverstone Circuit","Hockenheim Ring","Hungaro Ring","Spa-Francorchamps","Autodrome Nazionale Monza",
"Marina Bay Circuit","Sochi Autodrome","Suzuka International","Circuit of the Americas","Autodrome Hermanos Rodriguez","Autodorome José Carlos Pace","Yas Marina Circuit"]
})
m = folium.Map(location=[53.55, 10.0], tiles="Stamen Toner", zoom_start=8)
tooltip = "Anzeigen"
for i in range(0,len(locations)):
folium.Marker([locations.iloc['lat'], locations.iloc['lon']], popup=locations.iloc['name'], tooltip=tooltip, icon=folium.Icon(color="green", icon="info-sign")).add_to(m)
m.save("Karte.html")
In diesem zweiten Abschnitt ist dann letztendlich der tkinter Code:
from tkinter import*
from PIL import Image, ImageTk
root = Tk()
root.geometry("800x600")
root.title("Projekt F1 2018 (Mark Salmon)")
rahmen = Frame(root,relief="ridge",borderwidth=3, bg="white")
rahmen.pack(fill="both", expand = 1)
willkommen = Label(rahmen, bg="white",text="Willkommen zu meinem Projekt im SoSe 2019 über die Saison 2018 in der Formel 1!")
willkommen.config(font = ("times",15,"italic"))
willkommen.pack()
# Formel 1 Logo einfügen
load = Image.open("F1Logo.png")
render = ImageTk.PhotoImage(load)
img = Label(image=render)
img.image = render
img.place(x=100, y=400, height=100,width=600)
# Text Einleitung für Weiterleitung neben Buttons
ergebnisse = Label(rahmen, text="Renn-Ergebnisse Saison 2018", bg="white")
details = Label(rahmen, text="Rennspezifische Daten", bg="white")
pkt_tabelle = Label(rahmen, text="Punkte Tabelle mit Fahrer Auswahl", bg="white")
folium_map = Label(rahmen, text="Rennstrecken Karte", bg="white")
pic = Label(rahmen, text="Renstrecken Layout", bg="white")
#Buttons für Weiterleitung, command einfügen für Weiterleitung
pick1 = MyButton(rahmen, cursor= "target", width=8, text="Start 1 ->", command=MyButton.createWindow_result)
pick2 = MyButton(rahmen, cursor= "target", width=8, text="Start 2 ->", command=MyButton.createWindow_details)
pick3 = MyButton(rahmen, cursor= "target", width=8, text="Start 3 ->", command=MyButton.createWindow_pkt)
pick4 = MyButton(rahmen, cursor= "target", width=8, text="Start 4 ->", command=MyButton.createWindow_map)
pick5 = MyButton(rahmen, cursor= "target", width=8, text="Start 5 ->", command=MyButton.createWindow_pic)
# Buttons für Weiterleitung mit place
pick1.place(x=20, y=80, width=120, height=25)
pick2.place(x=20, y=120, width=120, height=25)
pick3.place(x=20, y=160, width=120, height=25)
pick4.place(x=20, y=200, width=120, height=25)
pick5.place(x=20, y=240, width=120, height=25)
# Erläuterung für Weiterleitungsbutton mit place neben button von oben
ergebnisse.place (x=120, y=80, width=300, height=25)
details.place (x=104, y=120, width=300, height=25)
pkt_tabelle.place(x=137, y=160, width=300, height=25)
folium_map.place (x=96, y=200, width=300, height=25)
pic.place (x=96, y=240, width=300, height=25)
#Schließen vom Fenster mit eingebauter destroy Funktion. Bei quit läuft das Programm im Hintergrund weiter.
butt_quit = MyButton(rahmen,fg="red", cursor="pirate", width=15,text="Quit", command=root.destroy)
butt_quit.pack(side="bottom")
root.mainloop()
Und jetzt noch meine Fehlermeldung mit der Ich zurzeit leider nicht weiter weiß und auf euer Wissen und eure Erfahrung baue.

Exception in Tkinter callback
Traceback (most recent call last):
File "D:\Anaconda\lib\tkinter\__init__.py", line 1705, in __call__
return self.func(*args)
File "<ipython-input-27-0ebe02e80fe8>", line 57, in createWindow_result
Label(text="Platzierung", relief=RIDGE, width=10).grid(row=0,column=0)
File "D:\Anaconda\lib\tkinter\__init__.py", line 2226, in grid_configure
+ self._options(cnf, kw))
_tkinter.TclError: cannot use geometry manager grid inside . which already has slaves managed by pack
Was mir damit gesagt werden soll weiß ich. Nur leider habe ich keinen Weg diese zu lösen ohne weitere 4 Stunden reinzustecken.
Ich freue mich auf eure Antwort.
MfG
Trinity