14

I have a snippet which creates an OptionMenu widget.

...
options = ('White', 'Grey', 'Black', 'Red', 'Orange', 
           'Yellow', 'Green', 'Blue', 'Cyan', 'Purple')
var = StringVar()
optionmenu = OptionMenu(par, var, *options)
optionmenu.grid(column=column, row=row)
...

One problem I've encountered is every time a new option is selected, the width of the widget changes. I believe this is due to the text within the widget changing widths. How do I make the widget hold a consistent width?

nbro
  • 15,395
  • 32
  • 113
  • 196
rectangletangle
  • 50,393
  • 94
  • 205
  • 275

5 Answers5

35

To the best of my knowledge, you can use optionmenu.config(width=<YOUR_WIDTH>) as follows:

...
optionmenu = OptionMenu(par, var, *options)
optionmenu.config(width=<YOUR_WIDTH>)
optionmenu.grid(column=column, row=row)
...
nbro
  • 15,395
  • 32
  • 113
  • 196
Symon
  • 2,170
  • 4
  • 26
  • 34
17

When you use the grid command to place the widget in its parent, have the widget fill its cell (try sticky="ew")

Bryan Oakley
  • 370,779
  • 53
  • 539
  • 685
  • 3
    This does not work for me. I am using a dropdown in a frame. Yet it expands it for long options in the dropdown. – technazi Oct 31 '18 at 20:06
  • 1
    An alternate could be to find the maximum width of all widgets in that column and then set the default of the variable within the option menu to be " "*(max_width/font_size_of_option_widget). The size of the widget can be obtained using widget.update() and then widget.winfo_width() – Sharpfawkes Sep 11 '19 at 06:40
3
optionmenu.configure(width=<YOUR_WIDTH_HERE>)
nbro
  • 15,395
  • 32
  • 113
  • 196
user2155059
  • 151
  • 3
  • 14
0

I'm in the exact same boat as the OP was 12 years ago - placing dropdowns in a frame, only to discover that no solution exists for setting them to expand horizontally and fill that frame. As a result they're always resizing (and re-centering) any time a different-length option is selected. sticky='' has no effect whatsoever. width='' works, but now you're setting a fixed width that is only optimized for one resolution.

Of course the terrible solution is to use a monospace font and add spaces to the end of all the options in the dropdown. I just don't understand how there can be no real solution for this. These dropdowns look absolutely atrocious as a result.

Nathan
  • 118
  • 6
0

This can be done with

frame.columnconfigure(1, minsize=120)
optmenu = ttk.OptionMenu(frame,...)
optmenu.grid(row=1, column=1, sticky=tk.EW)

Not optimal as you have to guess the pixel width of the colume, but it works.

Here are some links, I found to be useful in coming up with this answer.

https://www.pythontutorial.net/tkinter/tkinter-grid/

Set minimum width of column in grid

https://tkdocs.com/tutorial/grid.html

toppk
  • 696
  • 4
  • 10