ich habe ein kleines Problem mit dem Anzeigen von einem Bild in einem Canvas bei Tkinter. Generell bin ich ziemlich neu bei Tkinter und habe generell wenig praktische Erfahrung mit GUI-Programmierung, was man wahrscheinlich auch am Code sehen wird.
Kurz zum Programm, bei dem es generell ersteinmal um eine einfache Kontrastoptimierung geht. Ich will eine Bitmap (Grauwerte) einlesen die unbegrenzte (theoretisch, praktisch 16Bit) Werte annehmen kann, dann mithilfe von zwei Schiebereglern den minimalen und maximalen Wert definieren, zwischen denen dann linear auf 8bit umgewandelt wird und alle anderen Werte auf die beiden Randwerte gesetzt werden.
Das hab ich so weit auch alles hinbekommen und mein Testbild wird am Anfang auch richtig angezeigt, doch sobald ich meine Schieberegler verwende, verschwindet das Bild und es wird gar nichts mehr angezeigt.
Wenn ich jetzt aber in meiner Funktion update_image_contrast() die auskommentierte Zeile dazunehme, funktioniert alles so wie ich es haben will, es treten bloß immer AttributeError auf.
Hat jemand eine Idee woran das liegt und wie man das Programm umschreiben kann dass nicht die ganze Zeit AttributeError auftritt?
Code: Alles auswählen
import cv2
import tkinter as tk
import numpy as np
from tkinter import ttk
from PIL import Image, ImageTk
def get_current_max_value():
return int(current_value_max.get())
def get_current_min_value():
return int(current_value_min.get())
def rescale_img(image, definedMin, definedMax):
image = (255.0/(float(definedMax) - float(definedMin))) * np.subtract(image, definedMin)
image[image < 0.0] = 0.0
image[image > 255.0] = 255.0
return image
def update_image_contrast(max_value, min_value, from_min = True):
if from_min and min_value > max_value:
slider_max.set(min_value)
if not(from_min) and max_value < min_value:
slider_min.set(max_value)
var_array = rescale_img(np.copy(test_array), min_value - 0.1, max_value)
var_img = ImageTk.PhotoImage(image=Image.fromarray(var_array), master=Canvas_Frame)
canvas.itemconfig(img_on_canvas, image = var_img)
#Canvas_Frame.itemconfig(width=canvas_width, height=canvas_height)
def slider_max_changed(event):
input_max.delete(0,tk.END)
input_max.insert(0,str(get_current_max_value()))
update_image_contrast(get_current_max_value(), get_current_min_value(), from_min = False)
def slider_min_changed(event):
input_min.delete(0,tk.END)
input_min.insert(0,str(get_current_min_value()))
update_image_contrast(get_current_max_value(), get_current_min_value(), from_min = True)
window_app = tk.Tk()
window_app.title("Test Anordnung")
window_app.resizable(0,0)
# BMP size
current_value_max = tk.DoubleVar()
current_value_min = tk.DoubleVar()
# Canvas Frame
canvas_width = 975
canvas_height = 643
Canvas_Frame = tk.Frame(window_app, width=canvas_width, height=canvas_height, bg="white")
Canvas_Frame.grid(row=0, column=0)
# load testpicture
test_array = cv2.imread("./test_01.bmp", -1)
max_img_return = np.max(test_array)
min_img_return = np.min(test_array)
# canvas
canvas = tk.Canvas(Canvas_Frame, width=canvas_width, height=canvas_height)
test_img = ImageTk.PhotoImage(image=Image.fromarray(test_array), master=Canvas_Frame)
img_on_canvas = canvas.create_image((canvas_width / 2, canvas_height / 2), image=test_img)
canvas.pack(fill=tk.BOTH, expand=True)
# Configuration Frame
Config_Frame = tk.Frame(window_app, width=300)
Config_Frame.grid(row=0, column=1)
#### max widgets #############################################################
# slider label max
slider_max_label = ttk.Label(Config_Frame, text='Maximum:')
slider_max_label.grid(row=0,column=0, sticky='ne')
# input max
input_max = tk.Entry(Config_Frame, bd=5, width=10, justify="right")
input_max.grid(row=0,column=2,sticky='n')
input_max.insert(0,str(max_img_return))
# slider max
slider_max = ttk.Scale(Config_Frame, from_=min_img_return, to=max_img_return, orient='horizontal',
command=slider_max_changed, variable=current_value_max)
slider_max.grid(row=0,column=1, sticky='ne')
#slider_max.set(max_img_return)
#### min widgets #############################################################
# slider label min
slider_min_label = ttk.Label(Config_Frame, text='Minium:')
slider_min_label.grid(row=1,column=0, sticky='ne')
# input min
input_min = tk.Entry(Config_Frame, bd=5, width=10, justify="right")
input_min.grid(row=1,column=2,sticky='n')
input_min.insert(0,str(min_img_return))
# slider min
slider_min = ttk.Scale(Config_Frame, from_=min_img_return, to=max_img_return, orient='horizontal',
command=slider_min_changed, variable=current_value_min)
slider_min.grid(row=1,column=1, sticky='ne')
#slider_min.set(min_img_return)
window_app.mainloop()