#python-3.x #tkinter
#python-3.x #tkinter
Вопрос:
Я создаю таблицу, используя python для своего назначения, но горизонтальная полоса прокрутки не работает должным образом, а вертикальная полоса прокрутки находится не в соответствующем положении.
Я уже создал таблицу n на m на python с горизонтальной и вертикальной полосами прокрутки. Вертикальная полоса прокрутки работает правильно, а горизонтальная — нет. В таблице отображаются только 5 столбцов и 7 строк, остальные столбцы и строки можно просмотреть с помощью прокрутки.
Моя проблема в том, что горизонтальная полоса прокрутки простирается до последнего столбца. Допустим, есть 10 столбцов, только 5 из них должны отображаться первыми, но горизонталь продолжается до последнего столбца. Более того, вертикальная полоса прокрутки находится не в соответствующем положении.
Приведенный ниже код является примером.
# Create the Frame canvas
root = Tk()
frame_canvas = Frame(root)
frame_canvas.grid( row=2, column=2, pady=(5, 0), sticky='nw' )
frame_canvas.grid_rowconfigure( 0, weight=1 )
frame_canvas.grid_columnconfigure( 0, weight=1 )
frame_canvas.grid_propagate( False )
# Add a canvas in the frame
canvas = Canvas( frame_canvas)
# Link the scrollbars to the canvas
vsb = Scrollbar( frame_canvas, orient="vertical", command=canvas.yview )
canvas.configure( yscrollcommand=vsb.set )
vsb.grid( row=0, column=2, sticky='ns' )
hsb = Scrollbar(frame_canvas, orient="horizontal", command=canvas.xview())
hsb.grid(row=1, column=2, sticky='we')
canvas.configure( xscrollcommand=hsb.set )
canvas.grid( row=0, column=2, padx=(5, 5), sticky="news" )
# Create a frame to contain the cells of the table
frame_buttons = Frame(canvas)
canvas.create_window( (0, 0), window=frame_buttons, anchor='nw' )
# Add the contents to the table
header = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']
prod_rows = 15
prod_col = len(header)
entries = [[Label() for j in xrange( prod_col )] for i in xrange( prod_rows )]
for i in range( 0, prod_rows ):
if i == 0:
for j in range( 0, prod_col ):
entries[i][j] = Label(canvas, text=header[j], width=10 )
entries[i][j].grid( row=i, column=j, sticky='news' )
else:
for j in range( 0, prod_col ):
entries[i][j] = Label( frame_buttons, text=" ", relief="groove", width=10) # ("%d,%d" % (i 1, j 1))
entries[i][j].grid( row=i, column=j, sticky='news' )
# Update cell frames idle tasks to let tkinter calculate buttons sizes
frame_buttons.update_idletasks()
# Resize the canvas frame to show exactly a 5 by 7 table
columns_width = sum( [entries[0][j].winfo_width() for j in range( 0, 5)] )
rows_height = sum( [entries[i][0].winfo_height() for i in range( 0, 8 )] )
frame_canvas.config( width=columns_width,
height=rows_height) #
vsb.winfo_width()
# Set the canvas scrolling region
canvas.config(scrollregion=canvas.bbox( "all" ) )
root.mainloop()
это изображение вывода приведенного выше кода
Полосы прокрутки должны строго находиться в указанном углу.
Ответ №1:
Для vsb:
- Она должна быть прикреплена к крайней правой части столбца, т. Е. используйте sticky = «nse»; или добавьте другой столбец в «frame_canvas»
- Если вышеуказанное не работает, используйте опцию «rowspan» для vsb
Для hsb:
- Удалите круглые скобки после canvas.xview
- Также используйте sticky = «swe»