проблема с отображением полного изображения с использованием .place() в tkinter

#python-3.x #image #tkinter #label

#python-3.x #изображение #tkinter #метка

Вопрос:

Мой код выглядит примерно так, я должен сказать, что программа, которую я пытаюсь создать, будет иметь несколько вкладок (8-10) и множество виджетов внутри них, поэтому я решил создать графический интерфейс с использованием .place(). Я пытался показать изображение, но оно не отображается полностью, я пытался использовать canvas и label, но оба показали частично изображение.

это мой код

 from tkinter import * #GUI
from tkinter import ttk #GUI
from PIL import ImageTk,Image  
root = Tk()

root.title("Example") #Title

####get resolution
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()
#### end get resolution
frame = Frame(root)
frame.pack(fill="both",expand=1) 


frame.config(width=screen_width,height=screen_height)

tabControl = ttk.Notebook(root)

tab1 = ttk.Frame(tabControl) 
tabControl.add(tab1, text='Tab 1')
tab2 = ttk.Frame(tabControl) 
tabControl.add(tab2, text='Tab 2')

tabControl.place(x=0,y=round(screen_height * .2), 
width=round(screen_width),height=round(screen_height * .9))

frame_one = LabelFrame(tab1, text="Image")
frame_one.place(x=round(screen_width * .6),y=round(screen_height * 
.01),width=round(screen_width * .3),height=round(screen_height * .3))

frame_two = LabelFrame(tab1, text="Image")
frame_two.place(x=round(screen_width * .6),y=round(screen_height * 
.35),width=round(screen_width * .3),height=round(screen_height * .3))

frame_three = LabelFrame(tab1, text="Labels, radios, checkbuttons, 
buttons")
frame_three.place(x=round(screen_width * .01),y=round(screen_height * 
.01),width=round(screen_width * .55),height=round(screen_height * 
.65))

button = Button(tab1,text="Button")
button.place(x=round(screen_width * 0.45), y=round(screen_height * 
.66))

canv = Canvas(tab1)
img = ImageTk.PhotoImage(Image.open("test.jpg"))  # PIL solution
canv.create_image(0, 0, image=img, anchor=NW)
canv.place(x=round(screen_width * .605),y=round(screen_height * 0.03), 
width=round(screen_width * .29), height=round(screen_height * .28))

canv2 = Canvas(tab1)
img2 = ImageTk.PhotoImage(Image.open("test.jpg"))  # PIL solution
canv2.create_image(0, 0, image=img2, anchor=NW)
canv2.place(x=round(screen_width * .605),y=round(screen_height * 
0.37), width=round(screen_width * .29), height=round(screen_height * 
.28))

root.mainloop() 
  

Я надеюсь, что кто-нибудь может помочь мне показать изображение полностью

Комментарии:

1. Поскольку вы ограничили размер холстов в place(...) , достаточно ли велик размер, чтобы отобразить все изображение?

2. place почти всегда создавать адаптивный пользовательский интерфейс сложнее, чем с помощью pack или grid .

3. Я знаю, что place() усложняет задачу, но у меня есть несколько виджетов, и мне нужно показывать их определенным образом, вот почему я использовал place. Проблема в том, что я не могу изменить размер изображения, потому что пользователь выберет одно и покажет его.

4. Но вы можете изменить размер загруженного изображения, чтобы оно поместилось на холсте.

5. Не могли бы вы привести мне пример? Я пытался это сделать, но не смог. Я новичок в python, это моя первая программа

Ответ №1:

Поскольку вы ограничили размер холста с помощью place(...) , размер холста может быть недостаточно большим для отображения полного изображения.

Вы можете изменить размер загруженного изображения, чтобы оно поместилось на холсте, используя PIL.Image.thumbnail() :

 canv = Canvas(frame_one) # put into LabelFrame
canv.pack(fill='both', expand=1)
canv.update() # required to get the real size of canvas
w, h = canv.winfo_width(), canv.winfo_height()
img = Image.open("test.jpg")
img.thumbnail((w, h))
img = ImageTk.PhotoImage(img)
canv.create_image(w//2, h//2, image=img, anchor=CENTER)

canv2 = Canvas(frame_two)
canv2.pack(fill='both', expand=1)
canv2.update()
w, h = canv2.winfo_width(), canv.winfo_height()
img2 = Image.open("test.jpg")
img2.thumbnail((w, h))
img2 = ImageTk.PhotoImage(img2)
canv2.create_image(w//2, h//2, image=img2, anchor=CENTER)
  

Пожалуйста, обратите внимание, что thumbnail() изменение размера изображения будет происходить только в том случае, если его размер больше, чем заданный размер функции.