Hintergrundbild

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
flowers
User
Beiträge: 2
Registriert: Dienstag 1. November 2016, 22:43

Hallo ich bin neu und habe noch absolut keine Ahnung wie ich so einiges lösen soll und kann. Ich möchte später mit einem Raspberry Pi einen Arduino ansteuern. Dazu wollte ich zuerst mit Python eine grafische Oberfläche erstellen.

Hauptseite Auswahl der Themen . (3 Buttons) diese sollen die jeweilige "unterseiten" öffnen

1. Alkohlfreie Cocktails
2. Cocktails
3. Longdrinks

Da ich gerade angefangen habe stehe ich vor dem Problem das ich ein Bild eingebunden habe und dieses "glaube ich" nicht im Hintergrund ist und die Buttons die ich eingefügt habe nicht mehr zu sehen sind. Hier mein Aktueller Code. Für eure Hilfe bin ich sehr dankbar. wenn ich wenigstens schon mal die Oberfläche soweit fertig gestellt bekomme. Wie ich das mit den "Seiten" anstelle habe ich auch noch nicht das richtige Thema gefunden das ich mich da dran herhangel kann.

Schöne Grüße flowers

Code: Alles auswählen

from tkinter import *

#Erzeugung des Hauptfensters
root = Tk()
root.title("Cocktails")
root.geometry("800x600")


#Hintergrundbild
logo = PhotoImage(file="cocktail-05.gif")
w = Label(root, 
          compound = CENTER,
          image=logo).pack(side="right")


#Erzeugung der Buttons
Knopf1 = Button(root, text="Alkohlfreie Cocktails")
Knopf1.pack()
Knopf2 = Button(root, text="Cocktails")
Knopf2.pack()
Knopf3 = Button(root, text="Longdrings")
Knopf3.pack()

mainloop()

Zuletzt geändert von Anonymous am Mittwoch 2. November 2016, 00:26, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
heiner88
User
Beiträge: 65
Registriert: Donnerstag 20. Oktober 2016, 07:29

Code: Alles auswählen

#Hintergrundbild
bg_image = PhotoImage(...)
bg_label = Label(root, image=bg_image)
bg_label.place(x=0, y=0)
BlackJack

@flowers: Noch ein paar Anmerkungen zum Quelltext:

Sternchen-Importe sollte man nicht machen. Damit holst Du Dir *alle* Namen aus einem Modul in den Namensraum deines Moduls. Bei `tkinter` sind das sogar *richtig* viele (ca. 190). Es wird dann schwieriger nachzuvollziehen woher Namen kommen und es besteht die Gefahr von Namenskollisionen.

Bei `tkinter` ist es üblich das Modul mit ``import tkinter as tk`` an den kürzeren Namen `tk` zu binden.

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

Kommentare sollten nicht das beschreiben was dort offensichtlich schon als Code steht. Der erste und der letzte Kommentar sind total überflüssig. Faustregel: Nicht kommentieren *was* gemacht wird, sondern *warum* es *so* gemacht wird. Und das auch nur sofern es aus dem Code nicht offensichtlich wird. Und falls es nicht offensichtlich ist, auch erst einmal überlegen ob man den Code nicht verständlicher schreiben könnte. Beim zweiten Kommentar könnte man beispielsweise das `PhotoImage`-Exemplar `background_image` nennen, und schon kann man sich den Kommentar ``#Hintergrundbild`` sparen.

Namen sind dazu da dem Leser zu vermitteln was der Wert hinter dem Namen im Kontext des Programms bedeutet. Das tun einbuchstabige Namen eher selten. Das `w` zum Beispiel, wofür steht das? Weisst Du an was für einen Wert das gebunden wird? Überprüfe Deine Vermutung! Die ist nämlich ziemlich wahrscheinlich falsch.

`Knopf1` bis `Knopf3` sind nicht nur viel zu generische Namen weil sie nichts darüber aussagen was die Schaltfläche bedeutet, sondern sie halten auch nicht an die Konventionen für Namensschreibweisen in Python (Style Guide for Python Code). Das wäre für alles ausser Konstanten und Klassen klein_mit_unterstrichen (um_worte_zu_trennen :-)). Ausserdem ist das durchnummerieren von Namen ein „code smell“. Manchmal deutet das darauf hin, dass man sich vernünftige Namen dafür ausdenken will, meistens aber das man eigentlich gar keine einzelnen Namen haben will, sondern eine Datenstruktur mit den Objekten der man *einen* passenden Namen gibt. Oft ist diese Datenstruktur eine Liste. Wie auch in diesem Fall, wo die Schaltflächen zusammengenommen eine Auswahl darstellen, und man sie zum Beispiel in eine Liste mit dem Namen `choice_buttons` stecken könnte.

Ich lande dann ungefähr hier (ungetestet):

Code: Alles auswählen

import tkinter as tk
 

def main():
    root = tk.Tk()
    root.title('Cocktails')
    
    background_image = tk.PhotoImage(file='cocktail-05.gif')
    tk.Label(root, image=background_image).place(x=0, y=0)
    root.geometry(
        '{}x{}'.format(background_image.width(), background_image.height())
    )
    
    choice_buttons = list()
    for text in ['Alkohlfreie Cocktails', 'Cocktails', 'Longdrinks']:
        button = tk.Button(root, text=text)
        button.pack()
        choice_buttons.append(button)
     
    tk.mainloop()


if __name__ == '__main__':
    main()
Was die GUI an sich angeht, möchtest Du vielleicht einen Blick auf ein `tkinter.ttk.Notebook` werfen, bevor Du so etwas ähnliches selbst implementierst.

Ansonsten solltest Du *vor* GUI-Programming Funktionen und objektorientierte Programmierung (OOP) mit Klassen richtig verstanden haben, denn den richtigen Umgang mit Funktionen muss man für Klassen verstanden haben, und ohne Klassen kommt man bei GUI-Programming nicht besonders weit.

Edit: Die `choice_buttons`-Liste kann man in dem Beispiel natürlich auch komplett weg lassen weil die Objekte hier überhaupt nicht mehr gebraucht werden.
flowers
User
Beiträge: 2
Registriert: Dienstag 1. November 2016, 22:43

Hallo,
ich bedanke mich bei euch ! das hat mir schon mal sehr weiter geholfen. Ich nehme eure Tipps gerne an und werde mal weiter dran rumdoktern :D


Schöne Grüße
Antworten