Как настроить этот кадр с полосой прокрутки внутри черного пространства?

#python #tkinter

Вопрос:

Я хочу разместить этот кадр с полосой прокрутки(см. предоставленное изображение) в черном пространстве, присутствующем на предоставленном изображении. Как мне это сделать? Рамка должна полностью закрывать черное пространство.

Код для программы.Изображение

 from tkinter import *
from tkinter import ttk
C = Tk()
C.maxsize(1200, 750)
C.geometry("1200x750")
C.title("Mainscreen")
style = ttk.Style()
style.theme_use('clam')

BG = PhotoImage(file="Mainscreen bg.png")
ML = PhotoImage(file="Music_label.png")

BG_label = Label(C, image=BG, border=0)
BG_label.place(x=0, y=0)

style.configure("Vertical.TScrollbar", gripcount=0,
                background="Cyan", darkcolor="gray6", lightcolor="LightGreen",
                troughcolor="Turquoise4", bordercolor="gray6", arrowcolor="gray6",arrowsize=15)


wrapper1= LabelFrame(C, width="1600", height="100", background="gray6",bd=0)
mycanvas = Canvas(wrapper1,background="gray6",borderwidth=0, highlightthickness=0, width=700, height=600)
mycanvas.pack(side=LEFT, expand="false", padx=0)


yscrollbar = ttk.Scrollbar(wrapper1, orient="vertical",command=mycanvas.yview)
yscrollbar.pack(side=RIGHT, fill="y")

mycanvas.configure(yscrollcommand=yscrollbar.set)

mycanvas.bind('<Configure>',lambda e: mycanvas.configure(scrollregion=mycanvas.bbox("all")))
myframe = Frame(mycanvas)
mycanvas.create_window((0,0), window=myframe, anchor="n")

wrapper1.pack(side=RIGHT,expand="false", padx=0, pady=200)

for i in range(50):
    Button(myframe, image=ML,bg="gray6",bd=0).pack()


mainloop()
 

Редактировать:
Музыкальная метка
Главный экран bg

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

1. является ли wrapper1 тем фреймом, о котором вы говорите?

2. если оболочка 1-это рамка, то вы пробовали сделать expand = True?

3. @MatrixProgrammer да, и я пытался расширить=Правда, это не работает

4. Спасибо за ответ, вы также можете сказать, пытались ли вы развернуть = False в инструкции Y scroll pack?

5. И ваша обертка1 находится в вашем моем холсте?

Ответ №1:

Поэтому, попытавшись некоторое время понять основную проблему, я пришел к выводу, что проблема в том, что кнопка рисуется в myframe, а myframe находится за пределами mycanvas, которая содержит полосу прокрутки. Таким образом, изменив главный виджет для кнопки с myframe на mycanvas, проблема устраняется, теперь полоса прокрутки находится рядом с кнопками. НО также теперь кнопка r сдвинулась в сторону, так как при упаковке обертки 1 вы это сделали side = RIGHT , поэтому я бы также предложил вам использовать место здесь вместо упаковки , поскольку упаковка зависит от доступного пространства и ненадежна, если вы используете фон для своего графического интерфейса и хотите, чтобы кнопки находились в его части.

Я изменил следующие строки -:

 Button(mycanvas, image=ML,bg="gray6",bd=0).pack() # Changed to mycanvas from myframe
 

и

 wrapper1.place(x = {YOUR X, WHERE THE BOX STARTS}, y = {YOUR Y, WHERE THE BOX STARTS}) # Use place instead..
 

Вы также можете использовать пакет и изменить аргументы padx и pady, но будет сложно заставить его работать всегда так, как ожидалось.

Фиксированный код таков -:

 from tkinter import *
from tkinter import ttk
C = Tk()
C.maxsize(1200, 750)
C.geometry("1200x750")
C.title("Mainscreen")
style = ttk.Style()
style.theme_use('clam')

BG = PhotoImage(file="Mainscreen bg.png")
ML = PhotoImage(file="Music_label.png")

BG_label = Label(C, image=BG, border=0)
BG_label.place(x=0, y=0)

style.configure("Vertical.TScrollbar", gripcount=0,
                background="Cyan", darkcolor="gray6", lightcolor="LightGreen",
                troughcolor="Turquoise4", bordercolor="gray6", arrowcolor="gray6",arrowsize=15)


wrapper1= LabelFrame(C, width="1600", height="100", background="gray6",bd=0)
mycanvas = Canvas(wrapper1,background="gray6",borderwidth=0, highlightthickness=0, width=700, height=600)
mycanvas.pack(side=LEFT, expand=False, padx=0)


yscrollbar = ttk.Scrollbar(wrapper1, orient="vertical",command=mycanvas.yview)
yscrollbar.pack(side=RIGHT, fill="y", expand = False)

mycanvas.configure(yscrollcommand=yscrollbar.set)

mycanvas.bind('<Configure>',lambda e: mycanvas.configure(scrollregion=mycanvas.bbox("all")))
myframe = Frame(mycanvas)
mycanvas.create_window((0,0), window=myframe, anchor="n")

wrapper1.pack(expand=True, padx=0, pady=200) # Use place instead

for i in range(50):
    Button(mycanvas, image=ML,bg="gray6",bd=0).pack() # Change this to mycanvas from myframe


mainloop()
 

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

1. Большое спасибо. Это сработало совершенно нормально.

2. Никаких проблем, рад, что это может помочь.