Прокручиваемое окно верхнего уровня (tkinter)

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

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

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

Вот моя функция, которая открывает всплывающее окно:


person Mike Rose    schedule 28.02.2017    source источник
comment
пожалуйста, добавьте tkinter в свой заголовок и отметьте его   -  person abccd    schedule 28.02.2017
comment
Не могли бы вы предоставить простой рабочий код, а не только функцию? Это упростит вам помощь.   -  person Sun Bear    schedule 09.03.2017


Ответы (1)


Вам понадобятся методы .rowconfigure() и .columnconfigure(), чтобы получить то, что вы хотите, учитывая, что вы используете систему сеток для компоновки своих виджетов.

Чтобы помочь вам в дальнейшем, я закомментировал часть ваших кодов. Хотя ваш код отображал изображение, это неправильный способ создания изображения на холсте. Ваше изображение было создано в рамке, расположенной поверх холста. Таким образом, вы также не сможете прокручивать изображение, хотя вы можете видеть изображение и полосу прокрутки. Вместо этого используйте правильный код, который я вам дал.

Последний комментарий. Научитесь предоставлять упрощенный полный код в будущем, чтобы вы могли быстрее привлекать помощь. Вы можете узнать больше о mcve здесь.

from tkinter import *

class App(Frame):
    def __init__(self, parent, *args, **kwargs):
        Frame.__init__(self, parent, *args, **kwargs)
        header = "Toplevel"
        pfad = "NYCGifathon24-3.png" # change this to your image name
        source = "Canvas Image"
        self.karte(pfad,header,source)

    def karte(self, pfad,header,source): #added 'self' 
        popup = Toplevel()
        popup.title(header)

        ksbar=Scrollbar(popup, orient=VERTICAL)
        ksbar.grid(row=0, column=1, sticky="ns")

        popCanv = Canvas(popup, width=600, height = 800,
                         scrollregion=(0,0,500,800)) #width=1256, height = 1674)
        popCanv.grid(row=0, column=0, sticky="nsew") #added sticky

        ksbar.config(command=popCanv.yview)
        popCanv.config(yscrollcommand = ksbar.set)

        ## Commented codes are inappropriate.
        ## Wrong way to create an image in Canvas.
        ## Your scrollbars will not be able to scroll the image either
        #kframe=Frame(popCanv, width=600, height = 800) 
        #kframe.grid(row=0, column=0)
        #img = PhotoImage(master=kframe, file=pfad)
        #imglabel = Label(kframe, image = img)
        #imglabel.image = img
        #imglabel.grid()
        self.img = PhotoImage(file=pfad) #amended
        image = popCanv.create_image(300, 400, image=self.img) #correct way of adding an image to canvas
        popCanv.create_text(420,790,text=source)

        popup.rowconfigure(0, weight=1) #added (answer to your question)
        popup.columnconfigure(0, weight=1) #added (answer to your question)

        #popup.mainloop()

if __name__ == "__main__":
    root = Tk()
    app = App(root)
    root.mainloop()
person Sun Bear    schedule 12.03.2017