2017-12-09 2 views
0

Ich benutze Python 2.7, um einen Satelliten-Tracker für ein Cubesat-Projekt an meiner Universität zu bauen. Jetzt läuft die ganze Sache so, wie ich es will. Ich produziere 4 Bilder und eine Ladung Text basierend auf den Orbit-Parametern der ISS, da unser CubeSat noch nicht fliegt.GUI mit Tkinter für Bild- und Texteingaben einrichten

Die 4 Bilder sind:

1) auf einem Globus auf seiner TLE gerade aus Celestrak basierend aktuellen Position des Satelliten.

2) Die aktuelle Position des Satelliten auf einer Mercator-Karte (flach).

3) Seine aktuelle Lat/Lon-Position in eine Google Earth-Ansicht übersetzt, um physikalisch zu interpretieren, wo es ist.

4) Die aktuelle Lat/Lon-Position basierend auf aktuellen Wetterkarten, ob Wolken in der Region vorhanden sind oder nicht, wodurch die Fähigkeiten der Satellitenfernerkundung beeinträchtigt werden. (Grund, warum das Bild hässlich und lila aussieht, ist, dass diese Region zum Zeitpunkt des Datenabrufs keine aktuellen Wetterdaten hatte)

Dann muss ich ein Textfeld mit Informationen über Höhe, Geschwindigkeit, räumliche Auflösung usw. implementieren.

Es ist alles nett und dandy. Aber ich kann nicht für die Liebe Gottes herausfinden, wie man diese Tkinter-GUI dazu bringt, nett zu spielen! Ich bin ein Geowissenschaftler, kein Computerwissenschaftler und Python Programmierung ist sehr neu für mich: D

Wie auch immer, ich habe ein schnelles Layout in Photoshop, wie ich die fertigen Daten in einem Tkinter GUI produziert werden soll. Siehe die primitive Bild unten:

GUI Initial Layout

Hier ist mein beschämender Code unten:

import Tkinter as tk 
from PIL import ImageTk, Image 

#This creates the main window of an application 
window = tk.Tk() 
window.title("Satellite Control Center") 
window.geometry("1000x800") 
window.configure(background='grey') 

#Imports the pictures. 
pic1 = "Globeview.png" 
pic2 = "MercatorView.png" 
pic3 = "currentweathercroppedsmall.png" 
pic4 = "GECurrentcroppedsmall.png" 

#Creates a Tkinter-compatible photo image, which can be used everywhere Tkinter expects an image object. 
img1 = ImageTk.PhotoImage(Image.open(pic1)) 
img2 = ImageTk.PhotoImage(Image.open(pic2)) 
img3 = ImageTk.PhotoImage(Image.open(pic3)) 
img4 = ImageTk.PhotoImage(Image.open(pic4)) 

#The Label widget is a standard Tkinter widget used to display a text or image on the screen. 
globeview = tk.Label(window, image = img1) 
mercatorview = tk.Label(window, image = img2) 
currentweather= tk.Label(window, image = img3) 
gearth = tk.Label(window, image = img4) 

#The Pack geometry manager packs widgets in rows or columns. 
globeview.pack(side = "top", fill = "both", expand = "yes") 
mercatorview.pack(side = "top", fill = "both", expand = "yes") 
currentweather.pack(side = "bottom", fill = "both", expand = "yes") 
gearth.pack(side = "bottom", fill = "both", expand = "yes") 

#Start the GUI 
window.mainloop() 

Welche diese Horror-Show produziert!

enter image description here

Meine Fragen sind klar:

1) Bilder werden nicht in irgendeiner Art und Weise ausgerichtet ich will. Normalerweise würde ich in HTML Tabellenreihen einrichten, ausrichten und mit Abstandshaltern versehen, wie ich es möchte. Aber ich weiß nicht, wie ich das hier definieren soll und ich habe schon Stunden damit verbracht, frustriert darüber zu sein.

2) Ich muss ein Textfeld hinzufügen. Jedes Mal habe ich versucht, verschiedene Versionen von Textfeldern hinzuzufügen. Ich bekomme komische pyimage'xx 'Fehler und kein Textfeld scheint sich zu materialisieren.

3) Für die Zukunft: Eine Schaltfläche unter den Bildern, die das vollständige unbearbeitete Bild zeigen. Aber das ist im Moment nicht zwingend!

Also ich hoffe, einer von euch hat eine gute Möglichkeit, dies zu tun, oder kann mich in eine Richtung zeigen .. oder vielleicht sogar etwas getan haben, wo ich Ihren Code sehen kann und nur die Zahlen von a Bit zum Ausrichten der Pixel.

Vielen Dank im Voraus.

+1

'tkinter' ist nicht' HTML' - es hat eigene Regeln, um Layout zu erstellen. Sie haben drei Layouts, die 'pack()', 'grid()' und 'place()' verwalten, aber Sie sollten nicht in einem Fenster oder Frame mischen, aber Sie können einen Manager im Hauptfenster verwenden, um Frames und verschiedene Manager zu setzen in jedem Rahmen (innerhalb des Rahmens kannst du einen anderen Rahmen mit einem anderen Manager setzen. – furas

Antwort

1

Sie versuchen, alles in einem einzigen Rahmen zu legen. Das ist zwar möglich, aber es ist viel einfacher, Subframes für Objekte zu erstellen, die in saubere Zeilen, Spalten oder Raster fallen, und dann die Subframes in die endgültige Anordnung zu übernehmen.

Völlig ungetestet Vermutung:

import Tkinter as tk 
from tkFont import Font 
from PIL import ImageTk, Image 

#This creates the main window of an application 
window = tk.Tk() 
window.title("Aarhus University Satellite Control Center") 
window.geometry("1000x800") 
window.configure(background='grey') 

#Imports the pictures. 
pic1 = "Globeview.png" 
pic2 = "MercatorView.png" 
pic3 = "currentweathercroppedsmall.png" 
pic4 = "GECurrentcroppedsmall.png" 

#Creates a Tkinter-compatible photo image, which can be used everywhere Tkinter expects an image object. 
img1 = ImageTk.PhotoImage(Image.open(pic1)) 
img2 = ImageTk.PhotoImage(Image.open(pic2)) 
img3 = ImageTk.PhotoImage(Image.open(pic3)) 
img4 = ImageTk.PhotoImage(Image.open(pic4)) 

header = tk.Label(window, text="Header", font=Font(size=40)) 
header.pack() 

toprow = tk.Frame(window) 
globeview = tk.Label(toprow, image = img1) 
globeview.pack(side = "left") # the side argument sets this to pack in a row rather than a column 
infobox = tk.Text(toprow) 
infobox.pack(side = "left") 
toprow.pack() # pack the toprow frame into the window 

bottomrow = tk.Frame(window) 
mercatorview = tk.Label(bottomrow, image = img2) 
currentweather= tk.Label(bottomrow, image = img3) 
gearth = tk.Label(bottomrow, image = img4) 
mercatorview.pack(side = "left") 
currentweather.pack(side = "left") 
gearth.pack(side = "left") 
bottomrow.pack() 

#Start the GUI 
window.mainloop() 
+0

@Kongstad Das sieht wie ein lustiges Projekt aus. Willst du etwas Hilfe dabei? Wenn du den kompletten Code auf github oder ähnliches legst, räume ich es für dich auf. – Novel

+0

Hey @Novel, leider habe ich deinen Kommentar bis jetzt nicht gesehen! Leider muss ich es als mein eigenes Projekt machen.Wenn es zu perfekt ist, sieht es nicht wie ein Studentenprojekt aus, aber es kommt gut voran und ich werde Ihnen den Code gerne zeigen, nachdem er akzeptiert wurde. Alles was es jetzt wirklich braucht, ist in der Lage zu sein Satellitenstandort hin und her zu projizieren. Aber das könnte für die endgültige Veröffentlichung nicht ausreichen. :) – Kongstad

1
import Tkinter as tk 
from PIL import ImageTk, Image 

#This creates the main window of an application 
window = tk.Tk() 
window.title("Aarhus University Satellite Control Center") 
window.geometry("1000x800") 
window.configure(background='grey') 

#Imports the pictures. 
pic1 = "Globeview.png" 
pic2 = "MercatorView.png" 
pic3 = "currentweathercroppedsmall.png" 
pic4 = "GECurrentcroppedsmall.png" 

#Creates a Tkinter-compatible photo image, which can be used everywhere Tkinter expects an image object. 
img1 = ImageTk.PhotoImage(Image.open(pic1)) 
img2 = ImageTk.PhotoImage(Image.open(pic2)) 
img3 = ImageTk.PhotoImage(Image.open(pic3)) 
img4 = ImageTk.PhotoImage(Image.open(pic4)) 

#The Label widget is a standard Tkinter widget used to display a text or image on the screen. 
globeview = tk.Label(window, image = img1).grid(row=0,column=0) 
mercatorview = tk.Label(window, image = img2).grid(row=1,column=0) 
currentweather= tk.Label(window, image = img3).grid(row=1,column=1) 
gearth = tk.Label(window, image = img4).grid(row=1,column=2) 

#Start the GUI 
window.mainloop() 

Sie benötigen Zeile und Spalte in dem Label Raster-Option hinzuzufügen. Nachdem Sie das Label erstellt haben, platzieren Sie das Raster und erwähnen Sie Zeile und Spalte. Ich habe den Code aktualisiert, überprüfe ihn einfach. Wenn Sie irgendein Problem haben, schreiben Sie uns zurück, und entfernen Sie das Paket, das ich im Code gelöscht habe :) Prost

+0

Vielen Dank, dass Sie sich die Zeit genommen haben. Allerdings habe ich einen Modulfehler von deinem Bit und den Code von dem Typen oben (der eine ganze Minute vor dir beantwortet hat;)) spielt perfekt ab! Danke trotzdem =) – Kongstad