Сделать центр изображения точным в tkinter.ttk в python

Я создаю простое приложение, используя tkinter.ttk. Я создаю одно приложение для просмотра изображений, но при его создании у меня возникают проблемы. Вот мой код:

from tkinter import *
from tkinter.ttk import *
from PIL import Image, ImageTk

root = Tk()
root.title("Simple Image Viewer")
style = Style()


root.columnconfigure(0, weight=True)
root.rowconfigure(0, weight=True)

img1 = ImageTk.PhotoImage(Image.open("images/img_1.jpg"))
img2 = ImageTk.PhotoImage(Image.open("images/img_2.jpg"))
img3 = ImageTk.PhotoImage(Image.open("images/img_3.jpg"))

images = [img1, img2, img3]
img_idx = 0


def previous_image():
    global lbl_img
    global images
    global img_idx
    img_idx = img_idx - 1
    if img_idx < 0:
        img_idx = len(images) - 1
    try:
        lbl_img.configure(image=images[img_idx])
    except IndexError:
        img_idx = -1
        lbl_img.configure(image=images[img_idx])
    finally:
        status.configure(text=f"{img_idx + 1} of {len(images)} images.")


btn_back = Button(text="<", command=previous_image)


def forward_image():
    global lbl_img
    global images
    global img_idx
    img_idx = img_idx + 1
    try:
        lbl_img.configure(image=images[img_idx])
    except IndexError:
        img_idx = 0
        lbl_img.configure(image=images[img_idx])
    finally:
        status.configure(text=f"{img_idx + 1} of {len(images)} images.")


btn_forward = Button(text=">", command=forward_image)

lbl_img = Label(image=images[img_idx])

status = Label(root, text=f"{img_idx + 1} of {len(images)} images.", borderwidth=1,
               relief=SUNKEN, anchor="e")
status.grid(row=2, column=0, columnspan=3, stick=W+E)

btn_exit = Button(text="Exit", command=root.quit)
btn_back.grid(row=0, column=0, stick=W)
lbl_img.grid(row=0, column=1)
btn_forward.grid(row=0, column=2, stick=E)
btn_exit.grid(row=1, column=1)

root.mainloop()

Когда я запускаю это, это выглядит так: В маленьком окне

И когда я увеличиваю его: В максимальном размере Это происходит примерно так. На картинке выше вы можете видеть, что изображение не соответствует центру. Мои фотографии должны быть точно по центру как в маленьком, так и в большом окне. Пожалуйста, помогите мне в этом, посмотрев мою программу.

заранее спасибо


person Binamra    schedule 08.08.2020    source источник
comment
Вам просто нужно изменить root.columnconfigure(0, weight=True) на root.columnconfigure(1, weight=1).   -  person acw1668    schedule 08.08.2020


Ответы (3)


Вы можете добиться этого с помощью сетки, вам нужно убедиться, что слева и справа есть место, а также вверх и вниз, но в середине не остается места. В качестве примера:

import tkinter as tk

root = tk.Tk()

up = tk.Frame(root)
up.grid(column=0, row=0,columnspan=3,sticky='n')
s1 = tk.Label(up, text='spacer')
s1.pack()

left = tk.Frame(root)
b1 = tk.Button(left, text='B1')
left.grid(column=0,row=1,sticky='w')
b1.pack()

middle = tk.Frame(root)
middle.grid(column=1, row=1)
s2 = tk.Label(middle, text='spacer')
s2.pack()

down = tk.Frame(root)
qb = tk.Button(down, text='Exit', command= root.destroy)
down.grid(column=0, row=2,columnspan=3,sticky='s')
qb.pack()

right = tk.Frame(root)
right.grid(column=2,row=1,sticky='e')
b2 = tk.Button(right, text='B2')
b2.pack()

root.columnconfigure(0,weight=1) #left get space
root.columnconfigure(2,weight=1) #right get space

root.rowconfigure(0, weight=1) #up get space
root.rowconfigure(2, weight=1) #down get space

root.mainloop()

Наша производительность:  введите описание изображения здесь

Для получения подробной информации значение веса.

person Atlas435    schedule 08.08.2020
comment
Все это должно иметь рамку посередине, окруженную рамками, которые растягиваются. - person Atlas435; 08.08.2020

Я думаю, есть два решения, которые вы можете сделать для этого.

  1. Когда вы показываете свое изображение в программе, вы можете сделать ..._ 1_, чтобы убедиться, что изображение установлено и всегда находится в центре программы.

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

  1. Другое решение, которое, вероятно, решит вашу проблему, - это определить, хотите ли вы, чтобы ваша программа была полноэкранной. Если вы хотите, чтобы ваша программа оставалась в красивом маленьком окне, как в вашей первой ссылке, вы можете запретить пользователю изменять размер окна. Когда вы увеличиваете окно, вы не меняете размер изображения по мере того, как окно становится больше, поэтому я уверен, что это нормально. В начале вашей программы после определения root ... root.resizable(0, 0). Это предотвратит изменение размера окна пользователем.
person Kevin Apetrei    schedule 08.08.2020
comment
Без проблем. Если вы не намерены максимизировать свою программу, то решение 2 будет работать нормально, я почти уверен. - person Kevin Apetrei; 08.08.2020
comment
Если вы хотите, чтобы изображение изменилось при максимальном увеличении, попробуйте поискать, как масштабировать изображения в tkinter. Я нашел несколько ссылок, которые, как мне кажется, могут помочь ... pythonprogramming.altervista.org/ и codegrepper.com/code-examples/delphi/ - person Kevin Apetrei; 08.08.2020

Я реализовал то, что вы сказали, но кнопки для меня не идеальны. Я хочу разместить кнопки на этикетке, я не хочу, чтобы они были сбоку. Возможно ли?

import tkinter as tk

    
root = tk.Tk()
image_list = getfiles()

up = tk.Frame(root)
up.grid(column=0, row=0,columnspan=3,sticky='n')
s1 = tk.Label(up, text='spacer')
s1.pack()

left = tk.Frame(root)
b1 = tk.Button(left, text='B1')
left.grid(column=0,row=1,sticky='w')
b1.pack()

middle = tk.Frame(root)
middle.grid(column=1, row=1)
s2 = tk.Label(middle, text='spacer')
image = Image.open(image_list[current])
photo = ImageTk.PhotoImage(image)
s2['image'] = photo
s2.photo = photo
s2.pack()

down = tk.Frame(root)
qb = tk.Button(down, text='Exit', command= root.destroy)
down.grid(column=0, row=2,columnspan=3,sticky='s')
qb.pack()

right = tk.Frame(root)
right.grid(column=2,row=1,sticky='e')
b2 = tk.Button(right, text='B2')
b2.pack()

root.columnconfigure(0,weight=1) #left get space
root.columnconfigure(2,weight=1) #right get space

root.rowconfigure(0, weight=1) #up get space
root.rowconfigure(2, weight=1) #down get space

root.mainloop()

Чтобы поместить кнопку в то же место, что и изображение, вам нужно место ()

label = Tkinter.Label(root, compound=Tkinter.TOP)
label.pack()

A=Tkinter.Button(root, text='Previous picture', command=lambda: move(-1))
A.place(relx=0, x=2, y=20,width=130,height=100)
B=Tkinter.Button(root, text='Next picture', command=lambda: move(+1))
B.place(relx=0, x=135, y=20,width=130,height=100)
C=Tkinter.Button(root, text='PRINT', command=root.quit)
C.place(relx=1, x=-130, y=20,width=130,height=100)

move(0)
root.update()
root.mainloop()

person virtualsets    schedule 15.08.2020
comment
Я не понимаю, что вы сказали. Но это работает. Я это тестировал. - person Binamra; 16.08.2020
comment
Спокойной ночи, хочу кнопки сверху лейбла поставить, сбоку не хочу. это возможно? - person virtualsets; 16.08.2020
comment
Вы хотите добавить кнопку над этикеткой-разделителем, тогда вы можете добавить одну кнопку в верхнюю рамку и упаковать ее перед этикеткой - person Binamra; 16.08.2020
comment
Я поставил решение ... должно быть место () - person virtualsets; 16.08.2020