Hallo.
Ich versuche bei Python ein Bild zu laden (Damit ich ihn bei Tkinter auf einen Button packen kann) und habe schon einige Module dafür wie cv2 oder PIL genutzt, allerdings findet Python diese irgendwie nicht. Deswegen wolklte ich fragen, ob es eine einfachere Methode gibt oder woran das liegen kann.
Bilder laden klappt nicht
- __blackjack__
- User
- Beiträge: 14036
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@Contrean: Die einfachste Möglichkeit ist ein Bildformat das Tk versteht, direkt mit Tk-Bordmitteln, also `PhotoImage` zu laden. In aktuellen Tk-Versionen sind das die Formate PGM, PPM, GIF, und PNG, in älteren Versionen ist PNG da noch nicht dabei. Ansonsten wäre Pillow/PIL der nächste Kandidat. Es sei denn man braucht noch mehr aus `cv2` neben dem Laden von Bildern.
Warum das bei Dir nicht geht, kann man ohne Code zu sehen nicht wirklich sagen. Wobei ein übliches Problem ist, dass man eine Referenz auf das `PhotoImage`-Objekt behalten muss, weil das sonst wieder aus dem Speicher entfernt wird. Python kann halt leider nicht ermitteln ob/wann Tk den das Bild und damit den Speicher nicht mehr benötigt.
Warum das bei Dir nicht geht, kann man ohne Code zu sehen nicht wirklich sagen. Wobei ein übliches Problem ist, dass man eine Referenz auf das `PhotoImage`-Objekt behalten muss, weil das sonst wieder aus dem Speicher entfernt wird. Python kann halt leider nicht ermitteln ob/wann Tk den das Bild und damit den Speicher nicht mehr benötigt.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
from tkinter import *
import time, sys
#Create the Window
window = Tk()
window.title('RavenShelterOS')
window.state('zoomed')
window.overrideredirect(True)
#Menu
can = Canvas(window, bg = '#CEE3F6', borderwidth = 0, highlightthickness = 0)
can.pack(fill = 'both', expand = True)
#Images
from PIL import Image
exitimg = Image.open('exit.png')
#Keyboard
def main_button_action():
File = open('main.txt', 'w')
File.write('True')
File.close()
def core_button_action():
File = open('core.txt', 'w')
File.write('True')
File.close()
def emergency_button_action():
File = open('emergency.txt', 'w')
File.write('True')
File.close()
def GE_button_action():
File = open('generalelectrics.txt', 'w')
File.write('True')
File.close()
main_button = Button(window, bg='#9FF781',text='RSS-Main', command=main_button_action)
main_button.place(x=100,y=100,width=300,height=100)
core_button = Button(window, bg='#BDBDBD', text='RSS-Core', command=core_button_action)
core_button.place(x=100,y=250,width=300,height=100)
emergency_button = Button(window, bg='#FA5858', text='RSS-Emergency', command=emergency_button_action)
emergency_button.place(x=100,y=400,width=300,height=100)
GE_button = Button(window, bg='#F4FA58', text='RSS-General Electrics', command=GE_button_action)
GE_button.place(x=100,y=550,width=300,height=100)
quit_button = Button(window, image=exitimg, command=window.quit)
quit_button.place(x=500,y=100,width=200,height=200)
window.mainloop()
Das wäre der Code
import time, sys
#Create the Window
window = Tk()
window.title('RavenShelterOS')
window.state('zoomed')
window.overrideredirect(True)
#Menu
can = Canvas(window, bg = '#CEE3F6', borderwidth = 0, highlightthickness = 0)
can.pack(fill = 'both', expand = True)
#Images
from PIL import Image
exitimg = Image.open('exit.png')
#Keyboard
def main_button_action():
File = open('main.txt', 'w')
File.write('True')
File.close()
def core_button_action():
File = open('core.txt', 'w')
File.write('True')
File.close()
def emergency_button_action():
File = open('emergency.txt', 'w')
File.write('True')
File.close()
def GE_button_action():
File = open('generalelectrics.txt', 'w')
File.write('True')
File.close()
main_button = Button(window, bg='#9FF781',text='RSS-Main', command=main_button_action)
main_button.place(x=100,y=100,width=300,height=100)
core_button = Button(window, bg='#BDBDBD', text='RSS-Core', command=core_button_action)
core_button.place(x=100,y=250,width=300,height=100)
emergency_button = Button(window, bg='#FA5858', text='RSS-Emergency', command=emergency_button_action)
emergency_button.place(x=100,y=400,width=300,height=100)
GE_button = Button(window, bg='#F4FA58', text='RSS-General Electrics', command=GE_button_action)
GE_button.place(x=100,y=550,width=300,height=100)
quit_button = Button(window, image=exitimg, command=window.quit)
quit_button.place(x=500,y=100,width=200,height=200)
window.mainloop()
Das wäre der Code
- __blackjack__
- User
- Beiträge: 14036
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@Contrean: Mit einem `PIL.Image` kann Tk nichts anfangen, Du musst das in einem PIL.ImageTk.PhotoImage verpacken.
Sonstige Anmerkungen: Sternchen-Importe sind Böse™. Gerade bei `tkinter` holt man sich da deutlich über 100 Namen ins Modul, von denen nur ein ganz kleiner Bruchteil tatsächlich verwendet wird.
Auf Modulebene sollte nur Code stehen, der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.
Abkürzungen vermeiden. Beispielsweise `canvas` statt `can` und `exit_image` statt `exitimg`.
Importe gehören an den Anfang des Moduls, damit man leicht sieht wo die Namen im Modul herkommen/wovon es abhängig ist. Und nichts importieren was überhaupt nicht verwendet wird.
Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).
Für Dateien solltest Du Dir mal die ``with``-Anweisung anschauen. Die Funktionen die etwas in eine Datei schreiben sind auch alle so verdammt ähnlich, das ich da letztlich nur eine für geschrieben hätte, mit dem Dateinamen als Argument.
Sonstige Anmerkungen: Sternchen-Importe sind Böse™. Gerade bei `tkinter` holt man sich da deutlich über 100 Namen ins Modul, von denen nur ein ganz kleiner Bruchteil tatsächlich verwendet wird.
Auf Modulebene sollte nur Code stehen, der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.
Abkürzungen vermeiden. Beispielsweise `canvas` statt `can` und `exit_image` statt `exitimg`.
Importe gehören an den Anfang des Moduls, damit man leicht sieht wo die Namen im Modul herkommen/wovon es abhängig ist. Und nichts importieren was überhaupt nicht verwendet wird.
Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).
Für Dateien solltest Du Dir mal die ``with``-Anweisung anschauen. Die Funktionen die etwas in eine Datei schreiben sind auch alle so verdammt ähnlich, das ich da letztlich nur eine für geschrieben hätte, mit dem Dateinamen als Argument.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
- __blackjack__
- User
- Beiträge: 14036
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@Contrean: Noch ein mehr Anmerkungen: Um Zuweisungen in Argumentlisten kommen keine Leerzeichen. Dafür aber nach Kommas.
Das `Canvas`-Objekt scheint nur für die Hintergrundfarbe da zu sein. Die kann man auch einfach auf dem `Tk`-Objekt setzen.
Nicht nur der Code der für die vier Hauptschaltflächen ausgeführt wird, sondern auch der, mit dem sie erstellt werden ist extrem ähnlich. So ähnlich, dass ich das in einer Schleife machen würde.
Ungetestet:
Das `Canvas`-Objekt scheint nur für die Hintergrundfarbe da zu sein. Die kann man auch einfach auf dem `Tk`-Objekt setzen.
Nicht nur der Code der für die vier Hauptschaltflächen ausgeführt wird, sondern auch der, mit dem sie erstellt werden ist extrem ähnlich. So ähnlich, dass ich das in einer Schleife machen würde.
Ungetestet:
Code: Alles auswählen
#!/usr/bin/env python3
import tkinter as tk
from functools import partial
from PIL import Image, ImageTk
def write_true_file(filename):
with open(filename, 'w') as file:
file.write('True\n')
def main():
window = tk.Tk()
window['background'] = '#CEE3F6'
window.title('RavenShelterOS')
window.state('zoomed')
window.overrideredirect(True)
for i, (text, color, filename) in enumerate(
[
('RSS-Main', '#9FF781', 'main.txt'),
('RSS-Core', '#BDBDBD', 'core.txt'),
('RSS-Emergency', '#FA5858', 'emergency.txt'),
('RSS-General Electrics', '#F4FA58', 'generalelectrics.txt'),
]
):
tk.Button(
window,
text=text,
bg=color,
command=partial(write_true_file, filename),
).place(x=100, y=100 + i * 150, width=300, height=100)
exit_image = ImageTk.PhotoImage(Image.open('exit.png'))
tk.Button(window, image=exit_image, command=window.quit).place(
x=500, y=100, width=200, height=200
)
window.mainloop()
if __name__ == '__main__':
main()
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.