tkinter: полоса прокрутки не работает на холсте - PullRequest
0 голосов
/ 09 января 2020

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

Я также пытался использовать bbox («все») для установки области прокрутки для холста, но это тоже не сработало. Использование рамки тоже не сработало. В некоторых подобных вопросах я видел, что размещение должно быть определенным образом, но я не понимал, как это сделать, или даже если мой код не работает из-за этого. Я сделал виджеты, как указано на холсте. Я видел, что во многих местах то же самое было сделано с помощью команды canvas.create_window, но я не совсем понимал, как это использовать, и без этого все работало нормально, поэтому я не стал беспокоиться.

Я использовал метку , запись, радио-кнопка, опция и кнопка на холсте. Вот как я использовал bbox («все»), который у меня тоже не работал и в итоге отключил полосу прокрутки. Я сделал это как можно короче.

    from tkinter import *
    w = Tk()
    w.geometry('650x640')

    state=StringVar()

    c=Canvas(w,bg="gray94",height=750,width=650)
    c.config(scrollregion=c.bbox("all"))
    c.pack(expand=YES,fill=BOTH)

    scr=Scrollbar(c)
    scr.pack(side=RIGHT,fill=Y)

    c.config(yscrollcommand=scr.set)
    scr.config(command=c.yview)

    #widgets
    Button(c, text="Back").place(x=100,y=200)
    Label(c, text="Registration form",width=20,font=("bold",      
    20)).place(x=160,y=750)
    Label(c, text="State",width=20,font=("bold", 10)).place(x=149,y=390)
    l2 = ['KA','NY']
    dl2=OptionMenu(w,state, *l2)
    dl2.place(x=310,y=390)
    Button(c, text='Submit',width=20).place(x=240,y=690)

    w.mainloop()

И вот как это выглядело для исполнения для меня.

tkinterwindow

И если я использовал координаты для области прокрутки. Я могу прокрутить вниз, как показано, но я все еще не вижу метку при y = 750

без коробки

Я использую python 3.6.8. Это мой первый вопрос, я прошу прощения за любые ошибки и, пожалуйста, скажите мне, если какая-либо информация отсутствует, или я должен обновить вопрос с моим полным кодом. Спасибо:)

1 Ответ

0 голосов
/ 09 января 2020

Холст будет прокручивать только те объекты, которые являются объектами холста. Вы добавляете кнопки и метки с place, что означает, что они , а не объекты холста. Чтобы добавить их на холст, чтобы они прокручивались, вы должны использовать c.create_window(...)

Когда вы конфигурируете scrollregion с c.bbox("all"), возвращаемое ограничивающее поле равно None, потому что оно не видит никаких элементов на холсте. Таким образом, полосы прокрутки становятся отключенными.

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

Вот ваш код, измененный использовать create_window. Я изменил размер главного окна, чтобы показать, что полосы прокрутки работают.

from tkinter import *
w = Tk()
w.geometry('650x400')

state=StringVar()

c=Canvas(w,bg="gray94",height=750,width=650)
c.config(scrollregion=c.bbox("all"))
c.pack(expand=YES,fill=BOTH)

scr=Scrollbar(c)
scr.pack(side=RIGHT,fill=Y)

c.config(yscrollcommand=scr.set)
scr.config(command=c.yview)

l2 = ['KA', 'NY']

#widgets
button1 = Button(c, text="Back")
label1 = Label(c, text="Registration form", width=20, font=("bold", 20))
label2 = Label(c, text="State", width=20, font=("bold", 10))
dl2 = OptionMenu(w, state, *l2)
button2 = Button(c, text='Submit', width=20)

c.create_window(100, 200, window=button1)
c.create_window(160, 750, window=label1)
c.create_window(310, 390, window=dl2)
c.create_window(149, 390, window=label2)
c.create_window(240, 690, window=button2)

c.configure(scrollregio=c.bbox("all"))

w.mainloop()
...