Полоса прокрутки не прокручивает виджеты внутри рамки, которая находится внутри холста - PullRequest
0 голосов
/ 10 июля 2019

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

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

from tkinter import *
from tkinter.ttk import *
actor_number=0
global tk 





def new_actor_button_command():
  global menu_frame
  global actor_number
  global canvas

  new_actor_frame=Frame(menu_frame,width=500,height=200)
  new_actor_frame.grid(row=1+actor_number,column=0,pady=20)
  actor_name_label=Label(new_actor_frame,text="Actor Name")
  new_actor_frame.place(relx=0.0, rely=0.0, anchor=CENTER)

  delete_actor_button=Button(new_actor_frame,text="Delete
                             Actor",command=delete_actor_button_command)
  new_actor_frame.grid(row=1+actor_number,column=1)

  actor_name_label.grid(row=2+actor_number,column=1)
  delete_actor_button.grid(row=2+actor_number,column=2)
  actor_number+=1
  canvas.update_idletasks()

  scrollbar.config(command=canvas.yview)
  canvas.configure(scrollregion=canvas.bbox("all"))



def make_new_actor():
  global canvas
  global menu_frame
  new_actor_button=Button(menu_frame,text="Add New
                          Actor",command=new_actor_button_command)
  new_actor_button.grid(row=0,column=0)


def new_command():
  global actor_number
  actor_number=0
  make_new_actor()
tk=Tk()

tk.geometry("1200x800")
menubar=Menu(tk)

filemenu=Menu(menubar,tearoff=0)
filemenu.config(font=("Verdana",16))
filemenu.add_command(label="New",font=("Verdana",16),command=new_command)
menubar.add_cascade(label="File", menu=filemenu)

global scrollbar
canvas=Canvas(tk,width=1000,height=1000)
scrollbar=Scrollbar(tk,orient="vertical",command = canvas.yview)

menu_frame=Frame(canvas,width=1000,height=1000)
canvas.create_window(0,0,window=menu_frame)

canvas.configure(yscrollcommand=scrollbar.set)
canvas.configure(scrollregion=canvas.bbox("all"))
canvas.place(relx=0.0, rely=0.0)
menu_frame.pack(side=LEFT,expand=True)
scrollbar.pack(side=RIGHT,fill=Y)
tk.config(menu=menubar)
tk.mainloop()

Следует прокрутить виджеты внутри "menu_frame".

1 Ответ

0 голосов
/ 13 июля 2019

Прокрутка Canvas - это не просто.

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

from tkinter import *
from tkinter.ttk import *

def new_actor_button_command():
    new_actor_frame = Frame(menu_frame, width=500, height=200)
    new_actor_frame.grid(row=actor_number, column=0)

    actor_name_label = Label(new_actor_frame, text="Actor Name")
    actor_name_label.grid(row=0, column=1)

    delete_actor_button=Button(new_actor_frame,text="Delete Actor")#, command=delete_actor_button_command)
    delete_actor_button.grid(row=0, column=2)

def new_command():
    global actor_number

    actor_number += 1

    new_actor_button = Button(menu_frame, text="Add New Actor", command=new_actor_button_command)
    new_actor_button.grid(row=actor_number, column=0)

def update_canvas(event=None):
    canvas.configure(scrollregion=canvas.bbox("all"))

actor_number=0

tk = Tk()
tk.geometry("1200x800")

menubar = Menu(tk)
filemenu = Menu(menubar, tearoff=0)
filemenu.add_command(label="New", command=new_command)
menubar.add_cascade(label="File", menu=filemenu)
tk.config(menu=menubar)

canvas = Canvas(tk, background='white')#, width=1000, height=1000)
canvas.pack(side='left', fill='both', expand=True)

scrollbar = Scrollbar(tk, orient="vertical", command=canvas.yview)
scrollbar.pack(side='right', fill='y')

menu_frame = Frame(canvas)
canvas.create_window(0, 0, window=menu_frame, anchor='nw')

canvas.configure(yscrollcommand=scrollbar.set)
canvas.bind('<Configure>', update_canvas) # update when change size

tk.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...