Tkinter-Spinbox看起来比预期的更长

时间:2019-01-14 13:56:44

标签: python python-3.x macos tkinter

正在macOS Mojave上从python.org下载的正在运行的Python3.7。

我使用以下代码将SpinboxScale对齐以控制相同的变量。但是,外观不是我所期望的:

import tkinter as tk

root = tk.Tk()
mainframe = tk.Frame(root)

# Model

input = tk.DoubleVar(value=0.)
# input = tk.IntVar(value=0)
spin = tk.Spinbox(mainframe, textvariable=input, wrap=True)
slide = tk.Scale(mainframe, variable=input, orient='horizontal')
spin['to'] = 1.0
spin['from'] = 0.0
spin['increment'] = 0.01
slide['to'] = 1.0
slide['from'] = 0.0

# spin['to'] = 100
# spin['from'] = 0
# spin['increment'] = 1
# slide['to'] = 100
# slide['from'] = 0

# Layout

weights = {'spin': 1, 'slide': 1000}

mainframe.grid_rowconfigure(0, weight=1)
mainframe.grid_columnconfigure(0, weight=weights['spin'])
mainframe.grid_columnconfigure(1, weight=weights['slide'])
spin.grid(row=0, column=0, sticky='news')
slide.grid(row=0, column=1, sticky='news')

root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)
mainframe.grid(row=0, column=0)

root.mainloop()

我希望ScaleSpinbox占用更多的空间,但是事实恰恰相反。

Result

我曾经以为这可能是因为我使用DoubleVar时,由于十进制问题,字符串可能会变长,但是IntVar却得到了相同的结果。请参见已注释掉的代码块。

怎么了?在这种情况下,我应该如何得到短Spinbox和长Scale?这是macOS专用的,操作系统在小部件上加上一些最小尺寸吗?

2 个答案:

答案 0 :(得分:2)

您可以设置Spinbox的宽度。例如:

spin = tk.Spinbox(mainframe, textvariable=input, wrap=True, width=5)

答案 1 :(得分:2)

某些tkinter小部件的某些属性具有默认值。

  

除非指定,否则Spinbox的默认宽度为 20 (以个字符单位为单位)。

     

除非指定,否则Scale的默认长度为 100 (以像素为单位)。

因此,这就是为什么Spinbox太大而Scale相对较小的原因。

要解决此问题,您可以按照以下说明自行指定:

spin = tk.Spinbox(mainframe, textvariable=input, wrap=True, width=1)
slide = tk.Scale(mainframe, variable=input, orient='horizontal', length=200)

Result